Ho una certa confusione sull'uso del controller con pattern di repository pur mantenendo il principio SOLID. Si consideri, ho due tipi di citazioniPrincipio SOLID in Laravel con pattern di repository
- Preventivo Commerciale
- Quotazione privato
e v'è un'alta probabilità di nuovi tipi di citazioni in futuro. Ogni offerta ha campi diversi, logiche di business eppure condividono molte funzioni comuni. Così ho creato un QuotationInterface
Quotazione Inteface
interface QuotationInterface
{
public function save(array $data);
}
classe citazione che implementi l'interfaccia
class CommercialQuotation implements QuotationInterface
{
public function(array $data)
{
// save commercial quotation
}
}
class PrivateQuotation implements QuotationInterface
{
public function(array $data)
{
// save Private quotation
}
}
Quotazione Repository
class QuotationRepository
{
public function save(array $data, QuotationInterface $quotation)
{
$quotation->save($data);
}
}
QotationController
public function store(Resource $resource)
{
$inputs = $resource->all();
/**
* Clearly here Open/Close Principle is broken
*/
if ($inputs['type'] == 'private'){
$quotation = new PrivateQuotation;;
}
else if($inputs['type'] == 'commercial'){
$quotation = new CommercialQuotation;
}
$this->repo->save($inputs, $quotation);
}
Qui nel mio QuotationController, è chiaramente violando Open/Close Principio ..
E 'una buona idea per creare un controller per ogni tipo di quotazione (potrebbe essere 10+ un giorno, chi lo sa?) per evitare la violazione OCP o il mio design è solo sbagliato? Qualsiasi suggerimento, consigli sul cambio di design, risorse sono ben accetti.
NOTA: Il mio controller di quotazione avrà molte altre funzioni eccetto il solo salvataggio.
Ho intenzione di seguire il tuo esempio. Grazie. –
La necessità di modificare la fabbrica è una classica violazione del Principio Aperto/Chiuso: significa che il codice non è chiuso alla modifica. In effetti, switch/case è sempre una violazione dell'OCP, motivo per cui non è incluso nel modello di progettazione del metodo Factory GoF. Il modello di progettazione è basato sul polimorfismo. – jaco0646
@ jaco0646: Gli schemi di progettazione non sono regole assolute, ma è importante per adeguarli alla situazione attuale. In un caso come questo una fabbrica semplice potrebbe essere una buona soluzione.Alla fine del mio post, a seconda dell'architettura dell'app, l'op poteva implementare una fabbrica astratta o un metodo factory – Moppo