ベックのデザインルール
2015年3月2日
ケント・ベックは、1990年代後半にエクストリームプログラミングを開発していた際に、シンプルなデザインに関する4つのルールを考案しました。私はそれらを次のように表現します。[1]
- テストに合格する
- 意図を明らかにする
- 重複がない
- 要素が最小限である
これらのルールは優先順位に従っており、「テストに合格する」が「意図を明らかにする」よりも優先されます。
ルールの中で最も重要なのは「テストに合格する」です。XPは、ソフトウェア開発においてテストを第一級の活動に高めた点で画期的でした。したがって、テストがこれらのルールで重要な役割を果たすのは当然です。重要な点は、ソフトウェアで他に何をするにしても、主な目的はソフトウェアが意図したとおりに動作することであり、テストはそれを確実にするために存在することです。
「意図を明らかにする」は、コードが理解しやすいものであるべきだというケントの言い方です。コミュニケーションはエクストリームプログラミングの中核的な価値観であり、多くのプログラマーはプログラムは人が読むために存在することを強調しています。ケントのこのルールの表現方法は、理解を可能にする鍵は、コードに自分の意図を表現することであり、それによって読者がコードを書いたときの目的を理解できることを示唆しています。
「重複がない」は、これらのルールの中で最も強力で微妙なルールかもしれません。これは、DRYまたはSPOT[2]としても表現されている概念ですが、ケントはすべてが「一度だけ、一度だけ」言われるべきだと言っています。多くのプログラマーは、重複を排除する行為が優れたデザインを生み出す強力な方法であることを観察しています。[3]
最後のルールは、前の3つのルールに役立たないものはすべて削除する必要があることを示しています。これらのルールが策定された当時は、将来の要件に柔軟性を持たせるために、アーキテクチャに要素を追加することに関する多くのデザインアドバイスがありました。皮肉なことに、これらの要素の余分な複雑さによって、システムは通常、変更がより困難になり、実際には柔軟性が低下しました。
人々はしばしば「重複がない」と「意図を明らかにする」の間に緊張関係があることに気づき、それらのルールをどちらの順序で表示すべきかについて議論につながります。私は常にそれらの順序を重要ではないと考えてきました。コードを洗練する際に互いに影響し合うからです。明快さを増すために重複を追加するようなことは、問題の解決を先送りしていることが多いので、解決した方が良いでしょう。[4]

これらのルールについて私が気に入っているのは、非常に覚えやすいのに、それに従うことで、私が扱ってきたどの言語やプログラミングパラダイムでもコードが改善されることです。これらは、一般的に適用可能でありながら、私の行動を形作るのに十分なほど具体的な原則を見つけるケントのスキルの例です。
当時、「デザインは主観的なものである」「デザインは好みの問題である」といったくだらないことが蔓延していました。私はそれに反対しました。デザインには良いものと悪いものがあります。これらの基準は完璧ではありませんが、明らかなくだらないものを整理するのに役立ちます(そして重要なこととして)いますぐに評価できます。デザインの品質に関する真の基準である「ソフトウェアのライフサイクル全体にわたってコスト(遅延のコストを含む)を最小限に抑え、利益を最大化する」は、事後的にしか評価できず、その場合でも評価は認知バイアスの大きな塊に左右されます。4つのルールは、一般的に予測可能です。
-- ケント・ベック
参考文献
これらのルールに関する多くの表現があります。ここでは、検討する価値があると思うものをいくつか紹介します。
- J.B.レインズバーガーの要約。彼はまた、ルール2と3の相互作用についても議論しています。
- ロン・ジェフリーズ
- これらのルールは、エクストリームプログラミングの他の多くのことと同様に、もともとワードのWikiで議論され、改良されました。
謝辞
ケントは、この投稿をレビューして、非常に役立つフィードバックを送ってくれました。その多くを私はテキストに取り入れました。
注
1: 信頼できる定式化
4つのルールについては多くの表現があり、ケントは多くのメディアでそれらを述べており、他の多くの人々もそれらを気に入って、独自のやり方で表現しています。そのため、ルールの説明はたくさんありますが、各著者には独自の解釈があります。私も同様です。
本人からの信頼できる定式化が必要な場合は、おそらくホワイトブック(57ページ)の初版のXPのシンプルなデザインの実践を概説するセクションを参照するのが最善でしょう。
- すべてのテストを実行する
- 重複したロジックがない。並列クラス階層のような隠れた重複に注意してください
- プログラマーにとって重要なすべての意図を述べる
- 可能な限り少ないクラスとメソッドを持つ
(混乱を招くためだけに、「すべてのテストを実行する」を省略し、「最も少ないクラス」と「最も少ないメソッド」を最後の2つのルールに分割した別の定式化が109ページにあります。これは、ケントがホワイトブックを書いている間に改善した初期の定式化だったと記憶しています。)
2: DRYは、Don't Repeat Yourself(同じことを繰り返さない)の略であり、プラグマティックプログラマーから来ています。SPOTはSingle Point Of Truth(単一の真実の点)の略です。
3: この原則は、私のIEEE Software向けの最初のデザインコラムの基礎でした。
4: この投稿をレビューしたとき、ケントは「まれにそれらが対立する場合(テストが私が思い出せる唯一の例です)、共感が技術的な指標に優先します」と言いました。共感に関する彼のポイントは気に入っています。コードを書くときは常に読者のことを考えるべきだということを思い出させてくれます。