オブジェクト指向がよりよりプログラミングをするためには必須の知識であることは,たびたび解説しているとおりですが,オブジェクト指向を学ぶということはデザインパターンを学ぶということと気がつき,いろいろなデザインパターン本を読んでいましたが,そんなときドメイン駆動開発という記事を発見しました。
ドメイン駆動開発
ドメイン駆動開発はオブジェクト指向設計全体を最適化してコーディネートするような考え方で,大変有益な情報であるように思いました。
ファーストクラスコレクション
私の見た記事では,ファーストクラスコレクションが紹介されており,プログラムの中にあるリストをひとつのクラスに抜き出し,リストを操作するためだけのクラスを作るという考え方でした。
要するにprivateでListを宣言することでListをカプセル化し,リストにまつわるエトセトラはすべてこのリストを持つクラスで操作するという考え方でした。
カプセル化という概念をとても洗練した形で具現化しているデザインパターンだと感じました。
さらにその記事の中では,受注明細の合計値を誰が計算する?というような問題提起をしており,結果的に受注クラスの中に受注明細をリストにしたprivate変数を持つのではなく,受注明細というファーストクラスコレクションを作成し,合計値などはその受注明細であるファーストクラスコレクションに処理をさせるという考え方でした。
この考え方には衝撃を受けました。
後は,顧客クラスのようなものに,名称などの項目がある場合に,顧客の上限文字数は誰がチェックする?というような問題提起をされていました。通常は顧客クラスでのチェックを行いがちですが,バリューオブジェクトという考え方を取り入れ,顧客クラスの顧客名称は顧客名称クラスにさせるという,クラスを最小単位で作成する考え方に感銘を受けました。
2人の巨匠の話
その中で2人の巨匠の本を紹介されていたのでスグに私は買いました。
ケントベックの実装パターンという本と,マーチンファウラーのリファクタリングという本でした。実装パターンは廃刊になっていましたが古本で買いました。リファクタリングも当時は廃刊になっていたので1万円というめちゃくちゃ高値でしたが買いました。その後,改版本が5000円くらいで出たのでもったいない気持ちもありましたが,情報を少しでも速く取り入れられたことには,5000円以上の価値はあったと思い,気を取り直しました。
実際にそれは本当にそう思います。どんなに低価格でも,年齢を重ねてから知識を得るよりは,少々高額でも若いうちに知識を得ていたほうが,パワーアップした自分でその後の人生を歩むことができるので,本を読むのは速いに越したことがありません。
ケントベックの実装パターンでは「完全コンストラクタパターン」に感銘を受けました。マーチンファウラーのリファクタリングはテストコードの必要性を教えてくれました。
悪いコードの動作を変えずに,コードだけよりよくすることを「リファクタリング」と読んでいます。リファクタリングの基本は,事前に悪いコードに対してテストコードを記載し,その後コードを書き換えます。常にテストを行い,バグの混入を防ぎながら,既存のコードを改造していくという考え方に衝撃を受けました。
テスト駆動開発との出会い
これまでテストコードを書かずにコーディングしていた自分が恥ずかしくなりました。偉人たちは10年以上前からこんなプログラミングをしていたのか!グーグルもマイクロソフトも頭のいい人が働いていて,こうやってテストコードを書いて,昔からガンガンコーディングをしていたのに,私はテストコードも書かずに,文法プログラミングをしていたかと思うの,情けなく,悲しくなり,今まで書いたコードをすべて書き直したくなりました。
一度リリースしたら,簡単にはコードを書き換えることができないのがこの業界の悲しいところですね。そしていつまでの自分のコードが残っているため,後輩にも昔のコードを見られてしまいます。恐ろしい業界です。
ということで,この段階でドメイン駆動開発に出会うことができましたが,どうやら,ドメイン駆動開発はテスト駆動開発とともに実装する必要があることの気がつきました。結局,オブジェクト指向,デザインパターン,テスト駆動開発,リファクタリング,ドメイン駆動開発の順で学ぶのがよさそうであるとこのころ感じ始めました。
この賢者2人との出会いにより,このころから爆速でドメイン駆動開発に関して学び始めました。学び方はというと,基本的には本を読むことになります。ドメイン駆動の本で言うと,日本語で読めるのは4冊くらいしか出てません。テスト駆動関連の本は結構出ていますが,テスト駆動は実際に実装していく中で体得していくものという感じですね。
- C#erが5年目までに学ぶべき7ステップ!!
- C#を勉強する順番!オブジェクト指向からドメイン駆動開発まで#1-1
- C#を勉強する順番!とりあえず最低限の文法や開発環境の使い方の知識は必要#1-2
- C#を勉強する順番!WindowsFormsプログラミングで電卓なんかを作ってイベントなどを使えるようにする#1-3
- C#を勉強する順番!企業でのシステム開発とかだとDBを使うのでC#とDBをつなげる技術#1-4
- C#を勉強する順番!ボタンクリックイベントにだらだら書くのはなんか違う気がしてくる#1-5
- C#を勉強する順番!良いプログラミングのお手本がないとどうして良いのかわからない#1-6
- C#を勉強する順番!プログラミング初級講座とかいう大手の研修を受けてみたが#1-7
- C#を勉強する順番!良いプログラムとはリーダブルコード?コーディングルールを学ぶ#1-8
- C#を勉強する順番!第2章 オブジェクト指向との出会い#2-0
- オブジェクト指向を学ぶって事はデザインパターンを学ぶって事なんだな#2-1
- ドメイン駆動開発がオブジェクト指向をうまくコーディネートしていて最強みたい#2-2
- C#を勉強する順番!ドメイン駆動開発をするにはテスト駆動開発の知識が必須?#2-3
- C#を勉強する順番!テストコードのないプログラムは全部レガシーコードって呼ぶらしい#2-4