三流プログラマが脱三流するために書くブログ

PHP, オブジェクト指向プログラミング, デザインパターン, リファクタリング, DDD, 関数プログラミング, etc.

18. 「現場で役立つシステム設計の原則」を読んでいる

まだ流し読み程度ではあるんですが、久しぶりに発売日が待ち遠しい書籍だったこともあり、勢いで読書感想文を書いてみようと思います。熟読したらまた別エントリーで書くかも。

ドメイン駆動設計関連の本なのか?

著者の増田さんと言えば、ドメイン駆動設計の実践者として有名な方なので、当初は、ドメイン駆動設計の思想を踏まえた内容なのかな、と思っていました。

Eric Evans の「ドメイン駆動設計」という本は500ページを超えるボリュームの上に、分かりにくいと評判で(私はそうは思わないんですが)、本書を読むのにその前提知識が必要だと、ハードル高いよなぁと、勝手に心配しておりました。

本書では、「ドメイン」という言葉は頻繁に出てくるものの、「ドメイン駆動設計」はほとんど出てきませんし、何より、具体的なコードを例示して、どう書くと、変更が楽で安全にできるか、という説明がなされているので、Eric Evans の「ドメイン駆動設計」を読んでいなくても、十分内容は理解できるのではないか、と感じました。

前提知識はなくてもいいけど、参考書籍はあった方がいいかも

ただ、サービスとか値オブジェクトとか、DDD のコンテキストでも頻繁に使われるクラスの役割や、用法、特徴などについては、Martin Fowler の「エンタープライズアプリケーションアーキテクチャパターン」か、英語が読めるなら Catalog of Patterns of Enterprise Application Architecture 辺りを参考にするといいんじゃないかと思いました。

そういう意味で言うと、巻末にある参考文献は、どれも、本書を補完してあまりある名著揃い(全部は読んでないけど)なので、本書を中心に、色んな本を行ったり来たりしながら、実際に手を動かして、オブジェクト指向プログラミングのパワーを感じていくのがいいんじゃないかと思います。

ターゲット読者は?

ちらほら、業務システムという言葉が出てきたり、タイトルにも「設計」って入っていたりして、いわゆる SIer 系の SE、プログラマーが対象かな、と思いきや、BtoC のウェブサービスとか、日曜大工的にフリーウェアとかつくっているひとにも、完全にフィットすると思います。ある程度複雑なソフトウェアであれば、たいてい似たような問題(「変更すべき箇所があちこちに散らばって」いたり、「慎重に修正したはずなのに、思わぬ副作用に苦しむことに」なったり)に悩まされることになるし、「システム設計」っていうとダイアグラム書いたり仕様書書いたりするイメージが湧くかもしれないですが、本書では変数名のつけ方だったり、if/else を使った条件分岐の書き方だったり、実装レベルの話もたくさん出てくるし、そもそも設計しないで実装はできないので、自分はシステム設計はしないしなーと思っているプログラマー諸氏にもおすすめです(そういう意味で言うと、「システム設計」っていうくくりじゃなくて「ソフトウェア開発」っていうくくりの方が内容にフィットしてるんじゃないかと思いますね)。

ただ、DDD もそうですけど、作り切りで変更がほとんどされない想定のソフトウェアは対象外っていうか、あんまり恩恵を受けないでしょうし、変更容易性よりパフォーマンス第一で、とにかく高速に動作するようにバリバリにチューニングしないといけないようなソフトウェアをつくっているひとにも、あまりフィットしなさそうです。

技術評論社の紹介ページには「システム設計のポイントを知りたいエンジニア」とありましたが、これはスコープが狭いのではないか、 対象読者 = 変更容易性を高めたいと思っているすべてのソフトウェア開発者、ということでいいのではないか、というのが私の感想です。

オブジェクト指向プログラミングの入門書として

ざっと読んでみて、本書はオブジェクト指向の入門書としても使えるんじゃないかなーという感想を持ちました。

リファクタリング前後のコード例が載っていたり、「金額」や「区分」をどのようにクラスで表現するか、とか、モデルクラスと画面に表示するデータとの関連とか、オブジェクト指向パラダイムの初心者が読んでも学びは多いのではないかと思います。

私がオブジェクト指向を知ったのは遥か昔のことで(私自身はオブジェクト指向プログラミングを James O. Coplien の「Multi-Paradigm Design for C++」と Joshua Bloch の「Effective Java」で学びました)、もう当時の記憶や感覚がほぼ消え失せていて、オブジェクト指向の初心者が本書を読んでどう感じるか、というのは想像できないんですが、少なくとも、説明は丁寧で平易だし、良い設計にはどんな利点があって、悪い設計にはどんな問題があるのか、ということがきちんと書いてあるので、ひとりでは理解できなくても、読書会などで、オブジェクト指向を理解しているひとからサポートを受けつつ読み進めれば理解できるのではないかと思います。あ、もちろん、自分でコードを書かないと身につかないとは思いますが。

一例として、「区分」をクラス化することの利点について述べている箇所を引用しておきます。

クラスとクラスの関係は、知っていることが多いほど密結合になります。「知らない」ことが多いほど、クラス間の結びつきが弱くなります。結合が弱いほど、独立性が高くなり、あるクラスの変更が他のクラスに影響することが減ります。多態は、区分ごとのロジックをクラス単位に分離してコードを読みやすくするオブジェクト指向らしいしくみです。区分を追加や削除をしてもあちこちのコードを修正する必要はありません。区分ごとの判断ロジックや計算式の変更の影響は、特定の区分クラスに閉じ込めることができます。if 文/ switch 文を駆使して場合分けを記述する手続き型のプログラムは変更がやっかいで危険です。それに比べ、多態を使ったオブジェクト指向らしい区分の書き分け方は、変更を楽で安全にします。 現場で役立つシステム設計の原則

まとめ

  • ドメイン駆動設計を知らなくても(表向きは)あまり関係なさそう
  • コード例が豊富なので、自分でコードを書きながら学べる
  • オブジェクト指向入門の参考書としていかがでしょうか
  • とは言え、参考書籍は並行してもいいし追っかけでもいいので読むといいと思う

参考

以前札幌でお会いして話したときも、平易な言葉で丁寧にアドバイスくださって、色々もやもやしてたものが晴れました。大変ありがたかったです。

nunulk.hatenablog.com