Modelli di domini anemici e iniezione di servizi di dominio

17

Il modello di dominio anemico è descritto come un anti-pattern nella progettazione basata sul dominio di Martin Fowler. Per avere la logica aziendale sui modelli di dominio, vengono spesso utilizzati i servizi di dominio. Ma l'iniezione di servizi di dominio in modelli di dominio è considerata dannosa da Vaughn Vernon (vedere "Implementazione di un design basato sul dominio, Pagina 387).

Secondo me quelle opinioni sono contraddittorie, è vero? Come possono essere considerati entrambi i punti?

È davvero modello di dominio ricco con servizi di dominio contro modello di dominio anemico e servizi di dominio normali ?

    
posta Sjoerd222888 17.12.2015 - 16:20
fonte

2 risposte

14

Un modello anemico è semplicemente un contenitore di dati. Non contiene il comportamento. (Questo potrebbe effettivamente essere considerato una buona cosa nel paradigma funzionale.) L'opposto di un modello anemico è non un modello iniettato pieno di servizi di dominio. Stai descrivendo due estremi: entrambi sono cattivi.

Se hai un modello anemico, non stai abbracciando completamente ciò che OOP offre. Se inizi a iniettare servizi in questi modelli, probabilmente stai iniettando preoccupazioni che non ti appartengono. O quello o il tuo modello è più anemico di quanto pensi. Perché altrimenti avresti bisogno del servizio diverso da quello che fornisce qualcosa che è richiesto ma mancante? (Manca potrebbe significare anemico.)

Evitare entrambi "dice" porta a un design più strong. Hai qualcosa in un servizio di cui un modello ha bisogno? Forse dovrebbe essere spostato sul modello. In caso contrario, forse dovresti riconsiderare le tue preoccupazioni. Il comportamento di un modello dovrebbe funzionare all'interno del modello. Dovrebbe principalmente (se non solo) occuparsi dei membri. Ma ricorda, ci saranno ancora cose che funzionano su o con il modello. Ad esempio, i modelli non dovrebbero aprire connessioni TCP o ascoltare eventi UI, anche se sono in qualche modo coinvolti. Questa è la responsabilità di qualcun altro e qualcuno non appartiene mai dentro al modello.

    
risposta data 17.12.2015 - 17:23
fonte
6

Non è contraddittorio. Entrambi i proponenti vorrebbero che tu inserissi il tuo codice effettivo nell'oggetto dominio stesso.

es.

public class Order
{
    private string status = "not bought";
    public void Buy()
    {
        this.status = "bought";
    }
}

vs ADM

public class Order
{
    public string Status = "not bought";
}

public class BuyingService
{
    public Order Buy(Order order)
    {
         Order o = new Order();
         o.status = "bought";
         return o;
    }
}

vs servizi iniettati

public class Order
{
    public Order(IBuyingService bs)
    {
        _bs = bs;
    }
    private IbuyingService _bs;
    private string status = "not bought";
    public void Buy()
    {
        this.status = _bs.Buy();
    }
}

public class BuyingService : IBuyingService
{
    public string Buy()
    {
         return = "bought";
    }
}

Francamente, sebbene ogni approccio abbia vantaggi e svantaggi. Quello che scegli è in gran parte una questione di preferenze personali

    
risposta data 17.12.2015 - 20:01
fonte

Leggi altre domande sui tag