感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

疎結合って何?なんで疎結合なのがいいの?

スポンサーリンク

疎結合であるとはどういうことか

コンポーネント疎結合であるとは、どういうことだろうか。
それは、インターフェースを明確に定義することで、コンポーネント間のやり取りと、コンポーネントの実装を分離している状態のことだ。
コンポーネントのインターフェースに変更がない限り、内部の実装に変更を加えても関連するコンポーネント間に問題は発生しない。
コンポーネントは、本の中では

コンポーネントとは、他のソフトウェアが使用できる明確に定義された既知のインターフェースを持った、自己完結型のソフトウェアです」

と定義されている。
わかりづらいけれど、要はそれぞれの機能ごとに分けられた塊のようなものだ。

これだけだと、抽象的過ぎてわからない。

たとえば、ツイッターのAPIを使って、ツイッタークライアントを作ることがあるだろう。
そのとき、特定のURLにリクエストを送ることで、必要なデータが送られてくるはずだ。

使う側(クライアント)から見て、ツイッターのデータを送る側の実装がどうなっているのか意識することはない。
明確なインターフェース(ここではURL)が決められているから、中の実装の変更は影響しないのだ。

なぜ疎結合な設計をする必要があるのか

拡張に柔軟に対応するためである。
開発者は普通、ソフトウェアがどのように進化していくかをある程度は想定するが、ソフトウェアが大きくなるにつれて、予期せぬ使われ方をされることが増えてくる。
新たな要求も増えてくる。
そんなとき、拡張可能な設計をしていないと、複雑で難しい対応をせざるを得なくなる。
最終的には、プログラムの中で最初に拡張可能にしなければならない部分を割り出し、その部分を組み込みなおすためにプログラムの大部分を書き直すことになる可能性がある。

拡張性とは

ソフトウェアの拡張性とは「いかに変更に容易に適応できるかどうか」である。
依存関係が多いと、あるプログラムの変更が他のプログラムに影響を及ぼし、変更を行うごとに大量のテストが必要になる。
依存関係をなるべく少なくすることで、変更の影響を少なくすることが、拡張性を高めるための第一の方法である。
拡張性を高めるには、以下の様な観点がある。
・分離
コンポーネントが独立して変更できること
・集中化
→機能を集中させること。ある機能が複数のコンポーネントに分散していると、単純な変更が多くのコードに影響を及ぼす可能性がある。
・再利用
→共通機能を再利用可能なコンポーネントカプセル化する。

読んだ本

J2EEデザインパターン

J2EEデザインパターン