【基礎講座】疎結合と密結合なコードの違いとは?

疎結合、密結合の違いとは

最近話題のJavascript フレームワークで聞かれるコンポーネントでのメリットでもよく聞く疎結合や密結合の例ですが、何がよいのでしょうか。

本記事では、コードを交えて疎結合の何が良いのか、密結合の何が悪いのかを説明していきます。

密結合とは?

密結合というのは、、

処理を同一タイミングで行う場合に互いの処理同士の干渉が大きいものをいいます。

コード同士が互いに複雑に絡み合ってしまっている状態です。言葉だけだと難しいので、何個か例を出してみます。

class DoingProgram { 
    $surface = new PC();
    public function startPrograming() 
    { 
        $surface->understand(); 
    } 
} 

class PC { 
    public function understand() 
    { 
        echo(“これは依存しているプログラムだよー”); 
    } 
} 

上述したコードでは、DoingProgramクラスがPCクラスに密に依存している状態です。何かPCクラスに変更があった場合は、DogingClassに対しての変更が必要になります。
具体的には、PCクラスのunderstandメソッドが,readTextメソッドに変わったとするとDoingProgramクラスのunderstandメソッド部分の変更も必要になります。

保守が大変!

このように、PCクラスの変更に対して逐一対応していく必要があるため、長期的なことを考えるとこのようなコードがよろしくないことがわかってきます。

また、もう一例見てみましょう。

class DoingProgram { 
    public function startPrograming() 
    {  
	  $huawaey = new PC(1000,”php”);
	  echo($huawaey->performance)
    } 
} 

class PC {
   protected $performance;}
{protected $amount;} {  
protected $language;}

    public function __construct(  $amount, $language )
    { 
          this.performance = $amount * $language
    } 
} 

上記コードの場合は、強く絡み合っています。PCクラスで何か変更があった場合は、もちろんDoingProgramクラスへの影響が大きくあります。
PCクラスをインスタンス化するときに引数の構造を知っている必要があることと、その後にプロパティを呼び出す際にもプロパティ名を必要としています。

まとめ
  • 密結合はコード同士が複雑に絡み合っている状態。
  • 長期的な保守を考えるのであればやめた方が良い

疎結合とは?

上述したような密接に絡み合ったコードとは異なって、
一緒に実現するコードが互いの干渉がなく一つ一つのクラス独立しているのが疎結合です。 

public interface PC
{ 
    public function understand(); 
} 
class MacBook implements PC { 
public function understand() 
    { 
        echo(“疎結合だよー”)
    } 
} 
class MacBookPro implements PC { 
public function understand() 
    { 
        echo(“疎結合だよー”)
    } 
} 
public class Subject { 
public function begin() { 
        $myPC = new MacBook(); 
        $myPC->understand(); 
    } 
} 

上述したコードにおいて、MacBookとMacBookProはインターフェースによって実装されている疎結合なクラスとなっています。PCと同じ機能をもっているものとしてどこででも適応することができるのです。

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

一言で言うと、将来的な拡張に柔軟に対応するためと言えるでしょう。

開発者は普通、ソフトウェアがどのように進化していくかをある程度は想定しながら作っていきますが、ソフトウェアが大きくなるにつれて、予期せぬ使われ方をされることが増えて、新たな要求も増えてきます。
そんなときに、拡張可能な設計をしていないと、様々な依存関係を考えながら作らなければいけなくなります。
また、そのための時間、お金のコストもソフトのサイズに比例して大きくかかってくるため、早めの段階で疎結合な設計を作っておくと良いでしょうね。プログラムの中で最初に拡張可能にしなければならない部分を割り出し、その部分を修正する必要があり、組み直しが必要になってしまうからです。

疎結合や密結合なプログラムを書けるようになるには?

疎結合、密結合のどちらがよいのか・・ということはいうまでもなく、将来的なコードの拡張性を考えるのであれば疎結合なコードを書けるようになっていくのが良いでしょう。そこで、勉強するための方法をお伝えしますので参照してください。

疎結合と密結合を本で学ぶには?

本で独学で学ぶには、『リーダブルコード』、『現場で役立つシステム設計原則』、『ドメイン駆動設計』が良いでしょう。『リーダブルコード』は、基本的な命名規則が主なので綺麗なコードを書くって何?って状態の人はまず読んだ方が良いです。2冊目の本が、オブジェクト指向から初学者でもわかりやすく理解できるように書いてあるので一番おすすめです。3冊目は概念的であり実践するには結構な難度なので、初学者はまず手を出さない方が良いでしょう。

疎結合、密結合を含めた綺麗なコードを書くのを学ぶには?

beatiful-program

コードを書くのがプロフェッショナルな人ほどシンプルなコードを書くことができます。難しいことができればいいってわけではありません。また、職業としてプログラマーになりたいのであれば、

汚いコードを書く=仕事がなくなることを意味します。
このご時世、評価社会なので、悪い評判はすぐに伝わってきます。趣味でプログラミングをするのでない限り、プロにみてもらって勉強を進めるのが良いでしょう。

そのようなことを踏まえた上で、独学で学ぶのも良いのですが一番おすすめなのがプロに教えてもらうのが良いでしょう。プロに教えてもらうのにまずおすすめなのが、MENTA です。人によってレビューまで含めてしてくれる人もいるのでそのような人に当たると良いでしょう。しかも普通にプログラミング教室に通うより安価でできることも多いです。

mentaでのデメリット
  • どのようなレベルの人か判断しづらい
  • 有名な人は忙しく細かいレビューまでしてくれない

上記のようなデメリットがありますね。と考えると、普通にプログラミング教室に通った方が料金は高いですが、技術力を上げるという意味ではリスクは最小限に減らすことができますね。
おすすめなのは、techAcademyですね。私自身もここで学んで経験があるのですが、現役のエンジニアが講師となるので、講師の質は一番高かったです。ここからオンラインブートキャンプ無料体験ができるので、試しにやってみるのもありだと思います。

綺麗なコードをちゃんと描けるようになって、しっかりとしたプログラマになれるように頑張っていきましょう!

コメントを残す