Quali sono gli svantaggi di MVC? [chiuso]


43

Uso MVC / MV * da quando ho iniziato a organizzare il mio codice anni fa. Lo uso da così tanto tempo che non riesco nemmeno a pensare a nessun altro modo di strutturare il mio codice e ogni lavoro che ho avuto dopo essere stato uno stagista era basato su MVC.

La mia domanda è: quali sono gli svantaggi di MVC? In quali casi MVC sarebbe una cattiva scelta per un progetto e quale sarebbe la (più) scelta corretta? Quando cerco alternative MVC, quasi tutti i risultati sono solo diversi tipi di MVC.

Per restringere l'ambito in modo che non si chiuda, diciamo per le applicazioni web. Lavoro sul back-end e sul front-end per diversi progetti, quindi non posso dire solo front-end o back-end.


5
Ci sono troppe risposte possibili o buone risposte sarebbero troppo lunghe per questo formato. Aggiungi dettagli per restringere il set di risposte o per isolare un problema a cui è possibile rispondere in pochi paragrafi.
moscerino

8
Avrei bisogno di una risposta su quale sia la tua definizione di MVC prima di poter rispondere alla tua domanda poiché l'architettura MVC si applica solo a una serie di problemi così come sono. Quindi se lo usi nel posto sbagliato hai una caduta.
Ben McDougall,

1
Quanta varietà c'è nei tuoi diversi lavori?
JeffO


@JeffO App PHP (backend, siti pesanti non JS), app front-end. Quindi, tutto il web, ma front-end e backend.
Oscar Godson,

Risposte:


46

Dovresti sempre ricordare - MVC è un modello relativo all'interfaccia utente. Se stai costruendo un'applicazione complessa, dovresti prendere tutto, che non è correlato all'interfaccia utente, dalle terzine MVC ad altre classi, sottosistemi o livelli.

È stato il mio più grande errore. Ho trascorso molto tempo a capire quella semplice regola:

  • Non diffondere un modello MVC nell'intera applicazione,
  • Limitalo solo alle cose relative all'interfaccia utente.

Controlla sempre se il codice che scrivi è logicamente nella posizione corretta, nel senso che si adatta logicamente alla sua area di responsabilità della classe in cui lo inserisci. In caso contrario, sposta il codice non appena lo capisci.

Tutti i modelli che chiami MVC-alternative (ovvero Model-View-Presenter, Model-View-ViewModel) sono solo un modo per implementare il concetto generale di MVC.


10
in realtà puoi implementare MVC ogni volta che hai un livello di astrazione; l'API è la vista / controller e la logica sottostante è il modello
maniaco del cricchetto

14
@ratchetfreak, tecnicamente parlando un'API è una forma di UI, in cui l'utente è il programmatore che utilizza l'API.
zzzzBov

@ratchetfreak: questo non sarebbe classificato come modello di facciata?
Jeroen Vannevel,

2
MVC può essere più utile nell'interfaccia utente, ma la separazione delle preoccupazioni non è utile solo lì.
DougM,

1
@DougM true. più specificamente: lo stile specifico di separazione in MVC è stato creato per le applicazioni GUI. in seguito, il concetto è stato esteso alle applicazioni Web, perdendo una grande quantità di specificità. estenderlo ulteriormente ai progetti API lo rende ancora più vago. oltre a ciò ... penso che perda gran parte del suo valore e sarebbe meglio ricominciare da capo con il concetto più basilare (e universale) di separazione delle preoccupazioni.
Javier

17

Secondo me ci sono due tipi di MVC: puro e impuro (per la mancanza di una parola migliore :)

Pure MVC è ciò che è stato introdotto in chiacchiere:

inserisci qui la descrizione dell'immagine

Questo era destinato alle applicazioni di personal computer / desktop. Come puoi vedere, il modello informa le visualizzazioni di eventuali aggiornamenti / modifiche apportate ad esso. Non così con (impuro) MVC.

L'altro (impuro) MVC che viene propagandato per le applicazioni Web è più un modello PAC ( Presentazione-astrazione-controllo ) invece del classico MVC sopra. Questo è più di organizzazione del codice e separazione delle preoccupazioni:

  • Modello : astrazione per dati memorizzati
  • Controllo : in genere ciò che è noto come livello di logica aziendale, nonché parte dell'applicazione responsabile dell'instradamento delle richieste HTTP alla corrispondente logica di business (aka controller)
  • Visualizza : visualizza principalmente modelli che formattano i dati dal modello e li restituiscono al client. Il modello non invia MAI aggiornamenti alla vista, né la vista "sottoscrive" per gli aggiornamenti da un modello. Sarebbe un incubo di accoppiamento. Quindi è più simile al PAC che al vero MVC.

Ora, ecco come è strutturata un'applicazione Web:

  1. Front-end : MVC sul client che utilizza framework come Backbone.js ecc., Questa è la forma "vera" MVC in sostanza.
  2. Back-end : Ancora una volta, hai MVC / PAC (impuro) per l'organizzazione del codice e la separazione delle preoccupazioni
  3. App Web globale (per l'intera applicazione Web): se si dispone di un back-end RESTful che restituisce solo dati JSON, l'intero back-end può essere percepito come un modello per l'applicazione client front-end in cui View e Controller risiedono in sostanza.

Quindi quali sono alcuni svantaggi di MVC ? Bene, il modello ha resistito alla prova del tempo, quindi non ce ne sono molti che contano molto meno che essere un po '"complicato". Vedete, l'MVC è un modello composto: implementa il modello strategia / osservatore e tutti sono ben organizzati per formare un modello di alto livello.

Dovresti usarlo ovunque? Forse no. Le applicazioni Web estremamente complesse potrebbero essere suddivise in più livelli! Potresti non essere in grado di cavartela solo con i livelli Visualizza / Logica aziendale / Dati. La struttura / organizzazione generale può essere ancora MVC-ish, ma solo a livello macroscopico.

Ecco un esempio in cui solo MVC da solo potrebbe essere una cattiva scelta: prova a progettare un sistema di controllo del traffico aereo o un'applicazione di elaborazione di prestiti / mutui per una grande banca - solo MVC da solo sarebbe una cattiva scelta. Inevitabilmente avrai bus degli eventi / code di messaggi insieme a un'architettura a più livelli con MVC all'interno di singoli livelli e possibilmente un design MVC / PAC globale per mantenere meglio organizzata la base di codice.


+1 per "puro vs. impuro". anche se preferisco usare "GUI vs Web MVC" e punto che GUI MVC è modulare mentre Web MVC è a strati . Vorrei davvero che il Web MVC fosse chiamato qualcos'altro, poiché è troppo diverso dal "MVC puro", ma sembra che sia troppo tardi per quello.
Javier,

Mi piace il diagramma. Ri. la formulazione, forse "MVC tradizionale vs MVC derivata" :)
Edwin Yip

12

L'errore che molte persone commettono con i modelli di design è vedere che funziona magnificamente in un posto e quindi provare ad applicarlo ovunque.

Se hai lavorato in un posto per un po ', puoi quasi datare un pezzo di codice vedendo quali tecnologie / modelli di progettazione / pratiche erano in voga al momento, ad esempio singoli / iniezione di dipendenza / TDD ecc ecc.

Per quanto riguarda dove non usarlo. Bene, ovunque non si applichi un elemento della tripletta MVC. Le applicazioni della console potrebbero non implementare affatto un'interfaccia. I programmi di utilità potrebbero non avere un modello. E probabilmente, se non hai né un modello né una vista, non hai bisogno di un controller.

Il problema è raramente con il concetto, più con l'implementazione. Non importa quanto sia buono il paradigma, prenditi il ​​tempo per vedere se è adatto al problema in questione.


2
MVC, se correttamente seguito, consente il riutilizzo del codice. la stessa logica dietro un progetto di utilità o riga di comando può essere facilmente un controller identico da un programma più grande con un modello e una vista alternativi. (potrebbe non essere il codice più EFFICIENTE, ma non è sempre un problema.)
DougM

La console è un'interfaccia utente. Solo testo, quindi il tuo presupposto è sbagliato.
GuardianX

@GuardianX In realtà non ho parlato molto bene. Ho modificato la mia risposta per chiarire.
Robbie Dee,

3

MVC, come qualsiasi paradigma non integrato nella tua piattaforma di sviluppo, è una maggiore complessità. L'inconveniente è che potresti finire in classi separate che non dovrebbero essere separate, e diminuendo la chiarezza di quanto siano strettamente legate. (O, per progetti banali, anche offuscare il tuo codice.)

L'alternativa al primo problema è quella di separare tale codice in sottoprogetti indipendenti; l'alternativa per il secondo è il codice non separato, sia nella classe che nel modello di file.


+1 per menzionare progetti più piccoli, anche se apprezzo che ci siano varie scuole di pensiero qui. Alcuni direbbero che se esiste una possibilità che un POC possa evolversi in codice live, dovrebbe essere scritto correttamente. Mentre altri dicono che invece di rischiare di perdere tempo a lucidare qualcosa che non potrebbe mai essere usato, sarebbe meglio sgrossare qualcosa insieme e ricominciare da capo se il progetto andasse avanti.
Robbie Dee,

@Robbie: ahh !! caratteristica strisciante!
DougM,

0

La mia comprensione dell'applicazione di MVC / MV * sta seguendo il principio di Separation of Concerns (SoC) - che separa programma / codici in sezioni / pezzi distinti in modo che ogni sezione possa affrontare un problema separato (Rif .: http://en.wikipedia.org / wiki / Separation_of_concerns )

ci sono molti vantaggi nel separare le preoccupazioni: uno non influirà su un altro e gli sviluppatori potrebbero lavorare su un'unità senza influire sul resto, ecc. ecc. ... MVC non è l'unico modello che segue il SoC, fondamentalmente, lo stesso OOP è un ottimo concetto per spezzare le cose in unità.

MVC / MV * sono molto utili quando si gestisce lo sviluppo relativo all'interfaccia utente, mentre al di sotto potrebbero esserci più modelli: fabbrica, singleton, facciata ecc. La maggior parte dei grandi progetti è costituita da più livelli che gestiscono aspetti diversi, ma l'interfaccia utente potrebbe non essere un must alcuni casi. Potresti vedere MVC molto, perché molti progetti hanno elementi dell'interfaccia utente.

quindi, mentre parliamo degli svantaggi di MVC, dipende davvero dai progetti che stai realizzando - ha un'interfaccia utente? richiede grande scalabilità / estensibilità? ha molte interazioni tra UI e behind-system? ad esempio, una semplice pagina Web di informazioni non richiede affatto MVC, a meno che non si preveda di estenderla a una grande pagina interattiva in futuro.

quindi per valutare MVC (o più in generale - un modello di progettazione), dargli un contesto e pensare a complessità, scalabilità, testabilità, manutenzione, vincoli di tempo, ecc. ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.