<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Design Overview on 設計で、迷わなくなるために | 奥田智紘</title><link>https://design.okuda-studio.com/tags/design-overview/</link><description>Recent content in Design Overview on 設計で、迷わなくなるために | 奥田智紘</description><generator>Hugo -- 0.164.0</generator><language>ja</language><lastBuildDate>Wed, 10 Jun 2026 17:00:00 +0900</lastBuildDate><atom:link href="https://design.okuda-studio.com/tags/design-overview/index.xml" rel="self" type="application/rss+xml"/><item><title>ソフトウェア設計をしていたら仕様の違和感に気が付いた話</title><link>https://design.okuda-studio.com/posts/0030-design-corrects-specifications/</link><pubDate>Wed, 10 Jun 2026 17:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0030-design-corrects-specifications/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%81%95%E5%92%8C%E6%84%9F%E3%81%AE%E3%81%82%E3%82%8B%E4%BB%95%E6%A7%98"&gt;違和感のある仕様&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%81%95%E5%92%8C%E6%84%9F%E3%81%AE%E3%81%82%E3%82%8B%E4%BB%95%E6%A7%98%E9%80%9A%E3%82%8A%E3%81%AB%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88"&gt;違和感のある仕様通りに実装した場合&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8F%BE%E6%99%82%E7%82%B9%E3%81%AE%E5%8B%95%E4%BD%9C%E3%81%8C%E5%90%8C%E3%81%98%E3%81%AA%E3%82%89%E5%89%8D%E8%80%85%E3%81%A7%E3%82%82%E5%BE%8C%E8%80%85%E3%81%A7%E3%82%82%E3%81%84%E3%81%84%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%8B"&gt;現時点の動作が同じなら、前者でも後者でもいいのではないか？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A7%A3%E6%B1%BA%E7%AD%96"&gt;解決策&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;ソフトウェア設計をしていたら、仕様の違和感に気が付いて、仕様を変更した話を書きたいと思います。&lt;/p&gt;
&lt;h2 id="違和感のある仕様"&gt;違和感のある仕様&lt;/h2&gt;
&lt;p&gt;ある画面 C は、画面 A と画面 B という二つの画面から遷移可能な画面でした。&lt;/p&gt;
&lt;p&gt;画面 C には、戻るボタンがありました。&lt;/p&gt;
&lt;p&gt;戻るボタンをタップすると、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「画面 A から遷移した場合は A に戻り、画面 B から遷移した場合は B に戻る」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という仕様でした。&lt;/p&gt;
&lt;p&gt;この、何の変哲もない普通の仕様に、実は違和感が潜んでいました。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;【補足】
今回の話は、非常に些細な点をとりあげます。
そのため、この話で出てくる例自体は、実際にはほぼ無害です。
しかし、簡単な例だからこそ、
どのようにソフトウェアが壊れていくのかを
誰が読んでもわかる例になっています。
それを知るきっかけとなるように、この記事を残します。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="違和感のある仕様通りに実装した場合"&gt;違和感のある仕様通りに実装した場合&lt;/h2&gt;
&lt;p&gt;Android で画面遷移を実装する場合は、 Navigation Component というライブラリを使用することが一般的です。&lt;/p&gt;
&lt;p&gt;Navigation には、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一つ前の画面に戻る&lt;/strong&gt; 場合には、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;NavController.navigateUp()&lt;/code&gt; という関数が使えます。&lt;/p&gt;
&lt;p&gt;一方で、 &lt;strong&gt;指定した画面まで戻る&lt;/strong&gt; 場合には、&lt;/p&gt;
&lt;p&gt;&lt;code&gt;NavController.popBackStack(route = /* 戻りたい画面 */, inclusive = false)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;という関数が使えます。&lt;/p&gt;
&lt;p&gt;仕様では、「画面 A から遷移した場合は A に戻り&amp;hellip;」とあるので、後者の関数を使って実装します。&lt;/p&gt;
&lt;p&gt;前者の関数を使用して実装しても、現時点では同じ動作になりますが、将来的には同じとは限りません。&lt;/p&gt;
&lt;p&gt;例えば、 A -&amp;gt; D -&amp;gt; C という画面遷移になった場合には、&lt;/p&gt;</description></item><item><title>演繹（えんえき）法から考える設計の本質</title><link>https://design.okuda-studio.com/posts/0029-deduction-and-design/</link><pubDate>Wed, 10 Jun 2026 15:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0029-deduction-and-design/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%BC%94%E7%B9%B9%E6%B3%95%E3%81%A8%E3%81%AF"&gt;演繹法とは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%A7%81%E3%81%9F%E3%81%A1%E3%81%AF%E6%97%A5%E5%B8%B8%E7%9A%84%E3%81%AB%E6%BC%94%E7%B9%B9%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B"&gt;私たちは日常的に演繹している&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%95%8F%E9%A1%8C%E3%81%AF%E5%89%8D%E6%8F%90%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%AA%E3%81%A8%E3%81%8D%E3%81%AB%E8%B5%B7%E3%81%93%E3%82%8B"&gt;問題は前提が曖昧なときに起こる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B"&gt;設計とは何をしているのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%BC%94%E7%B9%B9%E6%B3%95%E3%81%A8%E8%A8%AD%E8%A8%88%E3%81%AE%E9%96%A2%E4%BF%82"&gt;演繹法と設計の関係&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;ソフトウェア設計について考えていると、「演繹法」という言葉に出会うことがあります。&lt;/p&gt;
&lt;p&gt;しかし、演繹法と聞くと何か特別な思考法のように感じるかもしれません。&lt;/p&gt;
&lt;p&gt;私自身、演繹法について改めて考えてみた結果、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「普段当たり前にやっていることに名前が付いているだけではないか？」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;と感じました。&lt;/p&gt;
&lt;p&gt;この記事では、演繹法とソフトウェア設計の関係について考えてみます。&lt;/p&gt;
&lt;h2 id="演繹法とは"&gt;演繹法とは&lt;/h2&gt;
&lt;p&gt;演繹法とは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一般的なルール（前提）から、個別の結論を導く考え方&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;有名な例として、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人間はみな死ぬ&lt;/li&gt;
&lt;li&gt;ソクラテスは人間である&lt;/li&gt;
&lt;li&gt;したがってソクラテスは死ぬ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というものがあります。&lt;/p&gt;
&lt;p&gt;重要なのは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;前提が正しければ、結論も正しい&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という点です。&lt;/p&gt;
&lt;h2 id="私たちは日常的に演繹している"&gt;私たちは日常的に演繹している&lt;/h2&gt;
&lt;p&gt;実はソフトウェア開発者は、日常的に演繹法を使っています。&lt;/p&gt;
&lt;p&gt;例えば、次のようなインターフェースがあったとします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PaymentRepository&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;suspend&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;save&lt;/span&gt;(payment: Payment)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードを見たとき、多くの開発者は自然に次のように考えるはずです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;save は保存処理である&lt;/li&gt;
&lt;li&gt;保存したデータは後で取得できるはず&lt;/li&gt;
&lt;li&gt;保存したデータが勝手に壊れてはいけないはず&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これはすべて、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;save は保存する
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;だから○○であるべき
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;という演繹です。&lt;/p&gt;
&lt;p&gt;特別なことをしているわけではありません。&lt;/p&gt;
&lt;p&gt;普段の設計レビューやコードレビューで当たり前に行っている思考です。&lt;/p&gt;
&lt;h2 id="問題は前提が曖昧なときに起こる"&gt;問題は前提が曖昧なときに起こる&lt;/h2&gt;
&lt;p&gt;ただし、演繹法には重要なポイントがあります。&lt;/p&gt;
&lt;p&gt;それは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;前提が明確であること&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;例えば、次のようなインターフェースを考えます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PaymentRepository&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;suspend&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;delete&lt;/span&gt;(id: Int)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを見た多くの人は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;delete は削除処理である&lt;/li&gt;
&lt;li&gt;削除したデータは取得できなくなるはず&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;と考えるでしょう。&lt;/p&gt;
&lt;p&gt;しかし、実際には仕様として、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;論理削除を行う
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というルールが存在するかもしれません。&lt;/p&gt;
&lt;p&gt;この場合、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;delete は物理削除である&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という前提を、利用者側が勝手に補っていたことになります。&lt;/p&gt;
&lt;p&gt;つまり、問題は演繹法そのものではなく、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;前提が曖昧であること&lt;/p&gt;</description></item></channel></rss>