Pierwszą rzeczą, którą trzeba sobie zadać to:
„Jeśli mam dwa instrumenty z id == 53, wtedy to znaczy są one zdecydowanie ten sam dokument, bez względu na to co i czy istnieje? znaczący przypadek, w którym mogłyby być inne? "
Zakładając, że odpowiedź brzmi: "oba są takie same: jeśli jakakolwiek inna właściwość jest różna, oznacza to albo błąd, albo ponieważ jeden taki obiekt został uzyskany za drugim, i że sam się wkrótce rozwiąże (kiedy dowolny wątek przetwarzania jest używając starszego instrumentu, przestaje go używać) "następnie:
Po pierwsze, po prostu użyj tego, co znajdziesz pod ręką. Najprawdopodobniej okaże się, że ma to być cały czas przez int
, chociaż masz pewne bezpieczeństwo typu od nalegania, aby Instrument
został przekazany do metody. Jest to szczególnie ważne, jeśli cała konstrukcja Instrument
dzieje się z konstruktora internal
lub private
dostępnego za pośrednictwem metod fabrycznych, a użytkownik kodu nie może utworzyć fałszywego Instrument
z identyfikatorem, który nie pasuje do niczego w systemie.
Definiowanie równości jako takie:
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;
}
}
Teraz, zwłaszcza gdy weźmiemy pod uwagę, że powyższe jest prawdopodobnie inlined większość czasu, istnieje dość dużo ma różnicy realizacji, czy używamy identyfikatora lub obiekt pod względem równości, a więc także pod względem wykorzystania ich jako klucza.
Teraz można definiować wszystkich metod publicznych w którymkolwiek z następujących środków:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return instrumentInfos[instrument];
}
Lub:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return instrumentInfos[instrument.Id];
}
Lub:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return GetInstrumentInfo(instrument.Id);
}
private InstrumentInfo GetInstrumentInfo(int instrumentID)
{
return instrumentInfos[instrumentID]
}
Wpływ Wydajność być tym samym, niezależnie od tego, do którego się wybierasz. Kod przedstawiony użytkownikom będzie bezpieczny dla typu i zagwarantuje, że nie przekazuje fałszywych wartości. Wybrana implementacja może być po prostu wygodniejsza z innych powodów.
Ponieważ nie będzie cię to już kosztować używanie instrumentu jako klucza wewnętrznie, nadal zalecałbym to (jako pierwszą z trzech powyższych opcji) jako bezpieczeństwo typu i utrudniając przekazanie fałszywych wartości będzie również obowiązywało w twoim wewnętrznym kodzie. Jeśli z drugiej strony okaże się, że zestaw wywołań nadal używa identyfikatora (np.rozmawiają z warstwą bazy danych, której tylko ID oznacza cokolwiek), a następnie zmiana tylko tych miejsc staje się szybka i łatwa dla Ciebie i ukryta przed użytkownikiem.
Dajesz także użytkownikom możliwość użycia obiektu jako klucza i szybkiego porównywania równości, jeśli im to odpowiada.
Bardzo ładne pytanie. +1 – Mohayemin
A może GetInstrumentInfo powinien być metodą na instrumencie? –
@Peri ma bardzo dobry punkt. A może zdobywca nieruchomości byłby jeszcze lepszy. –