Ist es angemessen, dass eine Klasse nur eine Sammlung von Informationen ohne Logik ist?

8

Sagen , dass ich eine Klasse , Persondie Instanzvariablen hat age, weightund height, und eine andere Klasse , Fruitdie Instanzvariablen hat sugarContentund texture. Die PersonKlasse hat keine Methoden außer Setter und Getter, während die FruitKlasse sowohl Setter als auch Getter und logische Methoden wie hat calculateSweetness. Ist die FruitKlasse der Klassentyp, der besser als die PersonKlasse ist? Damit meine ich, dass die PersonKlasse anscheinend nicht viel Sinn hat; Es dient ausschließlich zum Organisieren von Daten, während die FruitKlasse Daten organisiert und tatsächlich Methoden für die Logik enthält.

Pasawaya
quelle
Eine Person hat also Setter für Größe, Gewicht und / oder Größe, oder? Setter wären sinnlos, wenn es keine Logik gibt, die diese Attribute irgendwo manipuliert. Ist diese Logik in einer richtigen Klasse?
Kommen Sie vom
@COMEFROM: Sie haben Recht, das ist die Frage, die hier gestellt werden muss. In Informationssystemen ist es jedoch nicht ungewöhnlich, dass der gesamte Zweck einiger Attribute darin besteht, dass sie in diesem System ohne echte Logik gespeichert, angezeigt und gemeldet werden (Geschäftsprozesse, die diese Attribute tatsächlich verwenden, können außerhalb des Informationssystems existieren).
Doc Brown
@ Doc Brown: Ich weiß und ich stimme zu. Ich sehe nichts falsches an Klassen ohne Logik, aber Setter in solchen Klassen zu haben, ist etwas verdächtig. Ich würde prüfen, wo diese Setter benötigt werden. Wie Sie geschrieben haben: Fügen Sie einer Klasse bei Bedarf Funktionen hinzu. Ein Setter ist eine Funktionalität.
Kommen Sie vom

Antworten:

8

Wenn Ihre Person tatsächlich nichts tut, müssen keine Maßnahmen ergriffen werden. Es ist möglich, Klassen zu haben, die nur Daten sammeln, und dann gibt es Klassen, die diese Daten verarbeiten. In Ihrem Fall ist es möglich, dass Sie keine Aktion für eine einzelne Person ausführen, es kann jedoch eine Aktion für eine Gruppe von Personen wie CalculateAverageHeight () geben. In diesem Fall ist es sinnvoll, nur eine Person ohne Aktion zu haben und dann eine andere Klasse (möglicherweise ein Freund) zu haben, die daran arbeitet.

Manoj R.
quelle
1
Ich würde nicht sagen, dass es "üblich" ist, Ihre Daten und Logik in einem richtig gestalteten OOP-System in verschiedene Klassen aufzuteilen. Für Ihr Beispiel würde CalculateAverageHeight()ich eine statische Methode erwarten , Persondie eine Sammlung von PersonObjekten verwendet. Auf diese Weise halten Sie es, obwohl CalculateAverageHeight()es nicht auf eine einzelne Instanz von anwendbar ist Person, immer noch nahe an den Daten, mit denen es arbeitet.
TMN
1
@ TMN - Entschuldigung für das gemeinsame Wort. Es ist nicht üblich, aber möglich. Ich bin nicht der Meinung, dass die Berechnung der Durchschnittsgröße eng mit der Personenklasse zusammenhängt. Betrachten Sie eine andere Funktion HighDensityArea (), die herausfindet, in welchem ​​Gebiet sich der größte Teil der Bevölkerung befindet. Diese Funktion benötigt nur das Adressfeld der Person. Es besteht keine Notwendigkeit, dies eng mit der Person-Klasse zu verknüpfen.
Manoj R
4

Es ist schwierig, eine Regel zu finden, die besagt, dass alle Klassen eine Logik haben müssen. Im Allgemeinen werden Klassen ohne Logik als AnemicDomainModel betrachtet .

Selbst dann ist es besser, Daten zu organisieren, wenn die zugehörigen Informationen umfangreich werden. In diesem Fall benötigen Sie beispielsweise möglicherweise noch eine Personensammlung als viele nicht verwandte Sammlungen.

Jayan
quelle
3
Ich denke nicht, dass dies (AnemicDomainModel) immer wahr ist, nur weil Sie keine Logik haben. Tatsächlich denke ich, dass viele grundlegende Entitätstypen genau dies sind: eine Sammlung von Informationen, die sich alle auf ein bestimmtes Objekt beziehen, aber ohne eine bestimmte Logik, die damit verbunden ist. Eine Person ist nur ..., aber es ist schwer zu argumentieren, dass Sie keine Klasse haben sollten, um eine Person zu repräsentieren.
Peter Rowell
@ Peter Rowell: Die Entität (Bean) von J2EE wird im Artikel besonders erwähnt.
Jayan
1
Sie könnten auch das Befehlsentwurfsmuster
Eoin
Eine gut funktionierende Definition des anämischen Domänenmodells ist eine Domäne, in der Geschäftsregeln vorhanden sein müssen, um die Datenintegrität innerhalb eines Objekts zu erzwingen. Diese Regeln sind jedoch nicht in demselben Objekt gekapselt . Wenn ein Objekt keine Logik benötigt , um einen intern konsistenten Status aufrechtzuerhalten, z. B. ein Money-Muster, sollte es diese Logik nicht haben . Wenn eine Rechnung jedoch eine Zwischensummen-Dateneigenschaft hat, die immer die Summe der erweiterten Kosten ihrer Werbebuchungen sein sollte (von denen jede wiederum Einheitspreis * Menge ist), sollten diese Eigenschaften berechnet und nicht direkt einstellbar sein.
KeithS
Wenn Sie viele Klassen haben, die so sind, haben Sie ein Problem. Manchmal möchten Sie jedoch einfach einige Datenelemente organisieren, aber es gibt keine Methoden, die anderswo nicht sinnvoller sind.
Loren Pechtel
3

Das DataTransferObject ist ein gutes Beispiel für eine Klasse, die keine Logik, sondern nur Daten enthält. Das ist jedoch sein Zweck; Es ist ausdrücklich eine Ausnahme von der allgemeinen Regel, dass alle Klassen die Geschäftslogik implementieren sollten, die sich auf ihren internen Status auswirkt. Eine Klasse zu haben, deren interner Zustand durch externe Logik geändert wird, ist oft ein Designgeruch. Es ist nicht immer falsch, aber es ist fast immer etwas, das Sie in Betracht ziehen sollten, umzugestalten.

TMN
quelle
3

Kehren Sie die Frage um und schauen Sie sich das andere Ende an. Wenn Sie eine Sammlung von Informationen haben, die offensichtlich zusammengehören, sollten Sie sie auseinanderhalten, nur weil es keine Methoden gibt, die Sie dieser Klasse hinzufügen könnten? Sollten Sie gezwungen sein, willkürliche Methoden zu erfinden, um die Klasse zu rechtfertigen?

MSalters
quelle
2

Modelle sind kein Selbstzweck - Sie sollten einer Klasse Funktionen hinzufügen, wenn Sie sie wirklich in Ihrem Programm benötigen, und nicht davon ausgehen, dass Sie sie wahrscheinlich in Zukunft benötigen werden. Es ist also selbstverständlich, dass Sie zu einem bestimmten Zeitpunkt Klassen ohne "echte" Methoden haben. Wenn Sie später feststellen, dass es sinnvoll ist, der Klasse Methoden hinzuzufügen, tun Sie genau das. Die Qualität eines Modells wird nicht gemessen mit "Habe ich hier Methoden und keine Methoden dort?" - Die Qualität wird gemessen mit "Habe ich alle Methoden, die meine Anwendung tatsächlich benötigt?".

Wenn Ihre Anwendung in Version 1.0 beispielsweise etwas wie calculateSweetnessfür a benötigt Fruit, aber keine Operationen für a Personausführt, außer das Abrufen und Festlegen der Attribute, sollte Ihr Modell dies genau widerspiegeln, indem es keine Logik in der Klasse hat Person. In Version 2.0 kann es sinnvoll sein, auch eine Logik hinzuzufügen. PersonWenn Sie sich an diesem Punkt befinden, fügen Sie die betreffenden Methoden hinzu.

Doc Brown
quelle
1

Ich denke, das hängt von der Sprache ab und davon, wie Sie die Sprache verwenden.

Im trivialen Fall bestehen einige Sprachen darauf, dass sich alles in einer Klasse befindet. Daher müssen Sammlungen von Konstanten in eine Klasse eingeteilt werden, die dann möglicherweise keine Logik hat, in anderen Sprachen landen sie möglicherweise stattdessen in einem Namespace.

In Multi-Paradigmen-Sprachen kann es auch davon abhängen, an welchem ​​Paradigma Ihr Design festhalten soll. Das Ausleihen des Beispiels von CalculateAverageHeight (), wie es wahrscheinlich in einer PersonCollection-Klasse enthalten sein sollte, setzt jedoch eine OOP-Lösung voraus. In einem funktionaleren Design können Sie eine Funktion höherer Ordnung mit einer generischen Sammlung verwenden, z. B. in C #

List<Person> personList = GetListOfPeople();
personlist.Average(p => p.Height);

und dann ist die Logik nicht in PersonCollection oder sogar statisch in Person. In der Tat bedeuten Funktionen höherer Ordnung und generische Datentypen im Allgemeinen, dass Sie mit größerer Wahrscheinlichkeit Objekte erhalten, die nur Datenbeutel sind, da die Logik auf einer höheren Abstraktionsebene arbeitet als Ihr spezifisches Datenmodell .

jk.
quelle
1

Es hört sich so an, als ob Sie über einen POD (einfache alte Daten) sprechen. Verschiedene Sprachen können diese auf unterschiedliche Weise darstellen - es kann sich beispielsweise um eine Klasse mit öffentlichen Mitgliedern oder um eine Struktur mit nur öffentlichen Mitgliedern in C ++ handeln.

Das Organisieren von Daten ist ein durchaus gültiger Grund für die Existenz einer Klasse - es kann häufig dazu führen, dass Code sauberer und leichter zu lesen ist. std::pairin C ++ ist STL ein gutes Beispiel für eine Struktur, die ausschließlich zum Organisieren von Daten existiert - einfach eine Struktur, die zwei Werte eines beliebigen Typs mit dem Namen firstund enthält second. Wahrscheinlich eine der nützlichsten Klassen in der gesamten STL (meiner Meinung nach sowieso :))

Bok McDonagh
quelle