La primera cosa que hay que preguntarse es:
"Si tengo dos instrumentos con == ID 53, entonces ¿eso significa que son sin duda el mismo instrumento, no importa lo que o hay una? caso significativo donde podrían ser diferentes? "
Suponiendo que la respuesta es "son las mismas. Si cualquier otra propiedad difiere, es un error o porque uno de esos objetos se obtuvo después de otro, y se resolverá lo suficientemente pronto (cuando el hilo de procesamiento sea utilizando el instrumento más antiguo, deja de usarlo) "luego:
Primero, internamente, simplemente use lo que encuentre más útil. Lo más probable es que descubra que esto pasa por el int
todo el tiempo, aunque obtiene algún tipo de seguridad al insistir en que se pasa un Instrument
al método. Esto es especialmente cierto si toda la construcción Instrument
ocurre desde un constructor internal
o private
al que se accede a través de métodos de fábrica, y no hay manera de que un usuario del código cree un Instrument
falso con una identificación que no coincide con nada en su sistema.
Definir la igualdad como tal:
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;
}
}
Ahora, sobre todo si tenemos en cuenta que lo anterior es probable que se inline mayor parte del tiempo, no hay prácticamente ninguna diferencia aplicación en cuanto a si se utiliza la identificación o el objeto en términos de igualdad, y por lo tanto también en términos de usarlos como clave.
Ahora, se puede definir todas sus métodos públicos en cualquiera de los siguientes medios:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return instrumentInfos[instrument];
}
O:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return instrumentInfos[instrument.Id];
}
O:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return GetInstrumentInfo(instrument.Id);
}
private InstrumentInfo GetInstrumentInfo(int instrumentID)
{
return instrumentInfos[instrumentID]
}
El impacto en el rendimiento se ser el mismo, lo que sea que elija. El código presentado a los usuarios será seguro para el tipo y garantizará que no pasen los valores falsos. La implementación elegida puede ser simplemente la que le parezca más conveniente por otros motivos.
Dado que no le costará más usar el instrumento como una llave internamente, aún así le recomendaría que haga eso (la primera de las tres opciones anteriores) como el tipo de seguridad y lo que hace difícil pasar valores falsos se aplicará también a su código interno. Si, por otro lado, encuentra que un conjunto de llamadas sigue usando el ID de todos modos (si, por ejemplo,están hablando con una capa de base de datos a la cual solo la ID significa algo), luego cambiar solo esos lugares se vuelve rápido y fácil para usted, y se oculta para el usuario.
También le brinda a sus usuarios la posibilidad de usar su objeto como clave y hacer comparaciones rápidas de igualdad, si así lo requiere.
Muy buena pregunta. +1 – Mohayemin
¿O tal vez GetInstrumentInfo debería ser un método en Instrument? –
@Peri tiene un muy buen punto. O tal vez un comprador de propiedades sería aún mejor. –