Programmazione .NET e classi POCO

8

Stavo pensando a stasera mentre riflettevo su alcune applicazioni che dovevo cambiare e mi ha fatto riflettere. Entity Framework Entities sono POCO (Plain old CLR Objects) ei modelli utilizzati in ASP.NET MVC sono generalmente anche POCO. Ciò significa fondamentalmente solo proprietà, nessun metodo.

Ora la programmazione OO normalmente consente ad un oggetto di incapsulare la sua funzionalità, che include sia le sue proprietà che i suoi metodi, questo permette al polimorfismo di accadere. Con l'aumento delle classi POCO utilizzate, i modelli di progettazione come i repository generici sono diventati più popolari. Quando in passato i miei oggetti avrebbero avuto le loro operazioni CRUD, ora li ho su un repository.

Questa è solo un'evoluzione in OO in cui le operazioni CRUD vengono rimosse dagli oggetti per consentire loro di essere disaccoppiati o forse le operazioni CRUD non dovrebbero essere state a livello di oggetto in passato e io ero nel torto? diamine, forse entrambi sono perfettamente legittimi e lo sono sempre stati. È solo un'osservazione che mi ha fatto pensare, quindi ho pensato di cercare altre opinioni.

    
posta James 26.12.2013 - 22:50
fonte

4 risposte

8

Come ha detto Wyatt, POCO e POJO non implicano assolutamente alcun metodo. Penso che ciò derivi dal non sapere cosa sia non-POCO e non-POJO.

Le prime versioni delle tecnologie ORM non erano POCO e POJO semplicemente perché richiedeva alle entità di ereditare alcune classi base dal framework stesso. In caso di Java, Entity Beans. In caso di Entity Framework, POCO non era possibile nella prima versione e ogni entità doveva ereditare Entity base class.

Questo requisito ha creato dipendenza del modello dati sulla tecnologia di persistenza, che rende molte cose difficili o impossibili. Cose come l'unità di test del modello richiedono di prendere in giro la struttura del bean / entità che si è dimostrata praticamente impossibile. Inoltre, non è possibile utilizzare il modello con tecnologia di persistenza diversa o non è possibile utilizzare il modello in un contesto diverso, ad esempio nell'ambiente mobile.

Quindi la tua ipotesi che POCO riguardi la non esistenza dei metodi è sbagliata. POCO riguarda la possibilità di utilizzare il modello in separazione dalla sua tecnologia di persistenza.

Quello di cui stai parlando probabilmente si chiude su Modello di dominio anemico rispetto al modello di dominio appropriato.

    
risposta data 27.12.2013 - 08:56
fonte
4

POCO non implica in alcun modo che non ci siano metodi, anche se la maggior parte degli esempi che si vedono utilizzano gran parte delle funzionalità di associazione automatica MVC che riguardano principalmente le proprietà e ignorano i metodi.

La persistenza incorporata negli oggetti del modello viola la separazione delle preoccupazioni e rende molto difficile fare cose come testare gli oggetti senza mettere in piedi un database. Non è una funzione dell'oggetto modello ma una funzione se una classe diversa come un repository.

    
risposta data 26.12.2013 - 23:20
fonte
1

Solo due approcci diversi ciascuno con i propri meriti.

link

    
risposta data 27.12.2013 - 03:50
fonte
0

Ho utilizzato Metodi di estensione per cose come questa ultimamente.

Il POCO contiene una logica che ha senso solo per l'oggetto stesso. La logica aziendale o logica coordinata dell'oggetto va in un'estensione BL. L'accesso ai dati può essere effettuato in un livello di accesso ai dati o in un'estensione di accesso ai dati.

namespace MyApp
{
    public class MyClass
    {
        public string id;
        public string name;
        public int quantity;
        public decimal price;
    }   
}

namespace MyAppBL
{
    public static class MyClassBL
    {
        public static decimal PriceInCart(this MyClass myObject)
        {
            return myObject.quantity > 10 ? myObject.price * 0.9m : myObject.price;
        }
    }
}

namespace MyAppDA
{
    public static class MyClassDA
    {
        public static void Create()
        {
            …
        }

        public static void Read(string myObject)
        {
            …
        }

        public static void Update(this MyClass myObject)
        {
            …
        }

        public static void Delete(this MyClass myObject)
        {
            …
        }
    }
}

Questo ti dà un bel myObject.PriceInCart() e myObject.Save() mantenendo la tua classe focalizzata sui dati. Ovviamente per i metodi statici devi avere MyAppDA.Create() invece di MyApp.Create() .

    
risposta data 27.12.2013 - 06:27
fonte

Leggi altre domande sui tag