はじめに
プログラマ歴だいたい7年くらいになるプログラマですが、DDDやオブジェクト指向が好きで、学びのお陰で日々のプログラミングが楽しくなってきたので、あくまでの個人的ですがためになった本とその考え方を紹介します。
メジャーな本が多いため既にご存知の方も多いと思いますが、上級者を目指したいと思っている初心者、初級者にはためになる?と思います。
こめ
オブジェクト指向のざっくりとした理解
①コードコンプリート 完全なプログラミングを目指して
プログラマ3年目ころに読みましたが、本書は学術的なベストプラクティスが商用プラクティスに普及するのに5年から
15年かかることを指摘し、ベストプラクティスの普及のために書かれています。学術的な研究成果と実践を結びつけているのが本書の目的のため、論文の研究成果とベストプラクティスのコードをセットで学ぶことが出来ます。
P151〜にクラスの作成でオジェジェクト指向(クラスや抽象データ型(ADT))について学ぶことが出来ますし、必ずしもオブジェクト指向を使えば効率的になるわけではないケースなど、あくまで中立的に見方も学ぶことが出来ます。
※変数の寿命、防御的プログラミング、テーブル駆動開発からはじまり、if文の条件書き方や良い変数名の付け方まで徹底的に書かれているため、オブジェクト指向だけだはなくプログラミングの基本が学べるため初心者🔰に特にオススメです。
個人的には、NASAなど大規模で厳密性の要求される開発のソフトウェア開発プロセスが実例で出るなど、豊富な実例と著者の各プラクティスへの深い洞察を学べるのが読んで良かったと思ったポイントでした。
クラス設計とオブジェクト指向の原則(SOLID)
②アジャイルソフトウェア開発の奥義 オブジェクト指向開発の真髄と匠の技
アジャイルアライアンスに著者のロバート・C・マーチンも名を連ねており、アジャイル開発の原則とアジャイル開発に必要なオブジェクト指向の原則とデザインパターンを説明してくれます。GoFのデザインパターンはあくまで、設計のリファレンスのためアーキテクチャや設計に長けた上級者向けの情報となり、初心者には敷居が高く、まずオブジェクト指向の原則(SOLID)を理解してから、デザインパターンやDDDなど他のプラクティスを学ぶと良いと思います。
アジャイル開発は、要求仕様の変更を前提としており、変更に強い設計が求められるという背景から、オブジェクト指向の原則も変更に強いプログラムを開発するための原則集となっています。
・Single Responsibility Principle 単一責任の原則 (SRP)
・Open Closed Principle オープンクローズドの原則 (OCP)
・Liscov Substitution Principle リスコフ置換の原則 (LSP)
・Dependency Inversion Principle 依存性逆転の法則 (DIP)
※DIP はDDDやCleanArchitectureの中でも登場するため、知っておくと良いと思います。
下記はSRP簡単な事例ですが、Employeeクラスに別々のアクター(利用ユーザ)のための関数が一つのクラスにまとまっていますが、変更理由(対象アクター)が複数のため、SRPを違反していることになります。例えば、 CFOのために新人プログラマがcalculatePayを変更しようとして、Employeeクラスにバグを埋め込んだとしたら、COOやCTOの業務にも影響してしまいます。ソフトウェアは、変更することが前提のため、アクターごとに別クラスに分割することで、影響範囲を限定することが可能になります。
class Employee
#アクターCFOのためのメソッド
def calculatePay(amount)
#CFO(経理・会計)ドメインの何らかの処理
end
#アクターCOOのためのメソッド
def reportHour()
#COO(人事)ドメインの何らかの処理
end
#アクターCTOのためのメソッド
def save()
#CTO(情報システム)に関するドメインの何らかの処理
end
end
オブジェクト指向エクササイズ カプセル化の体感
③ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション
個人的にオブジェクト指向を体感するのは、これが一番オススメです。①、②上記はあくまで知識集で指針を与えてくれるものの、強制力が少し弱く、いざ日々のプログラムに適用していくのには、努力が必要になるかもしれません。出来たら本を手にとって各ルールを実践していくと、オブジェクト指向((振る舞いとデータの)カプセル化)が体感出来ると思います。
1 一つのメソッドにつきインデントを1段落までにすること
2 else区を使用しないこと
3 すべてのプリミティブ型と文字列型をラップすること
4 一行につき、ドットを一つにすること
5 名前を省略しないこと
6 すべてのエンティティを小さくすること
7 一つのクラスにつきインスタンス変数は2つまでにすること
8 ファーストクラスコレクションを使用すること
9 Getter,Setter,プロパティを使用しないこと
※オブジェクト指向を養成するための一時的なギブスなので、本番のコードで上記のルールが適用されるべきというものではないので注意してください。
提唱者JeffBay(ThoughtWorks社)は、 ②else句を使用しない、⑤名前を省略しないこと以外すべて、カプセル化についてのエクササイズであり、エクササイズの目的はコードレベルや概念レベルで重複のないコードを作り上げることであると述べています。
例えば、⑨を適用することで、GetterやSetter、プロパティに直接アクセつできなくなるため、オブジェクト自身に処理を委ねる設計となります。オブジェクトの知識が流出せず、結果として、一つのクラスにデータと振る舞いが集約され重複のないコードとなります。実際に上記のルールで書かれたソースコードはとてもシンプルで、見やすく、時間がたっても理解がしやすいものとなります。
まとめ
初見ですと、オブジェクト指向エクササイズの一つ一つのルールの意味は分かりにくいですが前提知識が必要なく明日から実践可能できるし、ルールを実践することで頭ではなく体でオブジェクト指向的プログラミングが理解できるようになると思います。