Sagen , dass ich eine Klasse , Person
die Instanzvariablen hat age
, weight
und height
, und eine andere Klasse , Fruit
die Instanzvariablen hat sugarContent
und texture
. Die Person
Klasse hat keine Methoden außer Setter und Getter, während die Fruit
Klasse sowohl Setter als auch Getter und logische Methoden wie hat calculateSweetness
. Ist die Fruit
Klasse der Klassentyp, der besser als die Person
Klasse ist? Damit meine ich, dass die Person
Klasse anscheinend nicht viel Sinn hat; Es dient ausschließlich zum Organisieren von Daten, während die Fruit
Klasse Daten organisiert und tatsächlich Methoden für die Logik enthält.
8
Antworten:
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.
quelle
CalculateAverageHeight()
ich eine statische Methode erwarten ,Person
die eine Sammlung vonPerson
Objekten verwendet. Auf diese Weise halten Sie es, obwohlCalculateAverageHeight()
es nicht auf eine einzelne Instanz von anwendbar istPerson
, immer noch nahe an den Daten, mit denen es arbeitet.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.
quelle
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.
quelle
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?
quelle
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
calculateSweetness
für a benötigtFruit
, aber keine Operationen für aPerson
ausführt, außer das Abrufen und Festlegen der Attribute, sollte Ihr Modell dies genau widerspiegeln, indem es keine Logik in der Klasse hatPerson
. In Version 2.0 kann es sinnvoll sein, auch eine Logik hinzuzufügen.Person
Wenn Sie sich an diesem Punkt befinden, fügen Sie die betreffenden Methoden hinzu.quelle
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 #
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 .
quelle
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::pair
in 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 Namenfirst
und enthältsecond
. Wahrscheinlich eine der nützlichsten Klassen in der gesamten STL (meiner Meinung nach sowieso :))quelle