web-dev-qa-db-ja.com

タイトなクラス凝集度メトリック、すべてまたは単なるパブリックメソッド?

私は凝集のトピックを調査していて、TCCメトリックにはパブリックメソッドのみを含める必要があるという主張もあれば、すべてのメソッドを主張する他の情報源があることもわかりました。どちらのアプローチを使用するのも間違っているでしょうか?一部の人が示唆するように、なぜプライベートメソッドを除外する必要があるのですか?

5
John V

パブリックメソッドとプライベートメソッドの両方を次のように検討する必要があると思います。

この指標は、パブリックメソッド(外部クライアントから見たクラスへのインターフェース)間の凝集度の評価に基づいており、クライアントが使用するインターフェースの一部としてプライベート内部の凝集度を報告しません(明らかに、その一部)。

ただし、パブリックメソッド間の凝集度の計算時には、パブリックメソッドから直接だけでなく、パブリックメソッドによって呼び出されるプライベートメソッドからもアクセスされるインスタンス変数間の凝集度を考慮する必要があります。

Publicメソッドが単にprivateメソッドを呼び出すクラスがあるとします。

class Foo {
    private bool _state;
    private void _setState ( bool choice ) { _state = choice; }
    public void Set() { _setState ( true ); }
    public void Reset () { _setState ( false ); }
}

現在、TCCは、SetResetの間の結合に関係していますが、_setStateには関係していません。

ただし、SetおよびResetを検討する場合、_setStateを呼び出すことを考慮する必要があります。パブリックメソッドの静的呼び出しグラフでプライベートメソッドを考慮しない場合、それらは互いに凝集性を持たないように見えますが、実際には、凝集性が欠けていません:_state インスタンス変数。

2
Erik Eidt