Estoy refabricando un poco del código de acceso a datos C# de un desarrollador anterior y tengo curiosidad acerca de un patrón que usó.Cualquier ventaja para los objetos. ¿Obtiene Objeto (i) sobre los objetos [i]?
El código inicialmente expuso colecciones (arrays) de una variedad de objetos comerciales de estilo ActiveRecord, esencialmente objetos envolviendo campos de base de datos. Estoy cambiando las matrices a listas genéricas, pero el aspecto del código Tengo curiosidad acerca es que el desarrollador anterior tenía conseguir métodos para cada tipo de objeto que estaba envolviendo, de esta manera:
public Thing GetThing(int i) {
return things[i];
}
hay varios de estos métodos, y no puedo pensar en ninguna ventaja posible de usar ese mecanismo simplemente refiriéndome a las cosas [i] directamente. Supongamos, por el argumento, que las cosas son una propiedad pública, no un campo público (en este caso, en realidad es una propiedad implementada automáticamente, por lo que esa suposición es cierta en realidad).
¿Me falta algo obvio? O incluso algo esotérico?
ACTUALIZACIÓN probablemente debería aclarar que estas colecciones se accede actualmente dentro de los bucles:
for (int i = 0; i < thingsCount; i==) {
dosomthing(GetThing(i));
dosomethingelse(GetThing(i));
}
que estoy refactorización a:
for (int i = 0; i < thingsCount; i==) {
Thing thing = things[i];
dosomthing(thing);
dosomethingelse(thing);
}
y tal vez incluso a usar las cosas. para cada().
Pensando en la respuesta de @Elpezmuerto, estaba llegando exactamente a esta conclusión, a pesar de que estoy exponiendo las * colecciones * como propiedades con {get; conjunto privado;} una vez que obtengo la colección, puedo modificarla en el código de llamada de forma que no tenga ningún sentido. El desarrollador anterior los ha expuesto como protegidos, por lo que su punto 1 no es relevante en mi caso, pero estaba llamando a GetThing (i) varias veces en cada ciclo, lo cual, estoy de acuerdo, no tiene sentido. Parece que el mejor refactor es dejar los métodos GetThing() tal como están, pero solo llamarlos una vez por ciclo. Gracias! – cori
@cori: Sí, un error muy común que los desarrolladores hacen al diseñar sus clases expone colecciones mutables directamente, sin tener en cuenta lo que puede ocurrir si/cuando esas colecciones se modifican. Si solo desea habilitar el código de llamada para enumerar y no modificar una colección, exponer un 'IEnumerable' y no, por ejemplo, 'List '! –
@cori: admitiré que es bastante frustrante, sin embargo, cuando se quiere permitir el acceso aleatorio por índice, pero no todas las demás características de la interfaz 'IList' o incluso un 'T []' (que le permite establecer elementos , no solo obtenerlos). Esto es realmente algo sobre lo que pregunté en [una vieja pregunta personal] (http://stackoverflow.com/questions/2110440/why-is-there-no-iarrayt-interface-in-net) hace un tiempo. –