【読書録】現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法
この本の読書会、途中で抜けちゃったけどちょくちょく読み進めていたので読書録残します。
同じ読書会のメンバーのkassyiさんが毎回記録を残してくださったので こちらもぜひ。 読書会中に話題になった本に関連することもあって面白いです。
読んでみようとした経緯
- 読書会で読むことになったため
読むモチベーション
- 良書だと聞いて
- オブジェクト指向設計を具体的にどんな考え方でどうコードに落とし込んでいるか、増田さんの考え方を知りたい
- 意図が伝わりやすいコードを書きたい
- 変更しやすいコードを書きたい
概要
オブジェクト指向プログラミング、オブジェクト指向設計を使って変更を安全にすばやくできるようにしようという趣旨です。 前半はコードを書く上での考え方やテクニックで、後半は全体的なアーキテクチャの話です。 プログラミング自体の初心者よりは、ある程度自力で書けるようになった人が次のレベルに行くといったレベル感です。
この本で特に学びになったこと
1. 具体的な条件分岐の書き方
この著書は前半だけでも読む価値が高いと思いました。
前半ではDDDでいうところの値オブジェクト、ドメインサービスの考え方と実装方法を具体的な業務システムの例と共に紹介しています。 エヴァンスさんの原書を理解するのが難しかった自分にとって、これらを扱った章は嬉しかったです。
特に、状態をEnumで表現し、状態遷移を遷移前の状態と遷移後の状態のSetの2つの組み合わせで管理するという考えは、積極的に使おうと思いました。 このテクニックは、特定の定数の列挙を表現するEnumの特性を適切な箇所で活かしているプログラミングです。 誤った状態に遷移することを防ぐだけでなく、遷移を管理するクラスを見るだけで何から何に遷移するのかの仕様が一目で見れるのは秀逸です。
2. クラス図の考え方
クラス図はどのクラスがどんな責務を持っているかを書く図です。属性やn対mなどのクラス間の関係を書くのはER図。 歴が浅い人はクラス図に見せかけたER図書きがちと読書会でとあるベテランさんが怒ってらっしゃったのを思い出しました。
テーブル構造をまんま反映したクラスしか使わないFWしか出来なかったら頃にそれをやったので、改めて胸に刻みした笑 どんな風にクラス図を作成するのか、書かれていました。
クラス図はロジックに着目しています。誰が何をする業務の流れになっているのか。業務にはどんなものが必要なのか。
例えば、図書館の貸し出し管理システムなら、利用者が本を借りなければ返却することはできません。 ですから、返却の前に必ず貸し出しがあります。
貸し出しは本がないと出来ないので貸し出し処理と本はセットで… 返却には返却日が必要なので貸し出し時に計算して… というようにどんな処理をする必要があるのか、どんなデータが必要なのか、データはどういうロジックで導き出されるのかを考えます。
業務の関心ごとはヒト・モノ・コトで整理するそうです。特にコトを中心に自然言語でまず業務を整理します。コトを整理すると、ヒトやモノも見えてきて、データやロジックに落としこみやすいです。コトを中心に広げていくのが良いなと思いました。ちゃんと整理した状態で作るのでプログラムにも落としこみやすいし、こういう風に作られたクラス図をベースにすると、流れが分かり易いプログラムが書けそうです。
この本と一緒に読むと面白そうな本
1. ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
https://www.amazon.co.jp/dp/B082WXZVPC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
「現場で役立つシステム設計の原則」では、戦術的DDDについては値オブジェクト・ドメインサービスを重点的に扱っていますが 「ドメイン駆動設計入門」ではより多くの戦術的DDDの手法を扱っています。 こちらも具体的なコード付きで解説しています。 「現場で役立つシステム設計の原則」で扱っている以外の戦術的DDDの手法を知りたい人におすすめです。
2. オブジェクト指向でなぜつくるのか 第2版
オブジェクト指向が誕生するまでの歴史を機械語からたどっています。
機械語、アセンブリ言語、手続き型言語、オブジェクト指向… それぞれどんな背景で誕生し、どんな課題が生まれて新しいプログラミング手法の誕生につながったのか。プログラミング手法の特性を歴史という観点から知ることで、また考えが深まった気がします。
この本は実務に直接役には立ちません。しかし、オブジェクト指向誕生以前のプログラミング手法の問題点とオブジェクト指向がどう解決したのかを知ることで、オブジェクト指向を生み出し改善してきた人たちにリスペクトして特性を活かして書こうというモチベーションになる気がします。