2010-04-08 11 views
21

Ich lese Hibernate in Action und der Autor schlägt vor, Business-Logik in unsere Domain-Modelle (S. 306) zu verschieben. Zum Beispiel haben wir in dem von dem Buch dargestellten Beispiel drei Entitäten mit den Namen Item, Bid und User, und der Autor schlägt vor, der Klasse Item ein placeBid(User bidder, BigDecimal amount)-Verfahren hinzuzufügen.Ist es eine gute Idee, Business-Logik-Code in unser Domain-Modell zu migrieren?

Angesichts der Tatsache, dass wir in der Regel eine eigene Schicht für Geschäftslogik (z. B. Manager oder Service Klassen im Frühjahr), die unter anderem steuern Transaktionen, ist dies wirklich ein guter Rat? Ist es nicht besser, unseren Entitäten keine Geschäftslogik-Methoden hinzuzufügen?

Vielen Dank im Voraus.

+1

Überprüfen Sie http://techblog.bozho.net/?p=180 – Bozho

+0

Siehe auch diesen verwandten Thread: http://StackOverflow.com/Questions/2333307/should-enterprise-Java-entities-be-dumb –

Antwort

10

Wie gesagt

Wir haben eine ausgeprägte Schicht für Business-Logik (in der Regel genannt Service-Schicht)

Domain-Driven-Entwurf (DDD) besagt, sollten Sie die Geschäftslogik in Ihrem Domain-Modell setzen . Und glauben Sie mir, es ist wirklich gut. Wie gesagt von POJO in Buch Aktion über die Service-Schicht

  • Es wird Use Case
  • Es angetrieben können Transaktionsgrenzen

Vor

@Service 
public class BidServiceImpl implements BidService { 

    @Autowired 
    private ItemRepository itemRepository; 

    public void placeBid(Integer itemId, User bidder, BigDecimal amount) { 

     Item item = itemRepository.getById(itemId); 

     if(amount.compareTo(new BigDecimal("0.00")) <= 0) 
      throw new IllegalStateException("Amount must be greater than zero"); 

     if(!bidder.isEnabled()) 
      throw new IllegalStateException("Disabled bidder"); 

     item.getBidList().add(new Bid(bidder, amount)); 
    } 

} 

Nach

definieren
@Service 
public class BidServiceImpl implements BidService { 

    @Autowired 
    private ItemRepository itemRepository; 

    public void placeBid(Integer itemId, User bidder, BigDecimal amount) { 
     // itemRepository will retrieve a managed Item instance 
     Item item = itemRepository.getById(itemId); 

     item.placeBid(bidder, amount); 
    } 

} 

Ihre Domain Logik zeigt als

folgt

Bei der Verwendung von Domain-Driven-Entwurf, Ihre Geschäftslogik in der richtigen Stelle lebt. Aber, manchmal, könnte es eine gute Idee sein, Ihre Geschäftslogik innerhalb Ihrer Serviceebene zu definieren. Siehe here warum

+3

Warum Wüsste der Artikel die Regeln, um Gebote abzugeben? Ich würde das in ein anderes Modul schreiben, das die Regeln behandelt, und es von dem Prozess der Abgabe eines Gebots abstrahieren. Ich möchte die Item-Klasse nicht jedes Mal ändern, wenn wir die Regeln weiterentwickeln. Aber ich würde diese Regel immer noch innerhalb der Item.placeBid (...) -Methode aufrufen. –

+1

Interessant. Wenn ich mir diesen Code anschaue, scheint es mir immer noch irgendwie rückständig zu sein. Ich muss DDD lesen und sehen, was ich denke. Ich habe das Gefühl, dass der letzte Link über die Gründe für "manchmal" eine Service-Schicht, die auf viele der Punkte angewendet wird, die ich gerne benutze, bereitgestellt wird, obwohl ich vielleicht nicht ganz verrückt bin. –

+0

Wenn ich mir das obige Before/After-Beispiel und meine Erfahrung anschaue, dass die meisten nicht trivialen Projekte in der Kategorie "manchmal" angesiedelt sind, ist es immer noch besser, Entity-Objekte sauber zu lassen. Ich habe DDD bisher noch nicht geübt. – Behrang

8

Einer der meist zitierten Artikel zu diesem Thema ist:

"Die Anemic Domain Model" von Martin Fowler. Gut lesenswert: http://martinfowler.com/bliki/AnemicDomainModel.html

Der allgemeine Sinn ist, wenn Ihr Domain-Modell rein Daten ohne Verhalten ist, dann haben Sie viele der Vorteile von OO-Design verloren.

oder zu zitieren:

„Im Allgemeinen, desto mehr Verhalten, das Sie in den Diensten finden, desto wahrscheinlicher werden Sie sich von den Vorteilen eines Domänenmodell zu berauben Wenn alle Ihre Logik in Dienstleistungen ist. du hast dich blindlings ausgeraubt.

0

Persönlich liebe ich das anämische Modell - Daten sind Daten, Code ist Code; aber es gibt Ausnahmen.

Es kommt auf "Dichte": Wenn Sie eine große Anzahl von Diensten haben, die mit ein paar Domain-Objekten interagieren; Es ist sinnvoll, einige der gemeinsamen Business-Logik in Ihrem Domänenmodell zu setzen, damit es Teil des Dienstes wird. Wenn Sie einige Dienste haben, die mit vielen Domänenobjekten interagieren, dann bevorzugen Sie das anämische Modell gegenüber den Rich-Domain-Objekten.

Ich habe festgestellt, dass, wenn ich meine Domain-Objekte in mehreren Kontexten verwende (zB benutze ich die gleichen Domain-Objekte auf der Client-Seite und auf der Service-Seite), diese Business-Logik oft im Weg - da muss es anwendbar sein in allen Kontexten.

+1

So magst du nicht OOP, aber prozeduralen Code. Ich hoffe, Sie schreiben Ihre Geschäftslogik nicht auf Singleton-Komponenten ... – lnrdo

Verwandte Themen