書評:C#実践開発手法

C#実践開発手法 (マイクロソフト公式解説書)

C#実践開発手法 (マイクロソフト公式解説書)

この本を読み終わったので、感想を書きます。

ちなみに、普段Javaで開発しているので、C#に特化した部分は、読み流した感じです。

導入

メインテーマ:アダプティブコードとは?

意味

コードを大幅に変更することなく、新しい要求や予想外のシナリオに対処する適応力のあるコードのことを指しています。

目的

要求は変化する可能性があるので、変更にどのように対処するかが、成功するソフトウェアプロジェクトかどうかの決め手になります。

そのため、アダプティブコードと表現されている適応力のあるコードが、これからは必要になってきます。

本書の内容

アジャイル開発を用いて、アダプティブコードを実装するためのプラクティスを紹介しています。

具体的には、デザインパターン、SOLID原則などの考え方をどう実現すればいいのか?をコードも含めて説明しています。

また、インターフェースという考え方を、しつこいくらいに説明しています。

なので、普段、インターフェースに馴染みのない人は、インターフェースの重要性が実感できると思います。

重要な章:2章 依存関係と階層化

全ての章を読みましたけど、「2章 依存関係と階層化」が一番重要だと感じました。

理由としては以下です。

  • この章が一番網羅的に説明されている。

  • 実際のプロジェクトにおいて、開発チームメンバー全員が理解すべき内容。

  • この章の考え方を基本にして、次章以降の各章が説明されている。

ということで、「2章 依存関係と階層化」をまとめていきます。

概要

依存関係の構造を理解していないと、あるモジュールの変更が、別の無関係に思えるモジュールで副作用となって現れることがあります。

そのため、アダプティブコードを実現するためには、依存関係を効果的に管理する必要があり、最も一般的なパターンに階層化があります。

依存関係の定義

依存関係は2つの概念間の関係であり一方が存在しなければ、もう一方が何らかの機能を実現できない、あるいは存在し得ないことを意味します。

以下の例だと、クライアントはサービスに依存しているということになります。

f:id:mmm-mao:20150802101026p:plain

依存関係の管理

概要

依存関係をうまく管理しないと、小さな妥協があっという間に全体的なアーキテクチャの問題に発展します。

そのため、依存関係を最初から正しく管理し、問題が入り込む余地がないように注意する必要があります。

不吉な匂い

依存関係の不吉な匂いの例として、「newキーワードを使ったオブジェクトの生成」がありました。

不吉な匂いの理由は以下です。

  • 実装を拡張することが不可能:依存元と依存先のどちらも編集しないで拡張することができない。

  • 依存関係の連鎖:依存先が依存しているモジュールも、依存元は暗黙的に依存していることになる。(次に出てくるEntourageアンチパターンのこと)

  • テスタビリティの欠如:依存先をモックに置き換えることができないので、依存元のテストが難しくなる。

この不吉な匂いに対する対応案として、依存性の注入(DI)が挙げられています。

※余談ですが、これからのフレームワークを選定で、依存性の注入をフレームワークがサポートしている。っていうのは必須の要件ですね。

Entourageアンチパターン

インターフェースに対するプログラミングを説明するときにありがちな間違いとなります。

内容としては、単純なものを1つ要求したはずなのに、余分なものまで全て引き連れてくるという望ましくない依存管理の管理を表しています。

例えば、以下のような関係の時に、コントローラパッケージだけビルドすると、データソースパッケージに暗黙的に依存しているため、結局ビルド後には、永続化の手段が把握できる状態になります。

f:id:mmm-mao:20150802102536p:plain

なので、このアンチパターンは、インターフェースと実装が同じパッケージに含まれている時に発生します。

そのため、インターフェースと実装は別パッケージに切り出すことが原則となり、具体的な手段が次に説明するStarwayパターンとなります。

Starwayパターン

クラスとインターフェースを構成するための正しい方法と説明しているパターンです。

このパターンを適用することにより、依存先はインターフェースが含まれるパッケージのみになり、暗黙的にも実装が存在するパッケージに依存しないことになります。

具体的なパッケージ図は以下の通りです。

f:id:mmm-mao:20150802103141p:plain

階層化

相互にやりとりしながらアプリケーション全体を構成する機能の水平レイヤーとしてコンポーネントを捉えることです。

コンポーネントは他のコンポーネントの上に層状に積み重ねられ、依存関係は常に下に向いている必要があります。つまり、一番下のレイヤーには依存関係がないということです。

僕は普段ドメイン駆動設計で開発しているので、ドメイン駆動設計の例だと、以下のような階層化になります。

f:id:mmm-mao:20150802103608p:plain

2章 依存関係と階層化のまとめ

ソフトウェアの安定性、適応性を長期的に確保するためには、依存関係を正しく管理できるかどうかにかかっています。

正しく管理するためには、全ての開発者が、所属しているチームの依存関係の方針を理解して開発することが重要になってきます。

そのため、依存関係の大切さや所属チームの依存関係の方針がいつでも観れる図をチームで共有することが大事です。

まとめ

本書は、アジャイルプロセス(※1)とアジャイルプラクティス(※2)の両方にフォーカスを当てているので、実際の開発する際に参考になる部分がとても多いです。

あと、実際のコードもたくさん出てきているので、写経しながら進めていくと、この本に書かれていることをより深く理解できると思います。

ということで、現場でアダプティブコードを実現したい方には、オススメです。

個人的には、「アジャイルソフトウェア開発の奥義 第2版」よりもこっちの本のほうが、今の時代に合った説明になっていると感じました。

  • ※1:アジャイルプロセスは、ソフトウェア開発チームがフィードバックを迅速に引き出し、それに応じて目標を切り替えるための方法を提案

  • ※2:アジャイルプラクティスは、同様に方向転換が可能なコードをソフトウェア開発チームが記述するための方法を提案