In C # abbiamo Extension methods
.
Extension methods enable you to add methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.
An extension method is a special kind of static method, but they are called as if they were instance methods on the extended type.
Tuttavia, in uno dei nostri momenti di progettazione minori, abbiamo iniziato a sostituire le classi concrete che contengono la logica aziendale e le spostiamo in Extension Methods
.
All'inizio i vantaggi sembravano puliti, ad esempio potremmo sostituire qualcosa di simile (esempio molto semplificato).
var AddressUtils = new AddressUtils();
AddressUtils.CleanAddress(order);
var ValidationUtils = new ValidationUtils();
ValidationUtils.ValidateCustomer(Order);
con
Order.CleanAddress();
Order.ValidateCustomer();
Ie stavamo sostituendo un sacco di classi istanziabili stateless con metodi statici a mano corta (zucchero sintattico) che rendevano il codice più leggibile. Questo non mi è mai piaciuto molto.
Ora abbiamo un sacco di classi statiche con metodi vari, la maggior parte non sono nemmeno generiche o basate su interfacce. I.e uso singolo.
Aggiungendo a questo c'è una nozione comune che le classi statiche non sono adatte allo sviluppo basato su test.
Quindi le alternative sono davvero
- Torna a lezioni di helper in stile util concrete
- E / o incapsula la logica in una sorta di servizio DI
- Oppure aggiungi la logica al modello stesso.
- O con la logica riutilizzabile sparsa sui vari servizi che devono essere utilizzati.
Per quanto riguarda la seconda opzione, l'ordine (come la maggior parte dei modelli) sono in realtà entità di dati, (e ancora una volta) non sembra giusto (o persino fattibile) spingere la logica di business verso il dominio modelli
Quindi mi mancano le classi helper (a meno che non ci siano modelli migliori), i metodi di estensione, i servizi DI, una sorta di logica basata sull'entità o un imprevedibile fabbrica di spaghetti.