web-dev-qa-db-ja.com

同じクラスの2つのオブジェクトをそのクラスに比較するためのメソッドを配置することはクリーンですか?

クラスCarがあるとします(例として)

_class Car {
   ...
   boolean isRed();
   ...
}
_

carの例では、同じクラスのオブジェクトで動作するメソッドを配置する場所ですが、Carのその単一のインスタンスだけでなく、さらに配置します-同じクラスの2つのインスタンスがあるとします(次の例を参照)。

boolean haveCarsSameColor(Car a, Car, b);

一般的に、そのような方法に適した場所はどこですか?クラスCarですか?

2
Július Marko

Java=でこのようなメソッドに一般的に受け入れられているイディオムは、比較のために別のオブジェクトを受け入れるJava Object equals()メソッドに基づいています。 :

public boolean equals(Object obj)

他のオブジェクトがこのオブジェクトと「等しい」かどうかを示します。

エルゴ:

public bool IsSameColorAs(car other) {
    return this.color == other.color;
}

使用法:

bool IsSameColor = car1.IsSameColorAs(car2);
3
Robert Harvey

単一責任原則では、クラスにはそのクラスに関連するロジックが含まれているとされています。

私の見解では、色は「同じ」の意味を定義しているため、2つの色が「同じ」かどうかをテストするロジックは、色のクラス/構造体、または色の拡張メソッドに実装されます。

例えば:

car1.Color.IsSameAs(car2.Color);

これにより、2つの色がアプリケーションの目的には近すぎて、「同じ」と見なされるかどうかを区別できないかどうかを判断することもできます。

C#では、拡張メソッドを使用して、作成していないクラスまたは構造体の関数を追加できます。次に例を示します。

public static class Extensions
{
    public static bool IsSameAs(this Color thisColor, Color otherColor)
    {
        return Math.Abs(thisColor.R - otherColor.R + thisColor.G - otherColor.G + thisColor.B - otherColor.B) < 2;
    }
}
0
Berin Loritsch