Frage

Wo ich arbeite, wir weg hin und her zu diesem Thema einige Male haben und suchen nach einer Plausibilitätsprüfung. Hier ist die Frage:. Should Business Objects Datencontainer (mehr wie DTOs) oder sollten sie auch eine Logik enthalten, die einige Funktionen für das Objekt durchführen können

Beispiel - Nehmen Sie ein Kundenobjekt, enthält es wahrscheinlich einige gemeinsame Eigenschaften (Name, Id, etc.), sollte das Kundenobjekt umfassen auch Funktionen (Speichern, Calc, etc.)

?

Eine Argumentations sagt trennt das Objekt von der Funktionalität (Einzel Verantwortung Prinzipal) und stellt die Funktionalität in einer Business-Logik-Schicht oder Objekt.

Die andere Argumentationslinie sagt, nein, wenn ich einen Kunden bezwecken Ich möchte nur Customer.Save anrufen und mit ihr geschehen. Warum muss ich wissen, wie man einen Kunden zu speichern, wenn ich das Objekt bin raubend?

Unsere letzten beiden Projekte haben die von der Funktionalität getrennt Objekte haben, aber die Debatte über ein neues Projekt wieder angehoben wurde. Welche macht mehr Sinn?

Bearbeiten

Diese Ergebnisse sind sehr ähnlich zu unseren Debatten. Eine Stimme einen oder anderen Seite ändert vollständig die Richtung. Hat jemand ihre zwei Cent hinzufügen möchten?

Bearbeiten

Eventhough die Antwort Sampling klein ist, scheint es, dass die Mehrheit der Meinung, dass Funktionalität in einem Business-Objekt akzeptabel ist, solange es ist einfach, aber Ausdauer ist am besten in einer separaten Klasse / Schicht angeordnet. Wir werden diesen einen Versuch geben. Vielen Dank für jeden Eingang ...

War es hilfreich?

Lösung

Objekte sind Zustand und Verhalten zusammen. Wenn ein Objekt hat vernünftiges Verhalten (zum Beispiel Alter für eine Person von ihrem Geburtsdatum oder eine Gesamtsteuer für eine Rechnung Berechnung), mit allen Mitteln hinzufügen. Business-Objekte, die nichts anderes sind als DTOs werden, um ein als „anämisch Domänenmodell.“ Ich glaube nicht, es ist eine Design-Anforderung.

Persistence ist eine besondere Art von Verhalten. Was ich rufe „vernünftig“ ist Geschäftsverhalten. Ein Business-Objekt muss nicht wissen, dass es persistent ist. Ich würde sagen, dass ein DAO Persistenz getrennt von Geschäftsverhalten halten. Ich weiß nicht „speichern“ in der „vernünftigen“ Kategorie gesetzt.

Andere Tipps

Business Objects CAN hat Business-Funktionalität .

Persistence ist kein Business-Funktionalität , ist aber die technische Umsetzung.

Lange Rede kurzer Sinn:

  1. Speichern / Aktualisieren / Löschen / Finden usw. -. Halten von den Business-Objekten in einer Persistenz-Schicht entfernt
  2. CalculateSalary, ApplyDiscount etc sind geschäftsbezogene Methoden und können sein:
    1. Methoden der Business Objects (so BO Selbstdarstellung Einheit enthalten ist) oder;
    2. separate Dienste besondere Funktionalität der Umsetzung (so BOs mehr wie DTOs handeln).

Wie für den Punkt 2.
Ich sollte erwähnen, dass der Ansatz 2.1 neigt die BOs zu aufgebläht und verletzen SRP zu machen. Während 2.2 einleitet mehr Wartung Komplexität .

ich in der Regel Balance in zwischen 2.1 und 2.2, so dass ich auf die Daten in Business related triviale Dinge stellte Objekte und erstellen, um Dienste für ein bisschen komplexe scenarious (wenn es mehr als 4 Zeilen Code - macht es zu einem Service).

Damit verschiebt sich das Paradigma der Business Objects mehr Datenübertragung werden Objekte statt.

Aber das alles macht Projekt leichter zu entwickeln, zu testen und erhalten.

Die Antwort ist die gleiche, unabhängig von der Plattform oder Sprache. Der Schlüssel zu dieser Frage ist, ob ein Objekt der Lage sein sollte autonomer sein, oder ob es besser für einen bestimmten Verhalten ist mit mehr konzentriert Verantwortung unter Objekten verteilt werden.

Für jede Klasse könnte die Antwort unterschiedlich sein. Wir am Ende mit einem Spektrum, auf das wir Klassen auf der Basis der Dichte der Verantwortung platzieren .

                          (Level of responsibility for behavior)
         Autonomy - - - - - - - - - - - - - - - - - - - Dependence  
      High
  C      -   <<GOD object>>                            <<Spaghetti code>>
  l      -
  a      -  
  s      -                                      
  s      -                 
         -                        
  s      -  
  i      -  
  z      -
  e      -  <<Template>>                                <<Framework>>
       low  

Angenommen, Sie haben die Klasse favorisieren lassen führen alle Verhaltensweisen selbst, oder so viele wie möglich. Beginnend auf der linken Seite dieses Diagramms, wenn Sie Ihre Klasse autonomer zu machen, wird die Größe der Klasse wachsen, wenn Sie es kontinuierlich Refactoring, um es allgemein. Dies führt zu einem Vorlage . Wenn kein Refactoring getan wird, ist die temdency für die Klasse mehr zu werden „ Gott-wie “, denn wenn es etwas Verhalten ist es braucht, ist es, ein Verfahren für das hat. Die Anzahl der Felder und Methoden wachsen und beide werden bald unüberschaubar und unvermeidlich. Da bereits die Klasse so viel kostet, würde Programmierer eher auf die Monstrosität fügen als Versuch es auseinander zu Stück und den Gordischen Knoten schneiden.

Die rechte Seite des Diagramms hat Klassen, die zu einem großen Teil auf anderen Klassen ab. Wenn die Abhängigkeit Niveau hoch ist, aber die individuelle Klasse ist klein, das ist ein Zeichen für einen Rahmen ; jede Klasse nicht viel tun und erfordert eine Menge abhängiger Klassen eine Funktion zu erfüllen. Auf der anderen Seite, eine hochabhängige Klasse, die auch eine große Menge an Code hat, ist ein Zeichen dafür, dass die Klasse ist voll von Spaghetti .

Der Schlüssel zu dieser Frage ist, zu bestimmen, wo Sie sich wohler in der Grafik fühlen. In jedem Fall werden die einzelnen Klassen am Ende ausgebreitete auf dem Graphen, es sei denn einige Organisationsprinzip angewendet wird, das ist, wie Sie die Ergebnisse der erreichen Vorlage oder Rahmen .

Da ich gerade geschrieben, dass, würde ich sagen, dass es eine Korrelation zwischen Klassengröße und Organisationsgrad. Robert C. Martin (oder "Uncle Bob") deckt ähnlich Boden mit Paketabhängigkeiten in seinem sehr gründlich Papier auf Design-Prinzipien und Design Patterns . JDepend ist eine Implementierung der Ideen hinter dem Graphen auf Seite 26 und Ergänzungen statische Analysetools wie Check und PMD .

Ich denke, es macht mehr Sinn für Unternehmen zu wissen Objekte, wie man „handle“ sich selbst, dann an anderer Stelle diese Last zu haben, setzen im System. In Ihrem Beispiel der logischste Ort zu behandeln, wie man „save“ Kundendaten wären, für mich, in dem Customer-Objekt.

sein Dies kann, weil ich die Datenbank zu sein, die „Datencontainer“ betrachten, so dass ich für „Business-Objekte“ bin die höhere Ebene, die die Datencontainer vor dem direkten Zugriff schützt und erzwingt Standard „Geschäftsregeln“ über wie diese Daten zugegriffen wird / manipuliert werden können.

Wir haben Rocky Lhotka der CSLA Rahmen seit Jahren verwendet und lieben, wie es konzipiert ist. In diesem Rahmen die gesamte Funktionalität ist in den Objekten enthalten sind. Während ich den Wert von Abscheidegruppen die Logik aus sehen kann, ich glaube nicht, dass wir bald von dieser Philosophie jederzeit wechseln entfernt werden.

Business-Objekte sollten über seine Daten und die damit verbundene Verhaltensweisen der Geschäftseinheit von diesem Objekt modelliert eingekapselt wird. Betrachten Sie es wie folgt aus: einer der wichtigsten Grundsätze der objektorientierten Programmierdaten und die damit verbundenen Verhaltensweisen ist auf diesen Daten einkapseln.

Persistence ist kein Verhalten des modellierten Objekts. Ich finde, mehr Entwicklung Fortschritte reibungslos, wenn Geschäftsobjekte Persistenz ignornant sind. Die Entwicklung neuen Code und Einheit Testen neuer Code schneller passieren und glatter, wenn die Business-Objekte sind nicht speziell auf die zugrunde liegenden Rohrleitungen verbunden. Das ist, weil ich diese Aspekte verspotten und vergessen darüber, dass Reifen gehen bis in die Datenbank zu erhalten, etc. Meine Unit-Tests schneller ausführen wird (ein großes Plus, wenn Sie Tausende von automatisierten Tests haben, dass Lauf mit jedem Build) und I wird weniger Stress, weil ich keine Tests wegen der Datenbankverbindung Probleme versagt haben (toll, wenn Sie häufig offline arbeiten oder aus der Ferne und kann nicht immer auf Ihre Datenbank zugreifen und oh, übrigens, sollten diese Aspekte (Datenbankkonnektivität usw.) getestet wird an anderer Stelle!).

  

Die andere Argumentationslinie sagt, nein, wenn ich einen Kunden bezwecken Ich möchte nur Customer.Save anrufen und mit ihr geschehen. Warum muss ich wissen, wie man einen Kunden zu speichern, wenn ich das Objekt bin raubend?

, dass Customer Wissen hat eine Save Methode bereits zu wissen, wie ein Kundenobjekt zu speichern. Sie haben das Problem nicht durch die Einbettung dieser Logik in Ihrem Business-Objekt vermieden. Stattdessen haben Sie Ihre Code-Basis mehr eng gekoppelt und daher schwieriger zu pflegen und Test gemacht. Abstoßen der Verantwortung der persistierenden das Objekts an jemanden anderen.

Die Business-Objekte, wie sie genannt werden, sollte ihre eigene Business-Logik offensichtlich Coutain, die Dynamik der Geschäftslogik unter der Domäne, in der Dienstschicht zu sein.

Auf der anderen Seite könnte die BO ein Datencontainer sein (DTO?) Zusammensetzung und Verfahren; was bedeutet, BO sind reine functionnal? Das könnte alle die Konvertierungen zwischen BO und DTO vermeiden.

In einer MVC-Architektur,

Kann man sagen, dass Modell-Business-Objekte enthält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top