Domanda di progettazione modello-vista-controller (uno contro più modelli per vista multipla + controller)

2

Ho un problema con il codice condiviso in un'applicazione MVC. Controller / viste delle applicazioni ABC sono classi diverse ma utilizzano un framework comune. È una singola classe riutilizzata più volte.

Consentitemi di introdurre la mostra A, che mostra un modello della finestra principale di A dell'applicazione.

Cisonoduepuntidiinteresseprincipali.Asinistrac'èunavistatabella,chemostraunnumerodianatredigommadisponibili.Ognianatradigommahaunnumerodiattributi,chenonsonomodificabilieprincipalmenteusatiperordinarelatabella.Adestrac'èunaschermataincuièpossibile,inquestocaso,modificarel'aspettodell'anatradigommaselezionata.Latabellavieneutilizzataperselezionarequalevocedeveesseremostrataqui.

LavistatabellarealeèmoltopiùcomplicatadiunasempliceQTableView,haunapropriaclassedicontroller,unaclassedivisualizzazioneealmomentounapropriaclassedimodello.

Anchel'applicazionehauncontroller,unavistaeunmodello.Ilmodellodivisualizzazionetabellavieneinizializzatodalmodellodell'applicazioneprincipalealmomentodell'applicazione.Larimozione/Inserimentodiarticolinonèuncasod'uso.

ConsentitemidiintrodurrelamostraB,cheèunanuovaapplicazionechecondividelavistatabella.

L'applicazioneBcontienelastessalistview,maquilavistacorrettaèusatapercomporreun'immaginediunagaradianatradigomma.Ciòsignificacheèpossibileaggiungerneunoopiùanatredigommadaltavolo.Inoltre,dopol'applicazioneA,cisonostatiuncertonumerodicalcolichehannoportatoapiùcolonnenellatabella(comeunvaloredicarineriachepuòessereusatoperordinarelatabella).

Daquandol'applicazioneBèentratanellascena,ilmodellodeveessereregolatopercontenerepiùvalori.Ciòsignificachepossiamo:

  1. condividiilcodiceconl'applicazioneA,ilcuimodellosaràquindiingombratodavociinutili(noninizializzate)chevengonoutilizzatesoloinaltreapplicazioni.

  2. clonailcodicecondiversimodelli,checilasciaclassiseparateeridondanzadelcodice.

  3. modificalavistatabellaperutilizzareilmodellodell'applicazionealcostodidovercontrollarenellavistadellatabellaqualiruoliesistononelmodellocorrenteedevonoesserevisualizzati.

Inoltre,cisonopianiperl'applicazioneCchecostruiscecoppiedipaperelledigomma,famatchmaking(assegnaunpunteggiodisomiglianzadientrambeleanatre)chedovrebbeesseremostratonellatabellainvecedianatredigomma"singolari". Il modello di questa applicazione varierà notevolmente da quelli precedenti. Ciò rende l'opzione 1 (e probabilmente 3) piuttosto difficile da implementare.

Quindi preferisco l'opzione 3 mentre il mio collega non è d'accordo, preferendo i modelli separati.

Come posso realizzare ciò che voglio fare?

Disclaimer di attribuzione dell'immagine:

Immagine di anatra cyber: commons.wikimedia.org/wiki/File:Cyberduck_icon.png

Immagine gara di anatra: commons.wikimedia.org/wiki/File:Leichlingen _-_ Entenrennen_2010 _-_ Rennen_13_ies.jpg

    
posta antipattern 30.10.2015 - 16:31
fonte

1 risposta

1

Che ne dici dell'opzione segreta 4?

Estrai il codice comune in helper / classi di base ed estendi o includi se necessario?

Questo rimuove la duplicazione ed evita di inserire qualcosa di più di ciò che viene effettivamente utilizzato in ogni modello.

Finisci con un modello per controller, e alcuni helper e classi base che (purché tu li abbia organizzati e nominati con cura) saranno ovvi nella loro funzione.

    
risposta data 30.10.2015 - 21:30
fonte

Leggi altre domande sui tag