Tengo una clase abstracta llamada DatabaseRow
que, después de ser derivada y construida, se carga principalmente desde un método Load(object id)
.Mejor práctica para el encadenamiento de métodos ("devuelva esto")
Tengo un montón de código que crea una nueva instancia de la clase, la carga desde una ID y luego devuelve la clase. Me gustaría simplificar este código en una línea de código (para ser claro, hay muchas clases que solo tendrán listas de propiedades que devuelven estas instancias cargadas).
Hay dos maneras en que puedo pensar en hacerlo, pero ninguno me parece "correcto".
1. pude return this;
al final de mi método Load
y uso return new Derived().Load(id);
2. que podría crear un método genérico para devolver un método cargado.
public static T LoadRow<T>(object id) where T : DatabaseRow, new()
{
T row = new T();
row.Load(id);
return row;
}
que he visto algún otro código que utiliza el mismo método que el número , pero nunca he visto cualquier desarrollador con experiencia lo recomiendo, ni he encontré con cualquiera de los métodos en el marco .NET que hacer lo mismo, entonces tal vez esta no es la mejor práctica?
¿Alguien sabe de alguna otra solución que podría ser mejor que ambas?
Solución:
Después de leer el comentario de respuesta y SirViver, me di cuenta de que todas las propiedades que se devuelven necesidad de almacenar en caché de todos modos. La solución fue visualmente diferente, pero similar a la opción (que no esperaba que nadie obtuviera esta respuesta ya que no explico esta parte del diseño)
Todas estas instancias se cargarán desde un valor recuperado de otra columna en la base de datos (relaciones de la base de datos si lo desea). En lugar de tratar de cargar la nueva instancia desde este valor, hice un método para cargar la instancia desde el nombre de la columna y almacenar en caché el valor cargado en un diccionario. Esto funciona bien ya que esta es una de las principales funciones de la clase DatabaseRow
.
private Dictionary<string, DatabaseRow> linkedRows;
protected T GetLinkedRow<T>(string key) where T : DatabaseRow, new()
{
if (linkedRows.ContainsKey(key)) return (T)linkedRows[key];
else
{
T row = new T();
row.Load(this[key]);
linkedRows.Add(key, row);
return row;
}
}
En mi caso, tengo una clase que hereda 'DatabaseRow', y tengo 5 propiedades que usan esta misma función. Tener 5 líneas de código, similar a 'public Derived MyProperty {get {return new Derived(). Load (myInt); }} 'sería mucho mejor que separar las propiedades en código de varias líneas. – Connell
Pero, ¿qué importancia tiene la "pulcritud" del código de propiedad? En la mayoría de los casos, el código de propiedad debería colapsarse por Visual Studio de todos modos, y no es como si tuviera que mirar constantemente la implementación de la clase de todos modos. Dicho esto, construir y cargar datos en un acceso a la propiedad parece bastante peligroso para empezar.Si alguien no sabe que el resultado debe almacenarse en caché, esto podría dar como resultado un mal rendimiento y/o un comportamiento inesperado. – SirViver
Eso es todo! Me siento como un idiota ahora. ¡Tu comentario sobre el almacenamiento en caché me recordó que ya creé esta función justo en la parte inferior de mi clase DatabaseRow! 'protected T GetLinkedRow (clave de cadena) donde T: DatabaseRow, new()' carga la fila y la almacena en caché en un diccionario según el valor de 'key'. –
Connell