最初に自問する必要があるのは次のことです。
「ID == 53 の楽器が 2 つある場合、それらは間違いなく同じ楽器であることを意味しますか? それとも、それらが異なる可能性がある意味のあるケースはありますか?」
答えが「両方とも同じである」と仮定すると、他のプロパティが異なる場合、それはバグであるか、そのようなオブジェクトが次々に取得されたためであり、それはすぐに解決されます (処理のスレッドが古い楽器を使用している場合) 、使用をやめる)" の場合:
まず、内部的には、使いやすいと思われるものを使用してください。anがメソッドに渡されるint
ことを主張することである程度の型安全性が得られますが、これは常に行われていることに気付くでしょう。これは、すべての構築がファクトリ メソッド経由でアクセスされるorコンストラクターから行われ、コードのユーザーがシステム内のどの ID とも一致しない偽の IDを作成する方法がないInstrument
場合に特に当てはまります。Instrument
internal
private
Instrument
等式を次のように定義します。
public class Instrument : IEquatable<Instrument>
{
/* all the useful stuff you already have */
public bool Equals(Instrument other)
{
return other != null && Id == other.Id;
}
public override bool Equals(object other)
{
return Equals(other as Instrument);
}
public override int GetHashCode()
{
return Id;
}
}
さて、特に上記がほとんどの場合インライン化される可能性が高いと考えると、ID を使用するかオブジェクトを使用するかに関して、同等性に関して実装上の違いはほとんどなく、したがってそれらをかぎ。
これで、次のいずれかの方法ですべてのパブリック メソッドを定義できます。
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return instrumentInfos[instrument];
}
または:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return instrumentInfos[instrument.Id];
}
または:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return GetInstrumentInfo(instrument.Id);
}
private InstrumentInfo GetInstrumentInfo(int instrumentID)
{
return instrumentInfos[instrumentID]
}
どちらを選択しても、パフォーマンスへの影響は同じです。ユーザーに提示されるコードはタイプ セーフであり、偽の値を渡さないことが保証されます。選択される実装は、他の理由でより便利であると思われる単純なものにすることができます。
インストゥルメント自体を内部でキーとして使用するのにこれ以上コストがかからないため、型安全性と偽の値の受け渡しを困難にするために、(上記の 3 つのオプションの最初の) それを行うことをお勧めします。その後、内部コードにも適用されます。一方、呼び出しのセットがとにかく id を使用し続けることがわかった場合 (たとえば、ID だけが何かを意味するデータベース層と通信している場合)、それらの場所だけをすばやく簡単に変更できます。ユーザーから隠されています。
また、ユーザーが必要に応じて、オブジェクトをキーとして使用し、迅速な等値比較を実行できるようにします。