Dieser Artikel behauptet, dass eine Datenklasse ein "Codegeruch" ist. Der Grund:
Es ist normal, wenn eine neu erstellte Klasse nur wenige öffentliche Felder enthält (und möglicherweise sogar eine Handvoll Getter / Setter). Die wahre Stärke von Objekten besteht jedoch darin, dass sie Verhaltenstypen oder Operationen für ihre Daten enthalten können.
Warum ist es falsch, dass ein Objekt nur Daten enthält? Wenn die Hauptverantwortung der Klasse darin besteht, Daten darzustellen, würden Sie dann nicht Methoden hinzufügen, die auf die Daten angewendet werden, um das Prinzip der Einzelverantwortung zu verletzen ?
Antworten:
Es ist absolut nichts Falsches daran, reine Datenobjekte zu haben. Der Autor des Stücks weiß ehrlich gesagt nicht, wovon er spricht.
Ein solches Denken stammt aus einer alten, fehlgeschlagenen Idee, dass "True OO" der beste Weg zum Programmieren ist und dass es sich bei "True OO" um "Rich Data Models" handelt, bei denen man Daten und Funktionalität mischt.
Die Realität hat uns gezeigt, dass genau das Gegenteil der Fall ist, insbesondere in dieser Welt der Multithread-Lösungen. Reine Funktionen, kombiniert mit unveränderlichen Datenobjekten, sind nachweislich ein besserer Weg, um zu codieren.
quelle
Es ist absolut nichts Falsches daran, reine Datenobjekte zu haben. Der Autor hat eine Meinung, die von den mir bekannten Softwareentwicklern nicht geteilt wurde.
Insbesondere für das Datenbank-Mapping haben Sie im Allgemeinen Entitätsklassen, die nur die in der Datenbank gespeicherten Felder sowie Getter und Setter enthalten. Wikipedia Hibernate (Framework)
Die Grundidee von Java-Beans, die von vielen Tools / Frameworks verwendet werden, basiert auf Datenklassen, die als Beans bezeichnet werden und nur Felder und die zugehörigen Getter und Setter enthalten. Wikipdia JavaBeans
Fazit:
Wenn jemand behauptet, etwas sei 'schlecht' oder 'ein Codegeruch ', sollten Sie immer nach den angegebenen Gründen suchen. Wenn die Gründe nicht überzeugen, fragen Sie jemanden nach besseren Gründen oder einer anderen Meinung. (Wie du es in diesem Forum getan hast)
quelle
Ein gutes Argument, warum von Martin Fowler:
"Tell-Don't-Ask ist ein Prinzip, mit dem sich die Menschen daran erinnern, dass es bei der Objektorientierung darum geht, Daten mit den Funktionen zu bündeln, die auf diese Daten angewendet werden. Es erinnert uns daran, dass wir ein Objekt nicht nach Daten fragen und auf diese Daten reagieren müssen." sollte stattdessen einem Objekt mitteilen, was zu tun ist. Dies ermutigt dazu, das Verhalten in ein Objekt zu verschieben, das zu den Daten passt. "
https://martinfowler.com/bliki/TellDontAsk.html
quelle
baz
als Parameter zu einer statischen Methode, sondern das zu tun, müssen Sie zunächst fragen , das Objekt für sie. Vielleicht ist dies in einem Programmierparadigma, in dem Methoden primär waren (wie zum Beispiel funktionale Programmierung), sinnvoll, aber in einer OO-Umgebung absolut nicht, da Objekte primär sind und sowohl die Daten als auch die Funktionen enthalten sollten, auf die sie angewendet werden sollen. Ihre Behauptung, dass das Entfernen der Methode aus dem Objekt zu einer erhöhten Verkapselung geführt hat, ist meines Erachtens ebenfalls genau rückwärts , da Sie jetztbaz
außerhalb des Objekts erscheinen.Was Sie verstehen müssen, ist, dass es zwei Arten von Objekten gibt:
Objekte, die Verhalten haben . Diese sollten es unterlassen, den meisten ihrer Datenmitglieder öffentlich zugänglich zu machen. Ich erwarte nur sehr wenige Accessormethoden, die für diese definiert sind.
Ein Beispiel wäre ein kompilierter regulärer Ausdruck: Das Objekt wird erstellt, um ein bestimmtes Verhalten bereitzustellen (um eine Zeichenfolge mit einem bestimmten regulären Ausdruck abzugleichen und die (Teil-) Übereinstimmungen zu melden), aber wie der kompilierte reguläre Ausdruck seine Arbeit tut, ist nicht Sache des Benutzers Geschäft.
Die meisten Klassen, die ich schreibe, sind in dieser Kategorie.
Objekte, die eigentlich nur Daten sind . Diese sollten lediglich alle ihre Mitglieder für öffentlich erklären (oder ihnen den vollständigen Zugriffssatz zur Verfügung stellen).
Ein Beispiel wäre eine Klasse
Point2D
. Es gibt absolut keine Invariante, die für die Mitglieder dieser Klasse sichergestellt werden muss, und Benutzer sollten nur übermyPoint.x
und auf die Daten zugreifen könnenmyPoint.y
.Persönlich verwende ich solche Klassen nicht viel, aber ich denke, es gibt keinen größeren Code, den ich geschrieben habe und der nicht irgendwo eine solche Klasse verwendet.
Um mit der Objektorientierung vertraut zu sein, muss man erkennen, dass es diese Unterscheidung gibt, und lernen, die Funktion einer Klasse in eine dieser beiden Kategorien einzuteilen.
Wenn Sie in C ++ codieren, können Sie diese Unterscheidung explizit vornehmen, indem Sie
class
für die erste Kategorie von Objekten undstruct
für die zweite Kategorie verwenden . Natürlich sind die beiden gleich, außer dass diesclass
bedeutet, dass standardmäßig alle Mitglieder privat sind, während standardmäßigstruct
alle Mitglieder öffentlich sind. Welches ist genau die Art von Informationen, die Sie kommunizieren möchten.quelle