Domanda

Come qualsiasi modello di progettazione il specifica del modello è una grande idea, ma suscettibile di un uso eccessivo da parte di un architetto ansioso / sviluppatore.

che sto per iniziare lo sviluppo su una nuova applicazione (.NET e C #) e piace molto il concetto di modello Specifiche e sono desiderosi di fare pieno uso di esso. Tuttavia prima di andare in tutte le pistole fumanti Sarei davvero interessato a sapere se qualcuno potesse condividere i punti di dolore che ha sperimentato quando utilizzare il specificazione modello nello sviluppo di un'applicazione.

Idealmente Sto cercando di vedere se altri hanno avuto problemi in

  • unit test di scrittura contro il modello di specifica
  • che Decidere strato le specifiche dovrebbero vivere in (Repository, servizio, dominio, ecc)
  • Uso ovunque quando una semplice dichiarazione if avrebbe fatto il lavoro
  • etc?

Grazie in anticipo

È stato utile?

Soluzione

Come David ha sottolineato nel suo commento, un sacco di ciò che è utile su specifiche possono ora essere raggiunto più succintamente con artisti del calibro di LINQ.

Al posto di un nuovo tipo di specifica, è possibile creare le specifiche arbitrarie on-the-fly: GetCustomers().Where(customer => customer.IsActive && customer.City == "Oakland");

Questo non è un sostituto completo per la specifica, tuttavia, per un paio di motivi:

  1. L'ordinamento / filtraggio avviene nella classe dei consumatori dopo il ritorno a tutti i clienti. Se avete a che fare con qualcosa di diverso da oggetti in memoria, questo è sub-ottimale (LINQ to SQL e simili sono eccezioni, perché compilare e ottimizzare le query ed eseguirli sul / lato server remoto, restituendo solo i risultati desiderati ).
  2. Il tuo API è completamente aperto al qualsiasi query se si espone collezioni e lasciare la specifica di query LINQ. Se si desidera vincolare cosa o quanto possono essere recuperate, avrete bisogno di un insieme di specifiche con cui interrogare.

Non v'è certamente alcun bisogno di usare ovunque, ed è molto probabile che non avrete bisogno affatto; Io non conosco il tuo dominio o quello che si sta lavorando.

Credo che il miglior consiglio è di non Cerca di usarlo. Vedrete quando è giustificato, più probabile quando si inizia a scrivere una classe che si presenta come il primo esempio in questo articolo a cui si è collegato.

Basta tenere nel vostro repository modello mentale in modo che hai se ne avete bisogno; se non si utilizza, significa solo che non hai bisogno, e questo è bene.

La scelta dello strato è soggetto alla natura delle specifiche e il loro utilizzo. In molti casi si tratta di aiutanti a sostegno di un livello di servizio, ma in alcuni casi si incapsulano logica di dominio.

Per quanto riguarda i test di unità, ricordate che le vostre specifiche sono unità o contengono unità. Non testare un metodo che accetta una specifica con tutte le possibili combinazioni di specifiche; verificare le specifiche se stessi per fare in modo che si comportino come previsto, e quindi è possibile riutilizzare le stesse specifiche con fiducia in molti metodi e classi.

La speranza che è un po 'utile.

Altri suggerimenti

Non credo LINQ è un sostituto per il modello Specification. Ricordate che una specifica è meglio utilizzato per incapsulare la logica di business. Quindi, se uno dei miei requisiti di business mi ha ottenere tutti i clienti valutati per diverse caratteristiche mia dichiarazione LINQ può apparire come segue:

var valuedCustomers = Customers.Where(c => c.Orders.Count > 15 && c.Active).ToList();

posso scrivere questa affermazione in tutto la mia domanda, ma cosa succede se voglio aggiungere a quella regola che il cliente deve aver aderito prima di una data? Bene, ora devo andare tutta la mia applicazione e cambiare il Linq. O se il mio oggetto grafico cambia (anche se questo non dovrebbe essere l'unica ragione per l'utilizzo del pattern). Quando invece ho potuto solo fare qualcosa di simile

var valuedCustomers = Customers.Where(new ValuedCustomerRule.IsSatisfied()).ToList();

Sono d'accordo che il modello è più utilizzati, ma è molto utile per le regole di business che mostrano tutto il sistema in modo da non avere morso quando tali regole cambiano. Per me è simile a lasciare le query SQL su tutto il codice dell'applicazione.

Risposta Aggiornato: Sono d'accordo con Wix, LINQ non è sostituto per Specifica modello. Non ho abbastanza reputazione per aggiungere un commento a Wix risposta, sto solo rispondendo come una risposta.

Come per specifiche questa carta vengono utilizzati principalmente per corrispondere a un oggetto di dominio contro una dichiarazione. Anche se le specifiche restituiscono true / false quando la corrispondenza con un oggetto di dominio, ma che fa le specifiche medi sono proposto di incapsulare qualsiasi condizione booleana nel codice.

Porterò su di Wix di risposta ulteriormente. Se avete un definito una specifica ValuedCustomer allora hai possibilita 'diverso da utilizzare regola:

   var valuedCustomer = new ValuedCustomerSpecification();
   //1. You can use this statement to check if a customer is valued or not in your domain
   Customer customer = ....
   if(valuedCustomer.IsSatisfiedBy(customer))

   //2. You can use it to get just valued customers from repository, 
   var valuedCustomers = repository.Get(valuedCustomer);

   //3. You can combine it with other specifications to create composite specifications. Following syntax can vary with implementation
   var seniorValuedCustomer = valuedCustomer.And(seniorCustomer)

La mia comprensione da carta è che l'utente può interagire con le specifiche per raggiungere i loro obiettivi di lì è la necessità di esso e la vostra applicazione interfaccia utente permette.

sopra di carta citato menziona anche quando non utilizzare modelli di specifica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top