OOPメトリックの2つ、オブジェクトクラス間の結合(CBO)およびポリモーフィズム係数(PF))は、両方とも結合を測定します。
それらのカップリングが高い一方で、別のカップリングが低い場合がありますか?インターフェイスの継承はそのような状況の1つですか?
また、それらのそれぞれはどのようにカップリングを測定しますか?
オブジェクトクラス間の結合(CBO)は、Chidamber&Kemererによって提案されたメトリックで、クラスが結合されている他のクラスの数を測定します。結合とは、あるクラスのオブジェクトが別のクラスのオブジェクトのメソッドまたはプロパティを使用することを意味します。
ポリモーフィックファクター(PF)は、派生型が基本クラスのメソッドをオーバーライドする量を測定するためにAbreu&Meloによって提案されたメトリックです。メソッドの数と比較してオーバーライドされたメソッドの数を数えることで計算されます。
これらは独立した指標であるため、理論的にはあらゆる種類の関係を見つけることができます。しかし、それらが実際にどのように関連しているかを示す例を見てみましょう。
さまざまな形状(Circle
、Square
など...)を表すクラスと、いくつかの形状で構成されるクラスFigure
があるとします。 Figure
には、その形状ごとに描画メソッドを呼び出すdraw()
関数があります。
draw_circle()
、_draw_square(
_)、...)。次に、Figure
をすべての形状に結合し、さまざまな形状に対応するための多くの条件を付ける必要があります。新しい形状を追加するたびに、新しいカップリングを追加します。Shape
を継承し、ポリモーフィックdraw()
関数をオーバーライドします。 Figure
はShape
。しか知りません。Figure
はShape
オブジェクトのdraw()
のみを呼び出すため、CBO = 1です。N/(2+N)
とFigure::draw()
はオーバーライドされないため、正確にはShape::draw()
ですが、Shape::draw()
はN個の形状によってオーバーライドされます一般的な想定では、カップリングが低いシステムは保守が容易です。したがって、多くの設計パターンは結合を減らすことを目的としています。ほとんどの場合、ポリモーフィズムはデカップリングを可能にするものです。
抽象化が鍵であり、それを実装するために使用される言語機能ではありません。インターフェイスの継承と通常の継承は、抽象化を実現する2つの方法です。インターフェイスの継承では、インターフェイス関数の実装を提供する必要があります(つまり、定義されていない抽象関数のオーバーライドを提供する)。したがって、数学的にPFが増加します。ただし、C++のような一部の言語にはインターフェイスがありませんが、最終的に多重継承を使用して純粋な仮想関数を使用し、同じPFで同じことを行います。この例では、継承はカップリングを減らすための有効化です。