Supponiamo di avere varie entità nel mio modello (utilizzando EF), ad esempio Utente, Prodotto, Fattura e Ordine.
Sto scrivendo un controllo utente in grado di stampare i riepiloghi degli oggetti entità nella mia applicazione in cui le entità appartengono a un insieme pre-deciso, in questo caso dico che i riepiloghi di Utente e Prodotto possono essere riassunti.
I riepiloghi avranno tutti solo un ID e una descrizione, quindi creo un'interfaccia semplice per questo:
public interface ISummarizableEntity {
public string ID { get; }
public string Description { get; }
}
Quindi per le entità in questione, creo una classe parziale che implementa questa interfaccia:
public partial class User : ISummarizableEntity
{
public string ID
{
get{ return UserID.ToString(); }
}
public string Description
{
get{ return String.Format("{0} {1} is from {2} and is {3} years old", FirstName, LastName, Country, Age); }
}
}
public partial class Product: ISummarizableEntity
{
public string ID
{
get{ return ProductID.ToString(); }
}
public string Description
{
get{ return String.Format("{0} weighs {1}{2} and belongs in the {3} department", ProductName, WeightValue, WeightUnit, Department); }
}
}
In questo modo il mio controllo utente / vista parziale può semplicemente collegarsi a qualsiasi raccolta di ISummarizableEntity e non è necessario che sia interessato alla fonte. Mi è stato detto che le interfacce non dovrebbero essere usate come tipi di dati, ma non ho avuto più informazioni di quelle. Per quanto posso vedere, sebbene le interfacce descrivano normalmente il comportamento, solo l'uso delle proprietà non è un anti-pattern di per sé in quanto le proprietà sono comunque solo zucchero sintattico per getter / setter.
Potrei creare un datatype e una mappa concreti dalle entità a quello ma non posso vedere il beneficio. Potrei rendere gli oggetti entità ereditari da una classe astratta e quindi definire le proprietà, ma poi sto bloccando le entità per non utilizzarle ulteriormente poiché non possiamo avere ereditarietà multipla. Sono anche disposto ad avere qualsiasi oggetto ISummarizableEntity se volessi (ovviamente rinominerei l'interfaccia)
La soluzione che sto usando nella mia mente è mantenibile, estensibile, verificabile e abbastanza robusta. Riesci a vedere l'anti-pattern qui?