<?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>ソフトウェア開発における設計の本質 on 設計で、迷わなくなるために | 奥田智紘</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/</link><description>Recent content in ソフトウェア開発における設計の本質 on 設計で、迷わなくなるために | 奥田智紘</description><generator>Hugo -- 0.159.2</generator><language>ja</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://design.okuda-studio.com/books/001-the-essence-of-design/index.xml" rel="self" type="application/rss+xml"/><item><title>本書の主張</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/00-overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/00-overview/</guid><description>&lt;p&gt;本書の主張は、次の一文に集約されます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;良い設計とは、壊そうと思っても壊せない構造を作ることである。&lt;/strong&gt;&lt;/p&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;/ul&gt;
&lt;p&gt;これは、
&lt;strong&gt;構造そのものが人を正しい方向に導くから成り立つものです。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;多くの現場では、
「速く書けること」が価値として評価されがちです。
短期間で動くものを作れること自体は、確かに意味があります。&lt;/p&gt;
&lt;p&gt;ただし本書では、
&lt;strong&gt;速さそのものを価値だとは定義しません。&lt;/strong&gt;&lt;/p&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;li&gt;引き継ぎ時の説明コストの低下&lt;/li&gt;
&lt;li&gt;未来の時間を買う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった性質を持ちます。&lt;/p&gt;
&lt;p&gt;これらは、
&lt;strong&gt;設計という構造の力によって生まれます。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;本書では、シニアエンジニアが
「センス」や「経験則」として扱ってきた設計を、
明確に言語化された「文章」として記し、
&lt;strong&gt;設計するための思考の土台&lt;/strong&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;li&gt;変更理由が一つになるように構造を作ること&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;設計とは、
&lt;strong&gt;未来の自分や他人の行動を、構造によって制限すること&lt;/strong&gt;
だと考えています。&lt;/p&gt;
&lt;p&gt;ドキュメントをどれだけ丁寧に整備しても、
時間が経てば読まれなくなります。
コードとの乖離が起き、
存在していないのと同じ状態になることもあります。&lt;/p&gt;
&lt;p&gt;一方で、良い設計は、
ドキュメントを必要としません。&lt;/p&gt;
&lt;p&gt;コードそのものがルールであり、
&lt;strong&gt;コンパイラがそのルールを強制する&lt;/strong&gt; からです。&lt;/p&gt;
&lt;p&gt;本書では、
この「コンパイラに仕事をさせる設計」を重視します。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;設計がきれいなコードは、属人化しません。&lt;/p&gt;
&lt;p&gt;特定の人がいなければ回らない状態は、
人の問題ではなく、設計の問題です。&lt;/p&gt;
&lt;p&gt;後から参加した人が、
コードを読み、構造を理解し、
安心して変更できる。&lt;/p&gt;
&lt;p&gt;その状態を作ることが、
&lt;strong&gt;設計に責任を持つということ&lt;/strong&gt;
だと考えています。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;本書は、
特定の言語やフレームワークを解説する本ではありません。&lt;/p&gt;
&lt;p&gt;Android、iOS、サーバーサイドなど、
分野が違っても共通する
&lt;strong&gt;設計の本質&lt;/strong&gt; を言語化することを目的としています。&lt;/p&gt;
&lt;p&gt;早く書くための本ではなく、
壊れない構造を作るための本です。&lt;/p&gt;</description></item><item><title>第1章：速さはなぜ価値に見えるのか</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/01-why-does-speed-seem-valuable/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/01-why-does-speed-seem-valuable/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C%E9%80%9F%E3%81%95%E3%81%AF%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%82%84%E3%81%99%E3%81%84%E3%81%AE%E3%81%8B"&gt;なぜ「速さ」は評価されやすいのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%9A%E5%8B%95%E3%81%8F%E3%82%82%E3%81%AE%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AF%E9%96%93%E9%81%95%E3%81%84%E3%81%AA%E3%81%AE%E3%81%8B"&gt;「まず動くものを作る」は間違いなのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%80%9F%E3%81%8F%E6%9B%B8%E3%81%8B%E3%82%8C%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E6%8A%B1%E3%81%88%E3%82%8B%E5%95%8F%E9%A1%8C"&gt;速く書かれたコードが抱える問題&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%80%9F%E3%81%95%E3%81%8C%E7%94%9F%E3%82%80%E8%B2%A0%E5%82%B5%E3%81%AF%E3%81%82%E3%81%A8%E3%81%8B%E3%82%89%E3%82%84%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B"&gt;速さが生む「負債」は、あとからやってくる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AF%E9%80%9F%E3%81%95%E3%81%A8%E5%AF%BE%E7%AB%8B%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;設計は「速さ」と対立するものではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多くの現場では、
「速く書けるエンジニア」が高く評価されます。&lt;/p&gt;
&lt;p&gt;短期間で動くものを作れる。
仕様変更にもすぐに対応できる。
多少バグが残っていても、とりあえず形にできる。&lt;/p&gt;
&lt;p&gt;こうした姿は、
一見するととても頼もしく見えます。&lt;/p&gt;
&lt;p&gt;実際、
プロジェクトの初期段階や、
期限が迫った場面では、
速さが価値を持つこともあります。&lt;/p&gt;
&lt;p&gt;ただし本書では、
&lt;strong&gt;速さが絶対的な価値であるとは考えていません。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="なぜ速さは評価されやすいのか"&gt;なぜ「速さ」は評価されやすいのか&lt;/h2&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;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;ul&gt;
&lt;li&gt;&lt;strong&gt;速さは「今すぐ評価できる価値」&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;設計は「後から効いてくる価値」&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;だと言えます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="まず動くものを作るは間違いなのか"&gt;「まず動くものを作る」は間違いなのか&lt;/h2&gt;
&lt;p&gt;ここで、一つはっきりさせておきたいことがあります。&lt;/p&gt;
&lt;p&gt;本書は、
&lt;strong&gt;「まず動くものを作る」&lt;/strong&gt; こと自体を
否定しているわけではありません。&lt;/p&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;strong&gt;思考のラフスケッチ&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;問題は、そのラフスケッチを
&lt;strong&gt;完成した設計&lt;/strong&gt; だと誤認してしまうことにあります。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="速く書かれたコードが抱える問題"&gt;速く書かれたコードが抱える問題&lt;/h2&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;li&gt;変更時に、どこを直せばよいかわからない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらは、
「書いた人が賢いから私にはわからない」
「書いた人がわかるなら私にもわかるはず」
という問題ではありません。&lt;/p&gt;
&lt;p&gt;暗黙の前提が、コードの外にある可能性があります。&lt;/p&gt;</description></item><item><title>第2章：設計とは何か</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/02-what-is-the-design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/02-what-is-the-design/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%9C%AC%E6%9B%B8%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E8%A8%AD%E8%A8%88%E3%81%AE%E5%AE%9A%E7%BE%A9"&gt;本書における「設計」の定義&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%94%A8%E8%AA%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E6%B3%A8%E6%84%8F"&gt;用語についての注意&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AE%E6%9C%AC%E8%B3%AA%E3%81%AF%E8%B2%AC%E4%BB%BB%E3%81%AE%E5%88%86%E5%89%B2"&gt;設計の本質は「責任の分割」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%B2%AC%E4%BB%BB%E3%82%92%E5%88%86%E3%81%91%E3%81%9F%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AF%E8%A8%AD%E8%A8%88%E3%81%AF%E5%AE%8C%E6%88%90%E3%81%97%E3%81%AA%E3%81%84"&gt;責任を分けただけでは、設計は完成しない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%A7%8B%E9%80%A0%E3%81%AB%E3%82%88%E3%82%8B%E4%BF%9D%E8%A8%BC%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B"&gt;構造による保証とは何か&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%A8%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AE%E9%81%95%E3%81%84"&gt;設計とアーキテクチャの違い&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AE8%E5%89%B2%E3%81%AF%E6%A7%8B%E9%80%A0%E3%81%A7%E6%B1%BA%E3%81%BE%E3%82%8B"&gt;設計の8割は、構造で決まる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AF%E5%A3%8A%E3%81%9D%E3%81%86%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%A6%E3%82%82%E5%A3%8A%E3%81%9B%E3%81%AA%E3%81%84"&gt;良い設計は、壊そうと思っても壊せない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AF%E5%A4%89%E6%9B%B4%E3%81%AE%E5%BD%B1%E9%9F%BF%E3%81%8C%E7%88%86%E7%99%BA%E3%81%97%E3%81%AA%E3%81%84"&gt;良い設計は、変更の影響が爆発しない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AF%E4%BA%BA%E9%96%93%E3%81%AE%E6%80%9D%E8%80%83%E3%82%B3%E3%82%B9%E3%83%88%E3%82%92%E4%B8%8B%E3%81%92%E3%82%8B"&gt;良い設計は、人間の思考コストを下げる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AF%E5%B1%9E%E4%BA%BA%E5%8C%96%E3%81%97%E3%81%AA%E3%81%84"&gt;良い設計は、属人化しない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AB%E6%AD%A3%E8%A7%A3%E3%81%AF%E3%81%AA%E3%81%84%E3%81%8C%E8%AA%AC%E6%98%8E%E3%81%AF%E5%BF%85%E8%A6%81"&gt;設計に正解はないが、説明は必要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多くのエンジニアは、
「設計」という言葉を使いながら、
実は同じものを指していません。&lt;/p&gt;
&lt;p&gt;ある人は、
クラス図やレイヤー構成のことを指します。&lt;/p&gt;
&lt;p&gt;ある人は、
アーキテクチャやフレームワーク選定を指します。&lt;/p&gt;
&lt;p&gt;またある人は、
実装前に少し考えること自体を、
設計と呼んでいるかもしれません。&lt;/p&gt;
&lt;p&gt;本書では、
まずこの曖昧さを取り除きます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="本書における設計の定義"&gt;本書における「設計」の定義&lt;/h2&gt;
&lt;p&gt;本書では、設計を次のように定義します。&lt;/p&gt;
&lt;p&gt;設計とは、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;責任を分割し、その正しさを構造によって保証すること&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;これを、式で表すとこうなります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;責任の分割 ＋ 構造による保証 ＝ 設計&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;この式が、
本書全体を通しての軸になります。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="用語についての注意"&gt;用語についての注意&lt;/h2&gt;
&lt;p&gt;本書では、 &lt;strong&gt;構造による保証&lt;/strong&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;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;p&gt;それは、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;やってはいけないことを、人が判断するのではなく、
構造によって、そもそもできなくする&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;という考え方です。
(これらの言葉は、あくまで、文脈によって使い分けるだけです。)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="設計の本質は責任の分割"&gt;設計の本質は「責任の分割」&lt;/h2&gt;
&lt;p&gt;まず、設計の目的から見ていきます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;設計の本質は、責任の分割&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;ここで言う責任とは、
わかりやすく言えば、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;クラスや関数が持つ役割&lt;/strong&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;</description></item><item><title>第3章：判断は、どこに置かれるべきか</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/03-where-the-judge-placed/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/03-where-the-judge-placed/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B"&gt;判断とは何か&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%8C%E6%A7%8B%E9%80%A0%E3%81%A8%E3%81%97%E3%81%A6%E8%A1%A8%E7%8F%BE%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%93%E3%82%8B%E3%81%8B"&gt;判断が構造として表現されていない場合、何が起こるか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7%E9%98%B2%E3%81%90%E3%81%AF%E8%A8%AD%E8%A8%88%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;「レビューで防ぐ」は、設計ではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AF%E5%88%A4%E6%96%AD%E3%82%92%E6%A7%8B%E9%80%A0%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B"&gt;良い設計は、判断を構造で表現する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%8C%E6%A7%8B%E9%80%A0%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E4%BD%95%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8B%E3%81%8B"&gt;判断が構造で表現されると、何が変わるか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%8C%E6%A7%8B%E9%80%A0%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E7%89%B9%E5%BE%B4"&gt;判断が構造で表現されていないコードの特徴&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%8C%E6%A7%8B%E9%80%A0%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E5%BC%B7%E3%81%8F%E3%81%AA%E3%82%8B"&gt;判断が構造で表現されると、コードは強くなる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;設計が壊れ始めるとき、
コードの中では、
ある現象が必ず起きています。&lt;/p&gt;
&lt;p&gt;それは、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断が、コードのあちこちに散らばっている&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;という状態です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="判断とは何か"&gt;判断とは何か&lt;/h2&gt;
&lt;p&gt;本書で言う「判断」とは、
if 文や条件分岐そのもののことではありません。&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;li&gt;この状態で変更してよいのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった、
&lt;strong&gt;「やってよい／いけない」を決める責任&lt;/strong&gt;
そのものを指します。&lt;/p&gt;
&lt;p&gt;この判断が、
どこで行われているか。&lt;/p&gt;
&lt;p&gt;それが、
設計の壊れやすさを決めます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="判断が構造として表現されていない場合何が起こるか"&gt;判断が構造として表現されていない場合、何が起こるか&lt;/h2&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;li&gt;テスト&lt;/li&gt;
&lt;li&gt;そして最終的には、人の記憶&lt;/li&gt;
&lt;/ul&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;strong&gt;判断がコードの外に漏れ出している&lt;/strong&gt;
状態です。&lt;/p&gt;
&lt;hr&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;strong&gt;設計でやるべき判断を、
後工程に押し出している&lt;/strong&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;hr&gt;
&lt;h2 id="良い設計は判断を構造で表現する"&gt;良い設計は、判断を構造で表現する&lt;/h2&gt;
&lt;p&gt;良い設計では、
判断は &lt;strong&gt;構造の中&lt;/strong&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;</description></item><item><title>第4章：状態とは何か</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/04-what-is-the-state/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/04-what-is-the-state/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%81%A8%E3%81%AF%E4%BB%8A%E4%BD%95%E3%81%8C%E8%A8%B1%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A7%E3%81%82%E3%82%8B"&gt;状態とは、「今、何が許されているか」である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%AF%E5%BF%85%E3%81%9A%E7%8A%B6%E6%85%8B%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%99%E3%82%8B"&gt;判断は、必ず状態に依存する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%A0%E3%81%A8%E5%88%A4%E6%96%AD%E3%81%8C%E6%BC%8F%E3%82%8C%E5%87%BA%E3%81%99"&gt;状態が曖昧だと、判断が漏れ出す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E7%8A%B6%E6%85%8B%E8%A8%AD%E8%A8%88%E3%81%AF%E3%81%82%E3%82%8A%E3%81%88%E3%81%AA%E3%81%84%E7%8A%B6%E6%B3%81%E3%82%92%E6%B6%88%E3%81%99"&gt;良い状態設計は、「ありえない状況」を消す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%82%92%E6%A7%8B%E9%80%A0%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8"&gt;状態を構造で表現する、ということ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%82%92%E6%A7%8B%E9%80%A0%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%85%86%E5%80%99"&gt;状態を構造で表現できていないコードの兆候&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E8%A8%AD%E8%A8%88%E3%81%AF%E8%A8%AD%E8%A8%88%E3%81%AE%E4%B8%AD%E6%A0%B8%E3%81%A7%E3%81%82%E3%82%8B"&gt;状態設計は、設計の中核である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第3章では、
判断を人に持たせるのではなく、
&lt;strong&gt;構造で表現する&lt;/strong&gt; ことが設計だと述べました。&lt;/p&gt;
&lt;p&gt;では、その判断は、
構造の中で &lt;strong&gt;どんな形&lt;/strong&gt; を取るのでしょうか。&lt;/p&gt;
&lt;p&gt;その答えが、 &lt;strong&gt;状態&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="状態とは今何が許されているかである"&gt;状態とは、「今、何が許されているか」である&lt;/h2&gt;
&lt;p&gt;本書で言う状態とは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;変数の値&lt;/li&gt;
&lt;li&gt;フラグの on / off&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;p&gt;&lt;strong&gt;「今、このコードは何をしてよくて、何をしてはいけないか」&lt;/strong&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;li&gt;この操作は一度しか許されない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こうした判断が、
暗黙の了解ではなく、
&lt;strong&gt;コードとして表現されているかどうか&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;それが、
状態設計の良し悪しを分けます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="判断は必ず状態に依存する"&gt;判断は、必ず状態に依存する&lt;/h2&gt;
&lt;p&gt;第3章で扱った判断は、
必ず何かに依存していました。&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;strong&gt;「今がどんな状態か」&lt;/strong&gt;
によって決まります。&lt;/p&gt;
&lt;p&gt;つまり、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;判断を構造で表現する&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状態を構造で表現する&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この二つは、
実は &lt;strong&gt;同じ話を違う角度から見ている&lt;/strong&gt; だけです。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="状態が曖昧だと判断が漏れ出す"&gt;状態が曖昧だと、判断が漏れ出す&lt;/h2&gt;
&lt;p&gt;状態がはっきり定義されていないコードでは、
判断が漏れ出します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;null かもしれない&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;ul&gt;
&lt;li&gt;if を増やして守る&lt;/li&gt;
&lt;li&gt;コメントで注意書きをする&lt;/li&gt;
&lt;li&gt;テストで網を張る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という方向に進みます。&lt;/p&gt;</description></item><item><title>第5章：構造として表現された判断が、どう振る舞いを決定するか</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/05-how-to-decide-the-behavior/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/05-how-to-decide-the-behavior/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%A7%E3%81%82%E3%82%8A%E6%9B%B8%E3%81%8F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;振る舞いは「判断の結果」であり、書くものではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%81%AF%E8%80%83%E3%81%88%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;振る舞いは「考える」ものではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%A7%E3%81%AF%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%81%AF%E9%81%B8%E3%81%B0%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B"&gt;良い設計では、振る舞いは「選ばれている」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E6%A7%8B%E9%80%A0"&gt;振る舞いを制御するのは「構造」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%9B%B8%E3%81%91%E3%81%AA%E3%81%84%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%82%92%E4%BD%9C%E3%82%8B"&gt;「書けない振る舞い」を作る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%81%8C%E5%A2%97%E3%81%88%E3%81%9F%E3%82%89%E8%A8%AD%E8%A8%88%E3%82%92%E7%96%91%E3%81%86"&gt;振る舞いが増えたら、設計を疑う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="振る舞いは判断の結果であり書くものではない"&gt;振る舞いは「判断の結果」であり、書くものではない&lt;/h2&gt;
&lt;p&gt;ここまでで、
判断は &lt;strong&gt;人がその場で行うもの&lt;/strong&gt; ではなく、
&lt;strong&gt;構造として先に固定されるべきもの&lt;/strong&gt; だ、という話をしてきました。&lt;/p&gt;
&lt;p&gt;では、構造に固定された判断は、
最終的にどこへ行き着くのでしょうか。&lt;/p&gt;
&lt;p&gt;それが &lt;strong&gt;振る舞い（behavior）&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="振る舞いは考えるものではない"&gt;振る舞いは「考える」ものではない&lt;/h2&gt;
&lt;p&gt;設計が弱いコードでは、
振る舞いは次のように書かれます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if / when で分岐する&lt;/li&gt;
&lt;li&gt;状態を見て都度判断する&lt;/li&gt;
&lt;li&gt;条件が増えるたびに分岐が増える&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このとき、プログラムは常に
「今、どう動くべきか？」
を &lt;strong&gt;実行時に考え続けている&lt;/strong&gt; 状態になります。&lt;/p&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;/ul&gt;
&lt;p&gt;からです。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="良い設計では振る舞いは選ばれている"&gt;良い設計では、振る舞いは「選ばれている」&lt;/h2&gt;
&lt;p&gt;設計されたコードでは、
振る舞いは &lt;strong&gt;書かれるもの&lt;/strong&gt; ではありません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すでに選ばれている&lt;/strong&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;blockquote&gt;
&lt;p&gt;「どう動くか」を考える必要がない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;状態が確定した瞬間に、
実行できる振る舞いも一意に確定する&lt;/strong&gt;
これが設計された状態です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="振る舞いを制御するのは構造"&gt;振る舞いを制御するのは「構造」&lt;/h2&gt;
&lt;p&gt;ここで重要なのは、
振る舞いを縛っているのが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if 文&lt;/li&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;strong&gt;構造&lt;/strong&gt; です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;型によって呼べる関数が決まる&lt;/li&gt;
&lt;li&gt;状態オブジェクトによって持てる操作が決まる&lt;/li&gt;
&lt;li&gt;API によって渡せる情報が制限される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このとき、
&lt;strong&gt;振る舞いは構造の結果として現れるだけ&lt;/strong&gt; になります。&lt;/p&gt;</description></item><item><title>第6章：境界は判断を閉じ込める装置である</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/06-devider-closes-the-judgement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/06-devider-closes-the-judgement/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%8C%E6%95%A3%E3%82%89%E3%81%B0%E3%82%8B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E5%A3%8A%E3%82%8C%E5%A7%8B%E3%82%81%E3%82%8B"&gt;判断が散らばると、コードは壊れ始める&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%A2%83%E7%95%8C%E3%81%AE%E5%BD%B9%E5%89%B2%E3%81%AF%E5%88%A4%E6%96%AD%E3%82%92%E4%B8%80%E7%AE%87%E6%89%80%E3%81%AB%E6%8A%BC%E3%81%97%E8%BE%BC%E3%82%80%E3%81%93%E3%81%A8"&gt;境界の役割は「判断を一箇所に押し込む」こと&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#android--compose-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%A2%83%E7%95%8C"&gt;Android / Compose における「境界」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%82%AA%E3%81%84%E4%BE%8Bui-%E3%81%8C%E5%88%A4%E6%96%AD%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B"&gt;悪い例：UI が判断している&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E4%BE%8B%E5%A2%83%E7%95%8C%E3%81%AE%E5%86%85%E5%81%B4%E3%81%A7%E5%88%A4%E6%96%AD%E3%81%8C%E5%AE%8C%E7%B5%90%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="#viewmodel-%E3%81%AF%E5%88%A4%E6%96%AD%E3%82%92%E9%96%89%E3%81%98%E8%BE%BC%E3%82%81%E3%82%8B%E7%AE%B1"&gt;ViewModel は「判断を閉じ込める箱」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%A2%83%E7%95%8C%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%A0%E3%81%A8%E5%88%A4%E6%96%AD%E3%81%AF%E6%BC%8F%E3%82%8C%E5%87%BA%E3%81%99"&gt;境界が曖昧だと、判断は漏れ出す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;strong&gt;境界とは、判断を閉じ込めるための構造&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="判断が散らばるとコードは壊れ始める"&gt;判断が散らばると、コードは壊れ始める&lt;/h2&gt;
&lt;p&gt;設計されていないコードでは、
同じ判断がいろいろなところに散らばります。&lt;/p&gt;
&lt;p&gt;例えば、ボタンの有効 / 無効を判断する処理が、
UI 内と ViewModel 内にそれぞれ存在するとします。&lt;/p&gt;
&lt;p&gt;判断方法の仕様が変更になった際に、
UI 側の判断は仕様通りに変更したが、
ViewModel 側の変更を忘れた。&lt;/p&gt;
&lt;p&gt;というような &lt;strong&gt;構造的な破綻&lt;/strong&gt; が起き始めます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="境界の役割は判断を一箇所に押し込むこと"&gt;境界の役割は「判断を一箇所に押し込む」こと&lt;/h2&gt;
&lt;p&gt;良い設計では、
判断は &lt;strong&gt;境界の内側に閉じ込められます&lt;/strong&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;blockquote&gt;
&lt;p&gt;境界を越えたら、もう迷わない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という状態を作るのが、設計です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="android--compose-における境界"&gt;Android / Compose における「境界」&lt;/h2&gt;
&lt;p&gt;Android / Jetpack Compose では、
典型的に次のような境界が現れます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Composable と ViewModel の境界&lt;/li&gt;
&lt;li&gt;ViewModel と UseCase の境界&lt;/li&gt;
&lt;li&gt;UseCase と Repository の境界&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重要なのは、
&lt;strong&gt;どこに判断を閉じ込めるかを意識しているか&lt;/strong&gt; です。&lt;/p&gt;</description></item><item><title>第7章：状態は判断の結果を保持する</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/07-state-has-result-of-judgement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/07-state-has-result-of-judgement/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B"&gt;状態とは何か&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%81%AF%E5%88%A4%E6%96%AD%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%95%E3%81%9B%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AE%E8%A3%85%E7%BD%AE"&gt;状態は、判断を繰り返させないための装置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%81%8C%E5%98%98%E3%82%92%E3%81%A4%E3%81%8F%E3%81%A8%E8%A8%AD%E8%A8%88%E3%81%AF%E5%A3%8A%E3%82%8C%E3%82%8B"&gt;状態が嘘をつくと、設計は壊れる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%82%E3%82%8A%E3%81%88%E3%81%AA%E3%81%84%E7%8A%B6%E6%85%8B%E3%82%92%E8%A1%A8%E7%8F%BE%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84"&gt;「ありえない状態」を表現できてはいけない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%8C%E7%B5%82%E3%82%8F%E3%81%A3%E3%81%9F%E4%B8%96%E7%95%8C%E3%82%92%E8%A1%A8%E3%81%99"&gt;状態は、判断が終わった世界を表す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;hr&gt;
&lt;h2 id="状態とは何か"&gt;状態とは何か&lt;/h2&gt;
&lt;p&gt;本書における状態とは、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断の結果を、構造として保持したもの&lt;/strong&gt;&lt;/p&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;/ul&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;「今、何ができるのか」
「次に何をしてよいのか」&lt;/p&gt;
&lt;p&gt;それらはすべて、
状態が表現しています。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="状態は判断を繰り返させないための装置"&gt;状態は、判断を繰り返させないための装置&lt;/h2&gt;
&lt;p&gt;判断が構造で表現されていない設計では、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;毎回 if で確認する&lt;/li&gt;
&lt;li&gt;毎回 null チェックをする&lt;/li&gt;
&lt;li&gt;毎回条件を思い出す&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということが起きます。&lt;/p&gt;
&lt;p&gt;これは、
&lt;strong&gt;同じ判断を何度も繰り返している&lt;/strong&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;strong&gt;保存するための構造&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="状態が嘘をつくと設計は壊れる"&gt;状態が嘘をつくと、設計は壊れる&lt;/h2&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;strong&gt;状態が、判断結果を正しく表現できていない&lt;/strong&gt;
状態です。&lt;/p&gt;
&lt;p&gt;状態が嘘をつくと、
判断が再び人に戻ってきます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ありえない状態を表現できてはいけない"&gt;「ありえない状態」を表現できてはいけない&lt;/h2&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;strong&gt;そもそも表現できません。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;たとえば、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Loading と Ready が同時に true&lt;/li&gt;
&lt;li&gt;取得エラーなのにデータが存在する&lt;/li&gt;
&lt;li&gt;未初期化なのに操作できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こうした状態を、
型や構造で排除します。&lt;/p&gt;</description></item><item><title>第8章：イベントとは「判断が完了したこと」を表す構造である</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/08-event-represents-completion-of-judgement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/08-event-represents-completion-of-judgement/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%9C%AC%E6%9B%B8%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B"&gt;本書における「イベント」とは何か&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%AE%E8%B5%B7%E7%82%B9%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;イベントは「判断の起点」ではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%8C%E7%B5%82%E3%82%8F%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8%E3%82%92%E8%A1%A8%E3%81%99"&gt;イベントは「判断が終わったこと」を表す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%8C%E6%98%8E%E7%A2%BA%E3%81%A0%E3%81%A8%E5%A2%83%E7%95%8C%E3%82%92%E8%B6%8A%E3%81%88%E3%81%9F%E3%81%A8%E5%88%86%E3%81%8B%E3%82%8B%E3%81%AE%E3%81%8B"&gt;なぜ、イベントが明確だと境界を越えたと分かるのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AF%E5%A2%83%E7%95%8C%E3%82%92%E8%B6%8A%E3%81%88%E3%81%9F%E3%81%93%E3%81%A8%E3%81%AE%E9%80%9A%E7%9F%A5%E3%81%A7%E3%81%82%E3%82%8B"&gt;イベントは、境界を越えたことの通知である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%8C%E7%B5%82%E3%82%8F%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%82%82%E3%81%AE%E3%81%AF%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;判断が終わっていないものは、イベントではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本書におけるイベントとは何か"&gt;本書における「イベント」とは何か&lt;/h2&gt;
&lt;p&gt;一般に、
イベントというと、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;onClick&lt;/li&gt;
&lt;li&gt;onTextChanged&lt;/li&gt;
&lt;li&gt;onResume&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のような、
&lt;strong&gt;UI やフレームワークが発火する通知&lt;/strong&gt;
を思い浮かべるかもしれません。&lt;/p&gt;
&lt;p&gt;しかし、
本書で扱う「イベント」は、
それらとは少し意味が違います。&lt;/p&gt;
&lt;p&gt;本書におけるイベントとは、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断が完了したことを、
構造として外部に表現するもの&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="イベントは判断の起点ではない"&gt;イベントは「判断の起点」ではない&lt;/h2&gt;
&lt;p&gt;よくある誤解として、&lt;/p&gt;
&lt;ul&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;strong&gt;後工程&lt;/strong&gt; に残ります。&lt;/p&gt;
&lt;p&gt;その結果、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if が増える&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;strong&gt;イベントが判断を内包していない&lt;/strong&gt;
状態です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="イベントは判断が終わったことを表す"&gt;イベントは「判断が終わったこと」を表す&lt;/h2&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;strong&gt;「ここまでの判断はすべて終わりました」
という合図&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;イベントは、
これ以上判断を進めるための材料ではありません。&lt;/p&gt;
&lt;p&gt;判断を &lt;strong&gt;終わらせた結果&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="なぜイベントが明確だと境界を越えたと分かるのか"&gt;なぜ、イベントが明確だと境界を越えたと分かるのか&lt;/h2&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;ul&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;strong&gt;そのイベントを受け取った瞬間に、
「判断はすでに終わっている」と分かる&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;のです。&lt;/p&gt;</description></item><item><title>第8章 補足：イベントとは何か（サンプルで理解する）</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/08-x-event-sample/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/08-x-event-sample/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%82%AA%E3%81%84%E4%BE%8B%E5%A2%83%E7%95%8C%E3%82%92%E8%B6%8A%E3%81%88%E3%81%9F%E3%81%8B%E5%88%86%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88"&gt;悪い例：境界を越えたか分からないイベント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BD%95%E3%81%8C%E5%95%8F%E9%A1%8C%E3%81%AA%E3%81%AE%E3%81%8B"&gt;何が問題なのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E4%BE%8B%E5%A2%83%E7%95%8C%E3%82%92%E8%B6%8A%E3%81%88%E3%81%9F%E3%81%93%E3%81%A8%E3%81%8C%E5%88%86%E3%81%8B%E3%82%8B%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88"&gt;良い例：境界を越えたことが分かるイベント&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E6%9C%AA%E5%88%A4%E6%96%AD%E3%81%AE%E4%B8%96%E7%95%8C"&gt;状態（未判断の世界）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E5%88%A4%E6%96%AD%E5%AE%8C%E4%BA%86%E3%81%AE%E4%B8%96%E7%95%8C"&gt;イベント（判断完了の世界）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#viewmodel%E5%88%A4%E6%96%AD%E3%82%92%E5%AE%8C%E4%BA%86%E3%81%95%E3%81%9B%E3%82%8B%E5%A0%B4%E6%89%80"&gt;ViewModel（判断を完了させる場所）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%93%E3%81%A7%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B"&gt;ここで何が起きているか&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%A2%83%E7%95%8C%E3%81%AE%E6%89%8B%E5%89%8D"&gt;境界の「手前」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%A2%83%E7%95%8C%E3%81%AE%E5%90%91%E3%81%93%E3%81%86%E5%81%B4"&gt;境界の「向こう側」&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%8C%E5%A2%83%E7%95%8C%E3%82%92%E8%B6%8A%E3%81%88%E3%81%9F%E9%80%9A%E7%9F%A5%E3%81%AB%E3%81%AA%E3%82%8B%E7%90%86%E7%94%B1"&gt;イベントが「境界を越えた通知」になる理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C-sealed-class-%E3%81%8C%E5%8A%B9%E3%81%8F%E3%81%AE%E3%81%8B"&gt;なぜ sealed class が効くのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第8章では、
本書における「イベント」を次のように定義しました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;イベントとは、「判断が完了したこと」を表す構造&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;これは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;onClick&lt;/li&gt;
&lt;li&gt;onTextChanged&lt;/li&gt;
&lt;li&gt;onResume&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった
&lt;strong&gt;UI やフレームワークが発火する通知&lt;/strong&gt; とは、
まったく別の概念です。&lt;/p&gt;
&lt;p&gt;ここでは、
この違いがコードとしてどう現れるのかを、
具体例で確認します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="悪い例境界を越えたか分からないイベント"&gt;悪い例：境界を越えたか分からないイベント&lt;/h2&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FormViewModel&lt;/span&gt; : ViewModel() {
&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 style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; uiState = FormUiState()
&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 style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onTextChanged&lt;/span&gt;(text: String) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; uiState = uiState.copy(inputText = text)
&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;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onSubmitClicked&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 本当に送信してよい状態か？
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&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;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;code&gt;onSubmit()&lt;/code&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;strong&gt;どこで判断が完了したのかが分かりません。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>第9章：状態・イベント・境界は「同じ話」をしている</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/09-state-event-devider-is-similar/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/09-state-event-devider-is-similar/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E5%A2%83%E7%95%8C%E3%81%AF%E5%90%8C%E3%81%98%E8%A9%B1%E3%82%92%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%88%A4%E6%96%AD%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B--%E8%A8%AD%E8%A8%88%E3%81%A7%E6%9C%80%E5%88%9D%E3%81%AB%E6%B1%BA%E3%82%81%E3%82%8B%E3%81%B9%E3%81%8D%E3%82%82%E3%81%AE"&gt;判断とは何か —— 設計で最初に決めるべきもの&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%81%A8%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%8C%E7%B5%82%E3%82%8F%E3%81%A3%E3%81%9F%E4%B8%96%E7%95%8C%E3%81%AE%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%81%A7%E3%81%82%E3%82%8B"&gt;状態とは「判断が終わった世界のスナップショット」である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8%E3%82%92%E8%A1%A8%E3%81%99%E6%A7%8B%E9%80%A0%E3%81%A7%E3%81%82%E3%82%8B"&gt;イベントとは「判断が完了したこと」を表す構造である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%A2%83%E7%95%8C%E3%81%A8%E3%81%AF%E5%88%A4%E6%96%AD%E3%82%92%E3%81%93%E3%82%8C%E4%BB%A5%E4%B8%8A%E6%8C%81%E3%81%A1%E8%B6%8A%E3%81%95%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AE%E7%B7%9A%E3%81%A7%E3%81%82%E3%82%8B"&gt;境界とは「判断をこれ以上持ち越さない」ための線である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tipsflow-%E3%81%AE%E5%90%84%E9%96%A2%E6%95%B0%E3%81%AF%E5%88%A4%E6%96%AD%E3%82%92%E9%96%89%E3%81%98%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E5%A2%83%E7%95%8C%E3%81%A7%E3%81%82%E3%82%8B"&gt;Tips：Flow の各関数は「判断を閉じるための境界」である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#viewmodel-%E3%81%AF%E5%88%A4%E6%96%AD%E6%B8%88%E3%81%BF%E3%81%AE%E4%B8%96%E7%95%8C%E3%82%92%E4%BD%9C%E3%82%8B%E5%A0%B4%E6%89%80%E3%81%A7%E3%81%82%E3%82%8B"&gt;ViewModel は「判断済みの世界」を作る場所である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E5%A2%83%E7%95%8C%E3%81%8C%E5%99%9B%E3%81%BF%E5%90%88%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E8%B5%B7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8"&gt;「状態・イベント・境界」が噛み合ったときに起きること&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81%E5%90%8D%E5%89%8D%E3%81%AF%E9%81%95%E3%81%86%E3%81%8C%E5%95%8F%E3%81%84%E3%81%AF%E4%B8%80%E3%81%A4%E3%81%A7%E3%81%82%E3%82%8B"&gt;この章のまとめ：名前は違うが、問いは一つである&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="状態イベント境界は同じ話をしている"&gt;状態・イベント・境界は「同じ話」をしている&lt;/h2&gt;
&lt;p&gt;状態設計、イベント設計、境界設計。
これらは、多くの場合、 &lt;strong&gt;別々の設計トピック&lt;/strong&gt; として語られます。&lt;/p&gt;
&lt;p&gt;しかし実装を重ねていくと、
こんな違和感を覚えたことはないでしょうか。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;状態をきれいに設計したはずなのに、 if が消えない&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;strong&gt;同じ問いを、違う名前で考えているだけ&lt;/strong&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;「判断をどこで終わらせるか」&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という、ひとつの設計問題を別の角度から見たものです。&lt;/p&gt;
&lt;p&gt;この章では、それらを一度すべて並べ、
「同じ話をしている」ことを明確にします。&lt;/p&gt;
&lt;p&gt;そうすることで、
これまでバラバラに見えていた設計判断が、
一本の軸としてつながるはずです。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="判断とは何か--設計で最初に決めるべきもの"&gt;判断とは何か —— 設計で最初に決めるべきもの&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;この章の軸になる定義&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;判断とは
&lt;ul&gt;
&lt;li&gt;分岐&lt;/li&gt;
&lt;li&gt;検証&lt;/li&gt;
&lt;li&gt;条件評価&lt;/li&gt;
&lt;li&gt;正常／異常の決定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;つまり
&lt;strong&gt;「複数の可能性の中から、1つに確定させる行為」&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここで強調するポイント：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;判断は「いつまでも続いてはいけない」&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="状態とは判断が終わった世界のスナップショットである"&gt;状態とは「判断が終わった世界のスナップショット」である&lt;/h2&gt;
&lt;p&gt;本書における &lt;strong&gt;状態の再定義&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;状態 =
&lt;strong&gt;判断がすでに完了した結果を、嘘なく表現しているもの&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここでこれまでの章と接続：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UI State に if が多い&lt;/li&gt;
&lt;li&gt;nullable が意味を持ちすぎている&lt;/li&gt;
&lt;li&gt;「この状態でこの画面、あり得る？」という違和感&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ それは
&lt;strong&gt;状態が、判断途中の世界を含んでしまっているから&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>資料：「状態・イベント・境界」設計チェックリスト</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/09-x-checklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/09-x-checklist/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E8%A8%AD%E8%A8%88%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF"&gt;状態設計のチェック&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E8%A8%AD%E8%A8%88%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF"&gt;イベント設計のチェック&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%A2%83%E7%95%8C%E8%A8%AD%E8%A8%88%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF"&gt;境界設計のチェック&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#viewmodel--ui-%E5%88%86%E9%9B%A2%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AFandroid"&gt;ViewModel / UI 分離のチェック（Android）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%B5%B1%E5%90%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E6%9C%80%E9%87%8D%E8%A6%81"&gt;統合チェック（最重要）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="状態設計のチェック"&gt;状態設計のチェック&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;この状態は &lt;strong&gt;判断がすでに完了した結果&lt;/strong&gt; だけを表しているか&lt;/li&gt;
&lt;li&gt;「この状態の UI はあり得る？」と自分に聞いて、即答できるか&lt;/li&gt;
&lt;li&gt;nullable や flag の組み合わせで「状態を表現していないか」&lt;/li&gt;
&lt;li&gt;状態を見ただけで、 &lt;strong&gt;これ以上判断が不要だ&lt;/strong&gt; と分かるか&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="イベント設計のチェック"&gt;イベント設計のチェック&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;このイベントは「これから判断してほしい」通知になっていないか&lt;/li&gt;
&lt;li&gt;イベントの型を見ただけで、&lt;strong&gt;何が確定したのか&lt;/strong&gt; が分かるか&lt;/li&gt;
&lt;li&gt;Boolean や Int で「意味を持たせて」いないか&lt;/li&gt;
&lt;li&gt;sealed class にしたとき、アプリがとり得る状態として過不足がないか&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="境界設計のチェック"&gt;境界設計のチェック&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;この境界を越えたあと、判断が発生していないか&lt;/li&gt;
&lt;li&gt;境界の向こう側で if / when が増えていないか&lt;/li&gt;
&lt;li&gt;Flow の各関数の前後が「意味の切れ目」になっているか&lt;/li&gt;
&lt;li&gt;「ここから先は事実だけが流れる」と断言できるか&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="viewmodel--ui-分離のチェックandroid"&gt;ViewModel / UI 分離のチェック（Android）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ViewModel は「判断済みの世界」だけを外に出しているか&lt;/li&gt;
&lt;li&gt;UI は判断せず、状態とイベントを &lt;strong&gt;そのまま描画／反映&lt;/strong&gt; しているか&lt;/li&gt;
&lt;li&gt;UI の onClick などから、判断済みのイベントを作成しているか&lt;/li&gt;
&lt;li&gt;「この判断、UI でも ViewModel でもできるよね」と思う箇所が残っていないか&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="統合チェック最重要"&gt;統合チェック（最重要）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;「これは判断前／判断後のどちらか？」と即答できるか&lt;/li&gt;
&lt;li&gt;新しいコードを書く前に「判断はどこで終わらせる？」と自問しているか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ これが自然にできていれば、設計は崩れにくい&lt;/p&gt;</description></item><item><title>第10章：設計はなぜ後戻りできないのか</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/10-design-cannot-undo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/10-design-cannot-undo/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%BE%8C%E6%88%BB%E3%82%8A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E6%AD%A3%E4%BD%93%E3%81%AF%E6%A7%8B%E9%80%A0%E3%81%AE%E8%93%84%E7%A9%8D%E3%81%A7%E3%81%82%E3%82%8B"&gt;「後戻りできない」の正体は、構造の蓄積である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%9C%80%E5%88%9D%E3%81%AB%E7%BD%AE%E3%81%84%E3%81%9F%E5%88%A4%E6%96%AD%E3%81%8C%E5%85%A8%E4%BD%93%E3%81%AE%E5%89%8D%E6%8F%90%E3%81%AB%E3%81%AA%E3%82%8B"&gt;最初に置いた判断が、全体の前提になる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%9A%97%E9%BB%99%E3%81%AE%E5%89%8D%E6%8F%90%E3%81%AF%E9%9D%99%E3%81%8B%E3%81%AB%E8%A4%87%E8%A3%BD%E3%81%95%E3%82%8C%E3%82%8B"&gt;暗黙の前提は、静かに複製される&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%82%92%E5%A4%89%E3%81%88%E3%81%9F%E3%81%84%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%99%E3%81%A7%E3%81%AB%E9%81%85%E3%81%84"&gt;設計を変えたいと思ったとき、すでに遅い&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%A2%83%E7%95%8C%E3%82%92%E5%BE%8C%E3%81%8B%E3%82%89%E5%BC%95%E3%81%8D%E7%9B%B4%E3%81%99%E3%81%AE%E3%81%8C%E9%9B%A3%E3%81%97%E3%81%84%E7%90%86%E7%94%B1"&gt;境界を後から引き直すのが難しい理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AF%E3%81%82%E3%81%A8%E3%81%8B%E3%82%89%E3%81%A7%E3%82%82%E7%9B%B4%E3%81%9B%E3%82%8B%E3%81%AF%E3%81%AA%E3%81%9C%E9%AD%85%E5%8A%9B%E7%9A%84%E3%81%AA%E3%81%AE%E3%81%8B"&gt;「設計はあとからでも直せる」は、なぜ魅力的なのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8A%80%E8%A1%93%E7%9A%84%E8%B2%A0%E5%82%B5%E3%81%AE%E6%AD%A3%E4%BD%93%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%AE%E8%B2%A0%E5%82%B5%E3%81%A7%E3%81%82%E3%82%8B"&gt;技術的負債の正体は「判断の負債」である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%B0%8F%E3%81%95%E3%81%AA%E8%A8%AD%E8%A8%88%E3%81%AF%E5%BE%8C%E6%88%BB%E3%82%8A%E3%81%A7%E3%81%8D%E3%82%8B"&gt;小さな設計は、後戻りできる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AF%E6%B1%BA%E6%96%AD%E3%82%92%E6%97%A9%E3%81%8F%E3%81%99%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%E6%9C%AA%E6%9D%A5%E3%81%AE%E9%81%B8%E6%8A%9E%E8%82%A2%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8"&gt;設計とは、未来の選択肢を整理すること&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;strong&gt;設計は、後から直そうとするほど難しくなっていく&lt;/strong&gt;
という現象が、ほぼ必ず起こります。&lt;/p&gt;
&lt;p&gt;この章では、その理由を
精神論ではなく &lt;strong&gt;構造の問題&lt;/strong&gt; として説明します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="後戻りできないの正体は構造の蓄積である"&gt;「後戻りできない」の正体は、構造の蓄積である&lt;/h2&gt;
&lt;p&gt;設計が後戻りできなくなる理由は、単純です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断が、コード全体に染み出していくから&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;判断を構造として表現せずに実装を進めると、
その判断は次のような形で現れ始めます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if 文として&lt;/li&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;strong&gt;あらゆる場所に複製&lt;/strong&gt; されていきます。&lt;/p&gt;
&lt;p&gt;この状態になると、
もはや一箇所を直すだけでは済みません。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="最初に置いた判断が全体の前提になる"&gt;最初に置いた判断が、全体の前提になる&lt;/h2&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;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;submit&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;data&lt;/span&gt;: Data) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;data&lt;/span&gt;.isValid()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&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;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;strong&gt;重要な設計判断&lt;/strong&gt; が含まれています。&lt;/p&gt;
&lt;p&gt;この時点で置かれている判断は、次の二つです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Data&lt;/code&gt; は「不正な状態」で渡される可能性がある&lt;/li&gt;
&lt;li&gt;その妥当性を判断する責任は &lt;code&gt;submit&lt;/code&gt; が持つ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまりこのコードは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「呼び出し元は、Data の正しさを気にしなくてよい」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という前提を、
&lt;strong&gt;コードの構造として表現している&lt;/strong&gt; のです。&lt;/p&gt;</description></item><item><title>第11章：設計はいつやるべきか</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/11-when-should-we-design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/11-when-should-we-design/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AF%E5%88%A4%E6%96%AD%E3%82%92%E6%A7%8B%E9%80%A0%E3%81%AB%E7%BD%AE%E3%81%8F%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E3%82%84%E3%82%8B"&gt;設計は「判断を構造に置く」タイミングでやる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%AE%9F%E8%A3%85%E5%89%8D%E3%81%AB%E3%82%84%E3%82%8B%E8%A8%AD%E8%A8%88%E5%AE%9F%E8%A3%85%E4%B8%AD%E3%81%AB%E3%82%84%E3%82%8B%E8%A8%AD%E8%A8%88"&gt;実装前にやる設計、実装中にやる設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%AE%9F%E8%A3%85%E5%89%8D%E3%81%AB%E3%82%84%E3%82%8B%E8%A8%AD%E8%A8%88"&gt;実装前にやる設計&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%AE%9F%E8%A3%85%E4%B8%AD%E3%81%AB%E3%82%84%E3%82%8B%E8%A8%AD%E8%A8%88"&gt;実装中にやる設計&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%8B%95%E3%81%8F%E3%82%82%E3%81%AE%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%8B%E3%82%89%E8%80%83%E3%81%88%E3%82%8B%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4"&gt;「動くものを作ってから考える」の落とし穴&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AF%E6%97%A9%E3%81%99%E3%81%8E%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E6%B7%B1%E3%81%99%E3%81%8E%E3%82%8B%E3%81%A8%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B"&gt;設計は「早すぎる」のではなく「深すぎる」と失敗する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%89%AF%E3%81%84%E8%A8%AD%E8%A8%88%E3%81%AF%E8%A6%B3%E6%B8%AC%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E8%A1%8C%E3%81%86"&gt;良い設計は「観測してから行う」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%82%92%E3%82%84%E3%82%8B%E3%81%B9%E3%81%8D%E3%82%B5%E3%82%A4%E3%83%B3"&gt;設計をやるべきサイン&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AF%E4%B8%80%E5%BA%A6%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84"&gt;設計は、一度で終わらない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%82%92%E5%BE%8C%E5%9B%9E%E3%81%97%E3%81%AB%E3%81%97%E3%81%A6%E3%82%88%E3%81%84%E3%82%B1%E3%83%BC%E3%82%B9"&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%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E6%8A%80%E8%A1%93%E3%81%A7%E3%81%82%E3%82%8B"&gt;設計とは、タイミングの技術である&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;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;strong&gt;判断基準が書かれていない&lt;/strong&gt; のです。&lt;/p&gt;
&lt;p&gt;本書では、
この問いに対して、
はっきりした答えを出します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="設計は判断を構造に置くタイミングでやる"&gt;設計は「判断を構造に置く」タイミングでやる&lt;/h2&gt;
&lt;p&gt;設計をやるべきタイミングは、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断を、人の頭から構造に移す必要が生じたとき&lt;/strong&gt;&lt;/p&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;/ul&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;strong&gt;設計のタイミング&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="実装前にやる設計実装中にやる設計"&gt;実装前にやる設計、実装中にやる設計&lt;/h2&gt;
&lt;p&gt;設計には、大きく二種類あります。&lt;/p&gt;
&lt;h3 id="実装前にやる設計"&gt;実装前にやる設計&lt;/h3&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;strong&gt;「壊れ方を予測するための設計」&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;正解を決めるためではありません。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="実装中にやる設計"&gt;実装中にやる設計&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;判断が散らばり始めたとき&lt;/li&gt;
&lt;li&gt;if が増え始めたとき&lt;/li&gt;
&lt;li&gt;呼び出し順が暗黙になったとき&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このタイミングで行う設計は、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断を構造として回収する行為&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;これは、遅すぎると致命的になります。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="動くものを作ってから考えるの落とし穴"&gt;「動くものを作ってから考える」の落とし穴&lt;/h2&gt;
&lt;p&gt;「まず動かす」は、非常に強力な考え方です。&lt;/p&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;strong&gt;その仮置きが、事実上の設計になる&lt;/strong&gt; からです。&lt;/p&gt;</description></item><item><title>第12章：設計ができる人は、何が違うのか</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/12-what-is-the-difference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/12-what-is-the-difference/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%AF%E6%AD%A3%E3%81%97%E3%81%95%E3%82%92%E6%8E%A2%E3%81%99"&gt;設計ができない人は、正しさを探す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AF%E5%A3%8A%E3%82%8C%E6%96%B9%E3%82%92%E8%A6%8B%E3%82%8B"&gt;設計ができる人は、壊れ方を見る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%AF%E5%AE%9F%E8%A3%85%E3%81%A7%E3%82%AB%E3%83%90%E3%83%BC%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B"&gt;設計ができない人は、実装でカバーしようとする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AF%E5%88%A4%E6%96%AD%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99"&gt;設計ができる人は、判断を減らす&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%AF%E3%81%82%E3%81%A8%E3%81%A7%E7%9B%B4%E3%81%99%E3%81%A8%E8%A8%80%E3%81%86"&gt;設計ができない人は、「あとで直す」と言う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AF%E4%BB%8A%E3%81%AF%E6%B1%BA%E3%82%81%E3%81%AA%E3%81%84%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B"&gt;設計ができる人は、「今は決めない」を決める&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%AF%E5%A2%83%E7%95%8C%E3%82%92%E3%81%BE%E3%81%9F%E3%81%90"&gt;設計ができない人は、境界をまたぐ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AF%E5%A2%83%E7%95%8C%E3%81%A7%E6%AD%A2%E3%81%BE%E3%82%8B"&gt;設計ができる人は、境界で止まる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AF%E8%AA%AC%E6%98%8E%E3%81%A7%E3%81%8D%E3%82%8B"&gt;設計ができる人は、説明できる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E4%BA%BA%E3%81%AF%E7%B5%90%E6%9E%9C%E3%81%A7%E8%AA%9E%E3%82%8B"&gt;設計ができない人は、結果で語る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AF%E6%9C%AA%E6%9D%A5%E3%81%AE%E8%87%AA%E5%88%86%E3%82%92%E8%A6%8B%E3%82%8B"&gt;設計ができる人は、未来の自分を見る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AF%E9%80%9F%E3%81%95%E3%82%92%E6%80%A5%E3%81%8C%E3%81%AA%E3%81%84"&gt;設計ができる人は、速さを急がない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;設計ができる人と、
できない人の違いは、
知識量ではありません。&lt;/p&gt;
&lt;p&gt;経験年数でも、
使っているフレームワークでもありません。&lt;/p&gt;
&lt;p&gt;違いが出るのは、
&lt;strong&gt;コードを書く前と後の「見え方」&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="設計ができない人は正しさを探す"&gt;設計ができない人は、正しさを探す&lt;/h2&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;strong&gt;正解を探す思考&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;しかし設計の世界では、
正解は一つではありません。&lt;/p&gt;
&lt;p&gt;必要なのは、
正解探しではなく、
&lt;strong&gt;壊れ方を想像する力&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="設計ができる人は壊れ方を見る"&gt;設計ができる人は、壊れ方を見る&lt;/h2&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;strong&gt;「失敗のルート」から設計を見る&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;のです。&lt;/p&gt;
&lt;p&gt;これは、
&lt;strong&gt;悲観的&lt;/strong&gt; という意味ではありません。
&lt;strong&gt;現実的&lt;/strong&gt; という意味です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="設計ができない人は実装でカバーしようとする"&gt;設計ができない人は、実装でカバーしようとする&lt;/h2&gt;
&lt;p&gt;判断が曖昧なとき、
設計ができない人は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if を足す&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;strong&gt;構造で解くべき問題を、実装で無理やり押し込んでいる&lt;/strong&gt;
状態です。&lt;/p&gt;
&lt;p&gt;一時的には動きますが、
壊れやすさは増えていきます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="設計ができる人は判断を減らす"&gt;設計ができる人は、判断を減らす&lt;/h2&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;</description></item><item><title>第13章：なぜ、速さが価値に見えてしまうのか</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/13-why-does-speed-seem-valuable2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/13-why-does-speed-seem-valuable2/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%80%9F%E3%81%95%E3%81%AF%E7%9B%AE%E3%81%AB%E8%A6%8B%E3%81%88%E3%82%8B"&gt;速さは、目に見える&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AE%E4%BE%A1%E5%80%A4%E3%81%AF%E6%99%82%E9%96%93%E5%B7%AE%E3%81%A7%E7%8F%BE%E3%82%8C%E3%82%8B"&gt;設計の価値は、時間差で現れる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BA%BA%E9%96%93%E3%81%AF%E6%9C%AA%E6%9D%A5%E3%81%AE%E4%BE%A1%E5%80%A4%E3%82%92%E5%89%B2%E3%82%8A%E5%BC%95%E3%81%8F"&gt;人間は、未来の価値を割り引く&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%9A%E5%8B%95%E3%81%8F%E3%82%82%E3%81%AE%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AF%E9%96%93%E9%81%95%E3%81%84%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;「まず動くものを作る」は、間違いではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%95%8F%E9%A1%8C%E3%81%AF%E9%80%9F%E3%81%95%E3%81%A7%E6%AD%A2%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%93%E3%81%A8"&gt;問題は、「速さで止まってしまう」こと&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%80%9F%E3%81%95%E3%81%AF%E8%A8%AD%E8%A8%88%E3%82%92%E5%85%88%E9%80%81%E3%82%8A%E3%81%AB%E3%81%99%E3%82%8B%E5%85%8D%E7%BD%AA%E7%AC%A6%E3%81%AB%E3%81%AA%E3%82%8B"&gt;速さは、設計を先送りにする免罪符になる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%9C%AC%E5%BD%93%E3%81%AB%E9%80%9F%E3%81%84%E4%BA%BA%E3%81%AF%E6%AD%A2%E3%81%BE%E3%82%8C%E3%82%8B%E4%BA%BA"&gt;本当に速い人は、止まれる人&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AF%E9%80%9F%E3%81%95%E3%82%92%E5%90%A6%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%84"&gt;設計は、速さを否定しない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81"&gt;この章のまとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;strong&gt;速さが価値として見える瞬間&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;なぜ、
こうなってしまうのでしょうか。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="速さは目に見える"&gt;速さは、目に見える&lt;/h2&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;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;strong&gt;その場では見えません。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="設計の価値は時間差で現れる"&gt;設計の価値は、時間差で現れる&lt;/h2&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;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;strong&gt;設計は未来のための仕事&lt;/strong&gt;
です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="人間は未来の価値を割り引く"&gt;人間は、未来の価値を割り引く&lt;/h2&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;p&gt;その結果、
&lt;strong&gt;設計より速さを選んでしまう&lt;/strong&gt;
のです。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="まず動くものを作るは間違いではない"&gt;「まず動くものを作る」は、間違いではない&lt;/h2&gt;
&lt;p&gt;ここで、
大事な補足があります。&lt;/p&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;strong&gt;動くものがないと、設計できない&lt;/strong&gt;
ことも多いです。&lt;/p&gt;</description></item><item><title>第14章：では、設計とどう向き合えばいいのか</title><link>https://design.okuda-studio.com/books/001-the-essence-of-design/14-how-to-deal-with-design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://design.okuda-studio.com/books/001-the-essence-of-design/14-how-to-deal-with-design/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E3%81%AF%E6%9C%AA%E6%9D%A5%E3%81%B8%E3%81%AE%E6%8A%95%E8%B3%87"&gt;設計は、未来への投資&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%9A%E5%B0%8F%E3%81%95%E3%81%8F%E6%AD%A2%E3%82%81%E3%81%A6%E5%88%A4%E6%96%AD%E3%82%92%E6%A7%8B%E9%80%A0%E3%81%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80"&gt;まず小さく止めて、判断を構造に埋め込む&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E5%A2%83%E7%95%8C%E5%88%A4%E6%96%AD%E3%82%92%E6%84%8F%E8%AD%98%E3%81%99%E3%82%8B"&gt;状態・境界・判断を意識する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%80%9F%E3%81%95%E3%81%A8%E8%A8%AD%E8%A8%88%E3%81%AF%E4%B8%A1%E7%AB%8B%E3%81%A7%E3%81%8D%E3%82%8B"&gt;「速さ」と「設計」は両立できる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E7%AB%A0%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81%E8%A8%AD%E8%A8%88%E3%81%A8%E3%81%AE%E5%90%91%E3%81%8D%E5%90%88%E3%81%84%E6%96%B9"&gt;この章のまとめ：設計との向き合い方&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%9C%80%E5%BE%8C%E3%81%AB"&gt;最後に&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;設計の本質は &lt;strong&gt;責任の分割&lt;/strong&gt; であり、
それを &lt;strong&gt;構造で保証する&lt;/strong&gt; ことが重要です。&lt;/p&gt;
&lt;p&gt;これまで述べてきた
&lt;strong&gt;判断を構造で表現する&lt;/strong&gt;
ことで、それが実現できます。&lt;/p&gt;
&lt;p&gt;では、実際の開発現場で、
私たちは、どのように設計と向き合うべきでしょうか。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="設計は未来への投資"&gt;設計は、未来への投資&lt;/h2&gt;
&lt;p&gt;設計は、未来のための行為です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;今すぐ動かすことが最優先の時もある&lt;/li&gt;
&lt;li&gt;その場で作るコードに価値がある&lt;/li&gt;
&lt;/ul&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;strong&gt;将来の自分やチームを守る投資&lt;/strong&gt; だと理解しましょう。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="まず小さく止めて判断を構造に埋め込む"&gt;まず小さく止めて、判断を構造に埋め込む&lt;/h2&gt;
&lt;p&gt;設計と向き合う第一歩は、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「まず止まること」&lt;/strong&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;strong&gt;コードの構造に落とし込む&lt;/strong&gt; のです。&lt;/p&gt;
&lt;p&gt;小さく止まることは、速さを失うことではありません。
むしろ、全体としての速さを保つための準備です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="状態境界判断を意識する"&gt;状態・境界・判断を意識する&lt;/h2&gt;
&lt;p&gt;設計と向き合う際の基本は、次の3つです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;状態&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;状態を正確に表現する&lt;/li&gt;
&lt;li&gt;ありえない状態を作れないようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;判断&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「やってよい／いけない」を構造で表現する&lt;/li&gt;
&lt;li&gt;型、API、オブジェクト生成条件、モジュール境界に集約する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;境界&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;判断や責任を閉じ込め、影響範囲を限定する&lt;/li&gt;
&lt;li&gt;モジュール間、画面間、レイヤー間で明確にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この3つは、別々の話ではなく、&lt;strong&gt;同じ設計の本質を違う角度で見たもの&lt;/strong&gt;です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="速さと設計は両立できる"&gt;「速さ」と「設計」は両立できる&lt;/h2&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;li&gt;状態を正しく管理する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このプロセスを繰り返すことで、コードは壊れにくく、かつ速く開発できるようになります。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="この章のまとめ設計との向き合い方"&gt;この章のまとめ：設計との向き合い方&lt;/h2&gt;
&lt;p&gt;設計とは、単なる図や抽象化ではありません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;設計は、責任を分割し、構造に落とし込み、判断を閉じ込めること。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;向き合い方のポイントは次の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;止まる勇気を持つ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;判断や責任が散らばる前に、構造に埋め込む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;構造を信頼する&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人に頼らず、構造が守る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;未来の価値を意識する&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;今の速さよりも、将来の保守性と拡張性を優先&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;小さく繰り返す&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>