Dove collocare un certo tipo di funzioni nella struttura MVC

2

Sto appena iniziando a utilizzare la programmazione usando il pattern di progettazione MVC e vorrei sapere se l'ho capito correttamente e dove dovrei mettere certe cose.

Quindi ho capito che dovevo mettere tutti i miei file in una delle tre cartelle, (o semplicemente separare il codice):

Modello - Modelli di database.

Controller : logica che si occupa dello spostamento delle informazioni memorizzate nei modelli nella vista e viceversa.

Visualizza : logica per la visualizzazione di cose all'utente.

Quindi la mia domanda è se ho alcune funzioni che mi aiutano a gestire i modelli, ma non è un modello stesso, dove dovrei inserirlo?

Ad esempio, supponiamo di avere i seguenti modelli: Utente, Posta, Commento. E ho creato una funzione chiamata "Aggiungi", e riceve i due argomenti: "nome modello" e "proprietà" per quel modello, e la funzione usa il modello richiesto e fa tutto il lavoro necessario per aggiungerlo al database.

E ci sono dei buoni schemi strutturali che dovresti dare un'occhiata?

EDIT: ho visto che entrambe le risposte che ho ricevuto sono in conflitto, quindi qui ho un esempio migliore.

Diciamo che ho diversi tipi di "voci", possono essere articoli, blog, video, ecc ... Ho già un modello per ognuno di essi con le giuste relazioni tra loro e i loro commenti, e le altre cose.

Tutte queste voci, condividono una "struttura di base" comune e possono essere create dinamicamente.

Quindi ho creato una funzione per aiutarmi a gestire queste voci e riceve il nome della voce e le proprietà da salvare nel database. Quindi quella funzione invia i dati al modello appropriato.

Ecco lo pseudo codice che rappresenta la funzione:

function add( modelName, properties ) {

    // Checking the inputs.

    // Checking if a model with that model name exists

    // Pass the properties to the right model

    // Try to save it to the database

    // Return errors/updates.
}

EDIT: Mi dispiace di aggiornare con così tante domande, è solo il modo migliore che conosco per comprendere le cose:)

Quindi un'altra domanda: dov'è il posto giusto per convalidare l'input dell'utente? dovrebbe andare al modello?

E dove posso controllare le autorizzazioni dell'utente per accedere alle informazioni?

Se ho capito bene la maggior parte della logica va nel Modello?

E un'ultima cosa, non ho familiarità con la maggior parte della terminologia del MVC quindi per favore spiegami il più semplice possibile.

    
posta Samuel E. 24.09.2016 - 21:57
fonte

3 risposte

1

if I have some functions that help me deal with models, but isn't a model itself, where should I put it?

Se si tratta di classi di supporto per il modello, dovrebbero sedere con il modello. Si noti inoltre che il modello non è solo i modelli di database, è in realtà il modello di dominio. La tua logica di business e le regole di business risiedono lì, non solo le entità aziendali.

I created a function called "Add", and it receives the two arguments: "model name" and "properties" for that model, and the function uses the requested model and does all the work needed to add it to the database.

Questo suona come il tuo livello di persistenza. La persistenza dovrebbe far parte del Modello, almeno è così che l'ho usato e penso che dovrebbe esserlo, sebbene ci siano molte varianti di MVC.

Nel decidere dove dovrebbero vivere alcuni codici, classi, funzioni, ecc. (M, V o C) è una buona idea tenere presente il motivo base che esiste MVC e che è quello di separare le preoccupazioni. Con una buona implementazione MVC dovrebbe essere relativamente facile sostituire la C o la V con un'implementazione diversa. Quindi, quando lo fai, dovresti fornire un'altra implementazione per "Aggiungi" o dovrebbe essere già disponibile all'interno della M? (*)

(*) = Nota che non sto dicendo che la tua persistenza debba essere strettamente accoppiata a M - dovresti avere un livello di persistenza che puoi prendere in giro o sostituire se necessario (ad esempio, da un DB all'utilizzo di un Web servizio) - Sto dicendo che va insieme al M.

EDIT: per rispondere alle nuove domande che hai chiesto

Where is the right place for validating user input? should it go to the model?

La convalida va sia nel modello che nel controller. Ma ci sono due tipi di convalida.

L'input dell'utente è convalidato all'interno del controller. L'utente ha compilato tutti i campi obbligatori? Abbiamo ricevuto tutto ciò che è necessario per fare una chiamata al modello? Questo tipo di cose. Il controller quindi massaggia l'input in parametri per il modello. Ad esempio, di solito invii cose come stringhe, ma il modello potrebbe aspettarsi un intero. Il controller adatta i dati di input e si assicura che sia valido per una chiamata Model.

Ora il modello esegue la propria convalida. Verifica dei parametri ricevuti e verifica delle regole aziendali. Non si preoccupa dell'input dell'utente, si preoccupa dei parametri ricevuti sulla chiamata. Come ho detto sopra, l'idea è di pensare a sostituire le parti di MVC. Se si sostituisce il controller e la nuova implementazione è bacata e non esegue correttamente l'invio dei parametri al modello, il modello dovrebbe semplicemente fidarsi di loro e non fare nulla per convalidarli? Dovrebbe convalidarli.

And where do I check permissions of the user to access information?

In MVC questo è posizionato la maggior parte del tempo all'interno del controller. Questo perché le interazioni dell'utente con il modello passano attraverso il controller, il controller è il punto di ingresso. La maggior parte delle persone si ferma qui. Il modello non viene chiamato se il controller vede che non hai i permessi giusti. Di nuovo, se si sostituisce il controller o ne si aggiunge uno nuovo, la nuova implementazione deve proteggere il modello. Se è bug o lo sviluppatore si dimentica, puoi finire per fare una chiamata all'evento modello anche se non dovevi.

Quindi la sicurezza dovrebbe essere applicata sia al controller che al modello. Il modello controlla che sia consentita una chiamata aziendale mentre un controllore controlla che sia consentito un punto di ingresso. Ad esempio, è possibile accedere a un URL in modo corretto se si è connessi o meno (il controller lo consente in entrambi i casi), ma è possibile accedere ad alcune funzionalità da tale URL solo se si è connessi (il modello non ammette ruoli anonimi).

Spero che questo ti sia di aiuto. Come menzionato nelle risposte, MVC ha molti aromi e, a seconda delle applicazioni, delle esigenze, della comprensione degli sviluppatori, del mezzo di accesso (MVC web vs MVC desktop app), ecc., Un certo comportamento potrebbe essere implementato in modi diversi. / p>     

risposta data 24.09.2016 - 22:41
fonte
2

Model View Controller è davvero solo di raggruppare 3 preoccupazioni separate, cioè responsabilità. È un vecchio modello di design creato prima di sapere come interagire con gli oggetti.

View - Logic for displaying things to the user.

Una corretta. Ricorda che potrebbero esserci più di uno di questi.

Model - Database models.

Sì, qualsiasi modello in realtà. Questo è lo stato dei programmi . Dove ricordi le cose che sei, heh, la modellazione. Potrebbero essere solo alcuni oggetti valore come stringhe, interi e quant'altro.

Controllers - logic that deals with moving the info stored in the models to the view and the other way around.

No.

Questo è vero solo per alcune implementazioni di MVC. Ciò significa che assomigli a questo:

Che puoi fare. Ma puoi anche fare:

Qui il controller non sa nemmeno che la vista esiste. "Cosa sa di cosa?" è la migliore domanda architettonica che conosco.

Ci sono molti altre forme di MVC. Se lo studi ti lascia come se un sacco di cose non fossero inchiodate, hai prestato attenzione.

Ciò significa che decidere di utilizzare MVC non significa molto. Devi ancora decidere cosa sa di cosa e come parlarne.

Quando sono nel modello mi aspetto che tutto sia il modo basilare per creare lo stato. Non voglio occuparmi di logica che prende decisioni.

So my question is if I have some functions that help me deal with models, but isn't a model itself, where should I put it?

For example, let's say I have the next models: User, Post, Comment. And I created a function called "Add", and it receives the two arguments: "model name" and "properties" for that model, and the function uses the requested model and doest all the work needed to add it to the database.

Il tuo modello dovrebbe avere un'API di base che consenta di modificarlo. Se è così, allora questo è il modello. Altrimenti. Se questo è un livello di fantasia sopra l'API di base del modello, allora non è proprio il modello.

And is there any good structural pattern you think I should get a look at?

Ebbene si. MVC è il goo primordiale di entrambi gli schemi di architettura e design. È un buon punto di partenza, ma un posto povero in cui vivere.

Prima di tutto lo studio sulla modello di osservatore . Ti insegnerà quali sono realmente gli eventi e spiega perché alcune delle frecce in questi diagrammi non sono le stesse.

Scopri quali sono i principio di inversione delle dipendenze . Aiuta a rendere significative le linee che disegna intorno alle tue responsabilità.

Quando si è pronti per l'architettura leggere su architettura esagonale . È un modo diverso di guardare le architetture stratificate. Un bel variante dell'architettura esagonale è il architettura pulita .

C'è molto altro in cui potrei entrare ma che dovrebbe darti abbastanza da masticare per un po '.

    
risposta data 24.09.2016 - 23:31
fonte
0

Devi stabilire relazioni con i tuoi modelli. Le relazioni possono essere 1: 1, 1: Molte, molte: 1, molte: molte.

Prendendo in considerazione il tuo esempio: -

1 utente può creare più post

1 post può avere più commenti.

Quindi fondamentalmente quando si codificano le classi del modello dovrebbe essere qualcosa del tipo: -

 /*
   Disclaimer: This is just an illustration. The actual code may differ depending on the technologies or frameworks that you use. 
 */

 class User {
    private String name;
    private String createddatetime;
    ....
    ....
    @OneToMany
    private Collection<Post> posts = new ArrayList<Post>();
 }

 class Post {
   ...
   ...
   @OneToMany
   private Collection<Comments> comments = new ArrayList<Comments>();
 }
 class Comments {
    private String freeText;
 }

Detto questo, veniamo alle tue domande: -

So my question is if I have some functions that help me deal with models, but isn't a model itself, where should I put it?

Questa è la responsabilità del Controller.

Un controller può inviare comandi al modello per aggiornare lo stato del modello (ad esempio, modificare un documento). Può anche inviare comandi alla vista associata per cambiare la presentazione della vista del modello (ad esempio scorrendo un documento).

I controller possono invocare i metodi di servizio che invocano i metodi Dao che istanziano i modelli

    
risposta data 24.09.2016 - 22:36
fonte

Leggi altre domande sui tag