Nein , ein Objekt muss keine Entität darstellen.
In der Tat würde ich argumentieren, dass wenn Sie aufhören, Objekte als physikalische Einheiten zu betrachten, Sie endlich die Vorteile erhalten, die OOP verspricht.
Dies ist nicht das beste Beispiel, aber das Design der Kaffeemaschine ist wahrscheinlich der Punkt, an dem das Licht für mich aufleuchtete.
Objekte handeln von Nachrichten. Es geht um Verantwortlichkeiten. Es geht nicht um Autos, Benutzer oder Befehle.
Ich weiß, dass wir OO auf diese Weise unterrichten, aber es wird nach einigen Versuchen deutlich, wie grundlegend frustrierend es ist, herauszufinden, wohin die Dinge gehen, wenn Sie versuchen, MVC, MVVM oder MVWhatever auszuführen. Entweder werden Ihre Modelle lächerlich aufgebläht oder Ihre Controller. Aus Gründen der Navigationsfähigkeit ist es gut zu wissen, dass sich alles, was Fahrzeuge berührt, in der Datei Vehicle.ext befindet. Wenn es sich bei Ihrer Anwendung jedoch um Fahrzeuge handelt, befinden sich zwangsläufig 3000 Zeilen Spaghetti in dieser Datei.
Wenn Sie eine neue Nachricht senden müssen, haben Sie mindestens ein neues Objekt und möglicherweise ein Paar davon. In Ihrer Frage zu einem Bündel von Methoden würde ich argumentieren, dass Sie möglicherweise über ein Bündel von Nachrichten sprechen. Und jeder könnte sein eigenes Objekt sein, mit seiner eigenen Aufgabe. Und das ist in Ordnung. Es wird offensichtlich, wenn Sie Dinge aufteilen, die wirklich, wirklich zusammen sein müssen. Und du hast sie zusammengefügt. Sie legen jedoch nicht jede Methode sofort in eine vage passende Schublade, wenn Sie OO genießen möchten.
Sprechen wir über Taschen voller Funktionen
Ein Objekt kann nur eine Sammlung von Methoden sein und trotzdem OO sein, aber meine "Regeln" sind ziemlich streng.
Die Sammlung sollte eine einzige Verantwortung haben, und diese Verantwortung kann nicht so allgemein sein wie "Tut Sachen für Motoren". Ich mache vielleicht so etwas wie eine Fassade auf Serviceebene, aber ich bin mir sehr bewusst, dass ich aus Gründen der Navigierbarkeit / Entdeckung faul bin, nicht weil ich versuche, OO-Code zu schreiben.
Alle Methoden sollten sich auf einer einheitlichen Abstraktionsebene befinden. Wenn eine Methode Motor-Objekte abruft und eine andere Pferdestärke zurückgibt, liegt das wahrscheinlich zu weit auseinander.
Das Objekt sollte auf der gleichen Art von Daten arbeiten. Dieses Objekt macht Sachen mit Motoren (Start / Stopp), dieses macht Sachen mit Kurbellängen, dieses erledigt die Zündsequenzierung, dieses nimmt eine HTML-Form an. Diese Daten können möglicherweise Felder auf dem Objekt sein und sie scheinen zusammenhängend zu sein.
Ich baue im Allgemeinen Objekte dieser Art, wenn ich Transformationen oder Kompositionen durchführe oder mich nur nicht um die Veränderbarkeit sorgen möchte.
Die Fokussierung auf Objektverantwortung führt mich zum Zusammenhalt. Es muss eine gewisse Kohäsion geben, um ein Objekt zu sein, aber es muss weder Felder noch sehr viel Verhalten geben, damit es ein Objekt ist. Wenn ich ein System bauen würde, das diese 5 Motormethoden benötigt, würde ich mit 5 verschiedenen Objekten beginnen, die diese Dinge tun. Da ich Gemeinsamkeiten gefunden habe, habe ich entweder angefangen, Dinge zusammenzuführen oder allgemeine "Hilfs" -Objekte zu verwenden. Das bewegt mich in offene / geschlossene Fragen - wie kann ich diese Funktionalität extrahieren, damit ich diese bestimmte Datei nie wieder ändern muss, sie aber trotzdem bei Bedarf verwende?
Objekte handeln von Nachrichten
Felder sind für ein Objekt kaum von Bedeutung - das Abrufen und Setzen von Registern verändert die Welt außerhalb des Programms nicht. Die Zusammenarbeit mit anderen Objekten erledigt die Arbeit. Die Stärke von OO besteht jedoch darin, dass wir Abstraktionen erstellen können, sodass wir nicht über alle Details gleichzeitig nachdenken müssen. Abstraktionen, die lecken oder keinen Sinn ergeben, sind problematisch, daher denken wir (vielleicht zu viel) darüber nach, Objekte zu schaffen, die unseren mentalen Modellen entsprechen.
Leitfrage: Warum müssen diese beiden Objekte miteinander sprechen?
Stellen Sie sich das Objekt als ein Organ in einer Person vor - es hat einen Standardzweck und ändert das Verhalten nur, wenn es eine bestimmte Nachricht empfängt, die es interessiert.
Stellen Sie sich ein Szenario vor, in dem Sie sich auf dem Zebrastreifen befinden und ein Auto schnell kommt. Als Gehirnobjekt erkenne ich einen Stressor. Ich fordere den Hypothalamus auf, Corticotropin freisetzendes Hormon zu senden. Die Hypophyse erhält diese Nachricht und setzt das kortikotrophe Hormon der Nebenniere frei. Die Nebennieren erhalten diese Nachricht und erzeugen Adrenalin. Wenn das Muskelobjekt diese Adrenalin-Botschaft empfängt, zieht es sich zusammen. Wenn das Herz die gleiche Nachricht erhält, schlägt es schneller. Es gibt eine ganze Reihe von Akteuren, die mit dem komplexen Verhalten des Sprints auf der anderen Straßenseite befasst sind, und es kommt auf die Botschaften an. Das Gehirnobjekt weiß, wie es den Hypothalamus dazu bringt, den Alarm auszulösen, aber es weiß nicht, welche Kette von Objekten das Verhalten letztendlich auslösen wird. Ebenso hat das Herz keine Ahnung, woher Adrenalin kommt,
In diesem ( vereinfachten ) Beispiel muss das Nebennierenobjekt nur wissen, wie man ACTH einnimmt und Adrenalin produziert. Dazu braucht es keine Felder, aber es scheint mir trotzdem ein Objekt zu sein.
Wenn unsere Anwendung nur zum Sprinten über die Straße konzipiert ist, benötige ich möglicherweise nicht die Hypophyse und die Objekte der Nebenniere. Oder ich brauche nur ein Hypophysenobjekt, das nur einen kleinen Teil dessen leistet, was wir konzeptionell als "Hypophysenmodell" betrachten könnten. Diese Konzepte existieren alle als konzeptionelle Einheiten, aber es ist Software und wir können den AdrenalineSender oder MuscleContractor oder was auch immer herstellen und uns nicht viel über die "Unvollständigkeit" unseres Modells sorgen.