Esempio di modellazione di classi

0

Questa è la continuazione di Classi e metodi di piccole dimensioni, ma il codice è ancora difficile da mantenere e seguire in quanto ho maturato il problema e rimbalzerò sulle risposte delle persone.

Ecco tutti gli elementi che dovrebbero essere modellati:

1.Model (in questo caso una directory di collegamento)

2.Validations (dei campi del modello dal modulo inviato dall'utente)

3.Le operazioni CRUD del database del modello

Sto pensando di organizzare correttamente tutti questi elementi in classi per rispettare i principi tradizionali di astrazione, accoppiamento lento e incapsulamento.

Ecco come l'ho fatto al momento, il che è scomodo da mantenere a causa di un problema di accoppiamento lento o così penso: quando devo eseguire un'operazione, mi vedo saltare in aria:

  • Modulo 1:
    • Classe del modello di collegamento: con solo membri dati
    • Funzione di convalida che contiene tutti i dati dei modelli e restituisce un bool se non viene trovato alcun errore o un messaggio di ritorno con tutti errore di convalida. Non contiene la logica di validazione, che è contenuto in un altro modulo 4.
  • Modulo 2: il file del controller Cattura le operazioni http CRUD e inviare le istruzioni a un file del servizio di utilità che contiene il database codice che eseguirà le operazioni CRUD.
  • Modulo 3: il file del servizio di utilità del database Questo prende il file istruzioni inviate dal modello ed eseguono le operazioni di crude. È un modulo di una semplice funzione.
  • Modulo 4: il servizio di logica di convalida Il codice di convalida nel file il modello invia semplicemente i dati dal modello alla logica di validazione file di servizio qui.

Dalle risposte di gbjbaanb nell'altra discussione, penso che il mio problema sia un problema di accoppiamento e incapsulamento. ha detto:

you should be thinking in terms of making the entity self-contained, so you can think of making the entity and operating on it in much simpler terms, like creating it is one action, validating it another and so on

Quale penso sia un punto molto importante. Quindi ho intenzione di rimodellare la mia struttura in quanto tale:

Modulo 1:

  • Classe del modello di collegamento
    • data members
    • Crea metodo
    • Metodo di aggiornamento
    • Leggi il metodo
    • Elimina metodo

Modulo 2: il controller Questo semplicemente catturerà le richieste http e istanzerà il corrispondente metodo della classe del modello.

Una domanda che ho è, come gestire la convalida? Logicamente inserirò il codice nella classe del modello come metodo, dal momento che è accoppiato con il modello. Ma il codice di validazione è piuttosto complesso e si trova nel proprio file di servizio, quindi come organizzarlo, considerando che la convalida potrebbe essere riutilizzata da altre classi? Il modo attuale con la funzione di convalida nel modulo del modello e la logica nel file di servizio è molto poco pratico.

Per quanto riguarda il codice del database, penso che dovrei lasciarlo nel suo modulo, che creerebbe un accoppiamento tra il modello e la classe del database, ma penso che sia inevitabile dato che verrà usato da altre classi.

Inoltre, se hai un altro suggerimento per organizzare questo, si prega di avvisare. Ad esempio, inseriresti le operazioni di crudizzazione nel modello come facevo io, o nella classe del database?

    
posta Benj 13.06.2016 - 12:56
fonte

1 risposta

1

La convalida è una cosa piuttosto difficile da gestire, ma ho visto la maggior parte dei framework gestirli in un modo simile. Nei framework con cui ho lavorato, la validazione dei dati funziona annotando le classi del modello. Questa "tecnica" di validazione è buona perché segue DRY o "Do not Repeat Yourself".

La migliore forma di suggerimento è attraverso l'esempio:

.NET

La convalida dei dati per un modello viene aggiunta aggiungendo annotazioni di dati alle classi del modello:

Esempio tratto da qui :

public class Movie {
    public int ID { get; set; }

    [Required] // <= the data annotation!
    public string Title { get; set; }

    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }

    [Required]
    public string Genre { get; set; }

    [Range(1, 100)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }

    [StringLength(5)]
    public string Rating { get; set; }
}

Quindi il controller lo convalida in questo modo:

//
// POST: /Movies/Create

[HttpPost]
public ActionResult Create(Movie movie)
{
    if (ModelState.IsValid)
    {
        db.Movies.Add(movie);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(movie);
}

I moduli di convalida dei dati fanno parte del framework e personalmente li ho appena usati senza pensare veramente alla loro implementazione, ma sono sicuro che puoi avere un'idea di come creare i tuoi moduli di convalida dai loro documenti. Ecco alcuni documenti su C # Data Annotations.

Java EE

Non ho molta familiarità con le specifiche di convalida del bean Java (JSR-303 e JSR-349) ma so che gestisce anche la convalida in modo simile.

Esempio tratto da qui :

public class User {

    private String email;

    @NotNull @Email
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

public class UserService {

    public void createUser(@Email String email,
                            @NotNull String name) {
    ...
    }
}

Questi sono solo alcuni esempi di come alcuni framework gestiscono la validazione. La cosa da tenere a mente è che dovresti mantenere il concetto di DRY - "Do not Repeat Yourself" e come lo afferma beanvalidation.org

Constrain once, validate everywhere

Se trovi una convalida che funziona in questo modo, lo stai facendo correttamente: D Spero di averti guidato nella giusta direzione. Impara dall'esempio!

    
risposta data 13.06.2016 - 17:41
fonte