オブジェクト指向を理解するためにはデザインパタンを学ぶ必要があります。いろいろとデザインパターンの本は出ていますが,有名ものがGOFのデザインパターン本ですね。
ある程度デザインパターンを学ぶとひとつの疑問にぶち当たると思います。
「アプリケーション全体として、これらの知識をどう適応すべきか?」
そうです。デザインパターンは1つ1つが洗練されていてすばらしいプログラム設計のノウハウになっています。しかし,アプリケーションを作るときに,どのように適応するのが正しいデザインパターンの使い方なのかを説明してくれている書籍はあまりありません。
文法の本はifの使い方が書いているだけだし,デザインパターンの本はパターンがそれぞれに書いてあるだけです。オブジェクト指向本も原則が書かれているだけです。
純粋に1つのアプリケーションのサンプルが載っていたり,アプリケーション全体の設計手法を本にしたものはあまりありません。
ドメイン駆動開発の書籍を手にとってもらうと,それらの問いに対する答えがある程度か枯れています。
ドメイン駆動開発は,プログラムの複雑さを取り除き,オブジェクト指向設計を最適化する考え方です。なので,全体の設計というものの指針になります。
ドメイン駆動開発をするにはテスト駆動開発の知識が必須?
ドメイン駆動開発をする上でテスト駆動開発の知識は必須になります。テストコードを書かなくてもドメイン駆動開発のデザインパターンは適応できますが,オブジェクト指向を最適化するという意味からしても,テストコードを先に書き,必要最低限の本番コードを書きながら,テストしやすい構造のプログラミングをするというのは,必須知識となります。
リファクタリングのときもそうですが,プログラムを書く前にテストコードを書くというのは,現代のプログラミングにおいて,必須知識です。
テストコードを書くということは「クライアントコード」を書くということです。使う側がどのように使うかを想定し,「こんな関数を呼び出して,こんな戻り値がほしい」という使う側に最適なテストコードを書くわけです。サービスする側のコードは,その要望にこたえられるように本番コードを実装します。
テストコードを書くことで,プログラム全体が疎結合になります。疎結合とは,プログラムの結びつきのが弱いことを言います。個々のプログラムの結びつきが弱ければ,修正がしやすくなります。ドミノ倒しのストッパーのように,失敗してドミノを倒してしまっても,一定のところで止まります。それがないと,すべてが倒れてしまいます。要するに,プログラムの一部を変更しただけなのに,アプリケーション全体を再テストしないといけなくなります。
疎結合ということは,プログラムを修正しても,影響範囲がどこまで広がるのかが明確になります。ドミノのストッパーまでをテストすれば,あとはテストしなくても問題ないことが分かります。オブジェクト指向でのストッパーはインタフェースという機能が担ってくれます。テスト駆動開発では,インタフェースの使いどころが重要になります。外的要因に振り回されないようにインタフェースを使用して,ドミノのストッパーにしていきます。
外的要因とは,C#アプリケーションの外側の話です。例えば,SQLServerを使っていて,バージョンがあがって,とある関数が使えなくなったとしましょう。SQLServerから流れ込んでくるルートが限定されていれば,そのルートのテストを行えば,それ以外のテストは不要になります。だから,SQLServerと接触するときは必ずインタフェース越しに値を取得する必要があります。
インタフェースってすごく重要だったんだ
テスト駆動開発をすると,このように,オブジェクト指向での実装がすんなり入ってきます。先の例でうまくお伝えできたか分かりませんが,ドミノ倒しのストッパーになるインタフェースが非常重要であることを,私はテスト駆動開発を学んでようやく理解しました。
恥ずかしながら,テスト駆動開発をするまで,インタフェースってなんのためにあるのだろう?if文で分岐すれば別に困らないのになー、、、と本当に恥ずかしいほど無知な考え方をしていました。
今ではインタフェースなしにプログラムをする気にはなりませんし,テストコードを書く上で,インタフェースがないテストコードなどは存在しません。
まとめ
というわけで,ドメイン駆動開発をする場合も必ずテスト駆動開発の知識が必要となります。その証拠に,ドメイン駆動に関する書籍を読むと,必ずそのうちの1章はテスト駆動開発に関しての記述があります。海外では常識になっていたようですが,日本ではVisualStudioの2008のPro版より標準搭載されたものの,私は,その重要性に気がつかず,2012年まで使用していませんでした。いまでは無料版のVisualStudioでもテストコードが書けるようになっていることからも,プログラミングの世界では常識であり,必須の知識がテスト駆動開発ということになります。あなたの職場でテスト駆動開発を知らない人間がいたら,必要性を教育してあげてください。
- 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