Clean Code Cookbookは、「Clean Code」と名がつくが、Uncle Bobの同名書籍とは関係はありません。
ソフトウェア開発(主にソフトウェア設計)において、過去から言われてきた原則やプラクティスは山ほどありますが、それらを網羅するかのごとく、実装例およびコード改善例とともに紹介された本は多くはありません。Clean Code Cookbookは、SOLIDの原則やDRYの原則からA/Bテストなんかまで、レシピに関連して非常に多くのものが引用されています。
その点においては、ミノ駆動本との類似点があります。情報の詰め込み度でいうとClean Code Cookbookの方が上回るくらいです。
したがって、まだ経験の浅いソフトウェアエンジニアに、まずこれ読もう、という一冊になって欲しいのですが、現実はそうはなりません。(そもそもO'Reilly出版の洋書の単体価格が上昇しているのもあり、金銭面からも単体ではお勧めしにくい)
双射
本書で特徴的なのは、あらゆるシーンで設計の良し悪しを議論する時に、「双射(bijection)になっているかどうか」をよりどころにしている点です。
「モデルとは抽象的で部分的でプログラム可能な現実の物事の説明」と位置付けて、モデルが現実世界のものの捉え方と1対1対応していることを要求します。「抽象的で部分的で」というところが重要で、単なる現実世界との対応でないことに注意しなければなりません。Uncle Bobの「物事の表現は、それらが表す物同士の関連や結びつきを必ずしも共有しない」という説明も、この注意を言い表しています。
1対1対応していないと問題があるケースとして、現実世界としては別の概念として解釈されるもの(「1000円」と「1000メートル」は違う)を、ソフトウェアの中では単なる数値1000として扱うと、値の取り違えが発生する恐れが出てくる、という話が紹介されています。
逆に、現実世界としては同一性を持つものを、ソフトウェア上別の概念をモデルとして作るのはファットモデルを作ることに繋がります。現実世界の同じモノでも、ロールの違いによって振る舞いが異なるのであれば、このロールをモデルとして見出さなければなりません。
双射自体は重要なアイデアで、ドメイン駆動設計におけるユビキタス言語を構築するのに役に立ちます。が、ドメインレイヤでないところまで、双射にこだわると、過剰な設計につながることになります(そこまではClean Code Cookbookでは言及されていないので注意が必要です)。
パターン本の問題点
この本はCookbookと言う名のとおり、レシピ集すなわちパターンの形態をとっています。世の中に同様の形態の書籍も多く存在しますが、これらを読みこなすには注意が必要です。
パターンは最低限、以下の要素で構成されます。
- パターン名
- 問題: パターンが解決する問題
- コンテキスト: パターンを使うことが想定される利用者を限定する背景の説明
- フォース: 問題の状況のもとで、このパターンの解決策が有効となる状況や制約
- 解決策
ただ世の中に溢れるパターン形態の書籍は、コンテキストとフォースの記述が弱く、ただの「べき論」集に見えてしまうことがあります。
Clean Code Cookbookも残念ながら、コンテキスト、フォースが不十分で、「こういうコードは問題だ、だからこう書き換えよう」みたいにとれてしまうのです。
例えば、
- パターン名: DTOの削除
- 問題: 完全なオブジェクトを持ち、それらをレイヤ間で受け渡したい
- 解決策: 実オブジェクトを使用し、データオブジェクトを避ける。代わりに配列やディクショナリを使ってデータをやり取りもできる。
のようなレシピが本書には載っていますが、すべてのレイヤのやり取りにおいてDTOが悪かのように読めます。他のレシピもこのくらい「問題」の記述が薄いので、「えっ、そんな言い切っていいの?」みたいな解決策に見えてしまいます。
この例に関しては、暗黙のフォースとして「双射が適用されるところにおいては」があるの本の先頭から読んでいれば明らかです。しかし、この「本の先頭から読んでいれば」という前提は、つまみ読みできるレシピ集の書き方としては、残念ながら受け入れ難いものです。
パターン本の読み方
パターン自体は、現場の問題解決事例を多く観察し、そこに見られる共通の解法を抽出したものです。なので、どのパターン本に書かれているものも基本的には、単なる「僕の考えた最強の設計」ではありません。足りないのはコンテキスト、フォースなのです。
そこで、逆手にとって、コンテキストやフォースの不足を前提に補う読み方、「この解決策を適用するとよい場合とそうでない場合とは?」というのを、手がかりはそこ書かれているので、チームで話し合ってみたりすると学びになるのではないかと思います。