Ho notato uno schema nel mio codice. Si applica alle situazioni in cui le cose possono essere selezionate. Riguarda le classi che chiamo (e in codice spesso suffisso con) Registry, Slot e Updater.
Registro
Questa classe è praticamente una combinazione di ciò che è noto come il modello di registro : ( "Un pozzo -oggetto noto che altri oggetti possono utilizzare per trovare oggetti e servizi comuni. ") e alcuni metodi di filtro.
Questi dovrebbero essere l'elenco di tutti i [Type] s . Usano sempre una collezione internamente, ma i metodi che hanno sono determinati da ciò che le altre classi vogliono da loro. Potrebbe trattarsi di semplici wrapper per la classe di raccolta o per i metodi di filtro con nome specifici del dominio. Gli eventi, ad esempio quando viene rimosso un elemento, vengono aggiunti pragmaticamente quando necessario.
public class ProductRegistry
{
private readonly List<Product> _products = new List<Product>();
public void Add(Product product)
{
_products.Add(Product product)
}
public List<Product> GetAllProductsOnSale()
{
// domain specific filtering...
}
}
Slot
Chiamato "Slot" perché può contenere un oggetto. Nella maggior parte dei casi, un oggetto tenuto qui significa che è l'oggetto attualmente selezionato. Contrariamente a Registry and Updaters, il codice per questo è sempre lo stesso ad eccezione del tipo di cosa viene selezionato. Potrei trasformarlo in una classe generica, ma sono arrivato a pensarlo mentre scrivevo questa domanda - e non è così che cambierebbe il modo in cui funziona questo modello.
public class ProductSlot
{
public event Action WhenProductHasBeenChanged;
public Product Product{get; private set;}
public void Set(Product product)
{
Product = product;
if(WhenProductHasBeenChanged!=null) WhenProductHasBeenChanged();
}
}
Updaters
Questi aggiornano il registro e lo slot. Il modo in cui ottengono ciò varia selvaggiamente, quindi il codice di esempio non avrebbe senso qui.
Tuttavia, per dare un esempio di ciò che fanno, un ProductUpdater
potrebbe supervisionare il processo di download di una stringa da un indirizzo web, analizzandolo in Products
e quindi aggiungendolo a ProductRegistry
.
Una cosa che ho fatto ripetutamente è stata la registrazione di un Updater all'evento change di uno slot per una cosa diversa. Ad esempio, un ContractSlotUpdater
ascolta le modifiche in CustomerSlot
, quindi può aggiornare ContractSlot
con Contract
che corrisponde al nuovo Customer
.
Note aggiuntive
Ho aggiunto il tag C # perché quella è la lingua, e quindi le caratteristiche del linguaggio, che attualmente sto usando. Non vedo problemi nel trasferire questo concetto ad altre lingue, purché abbiano le funzionalità necessarie.
La domanda
Se questa non è una buona cosa da fare, per favore dimmi perché.
Altrimenti, vorrei sapere come chiamarlo.