Das Aufschreiben Ihrer Substantive, Verben und Adjektive ist ein großartiger Ansatz, aber ich stelle mir das Klassendesign lieber vor, als die Frage zu stellen, welche Daten versteckt werden sollen .
Stellen Sie sich vor, Sie hätten ein Query
Objekt und ein Database
Objekt:
Das Query
Objekt hilft Ihnen beim Erstellen und Speichern einer Abfrage - Speichern ist hier der Schlüssel, da eine Funktion Ihnen beim Erstellen einer Abfrage helfen kann. Vielleicht könntest du bleiben : Query().select('Country').from_table('User').where('Country == "Brazil"')
. Die Syntax spielt keine Rolle - das ist Ihre Aufgabe! - Der Schlüssel ist, dass das Objekt Ihnen hilft , etwas zu verbergen , in diesem Fall die Daten, die zum Speichern und Ausgeben einer Abfrage erforderlich sind. Die Stärke des Objekts beruht auf der Syntax, es zu verwenden (in diesem Fall eine clevere Verkettung) und nicht wissen zu müssen, was es speichert, damit es funktioniert. Wenn dies richtig gemacht wird, kann das Query
Objekt Abfragen für mehr als eine Datenbank ausgeben. Es würde intern ein bestimmtes Format speichern, könnte aber bei der Ausgabe leicht in andere Formate konvertiert werden (Postgres, MySQL, MongoDB).
Lassen Sie uns nun das Database
Objekt durchdenken . Was versteckt und speichert das? Natürlich kann nicht der gesamte Inhalt der Datenbank gespeichert werden, da wir deshalb eine Datenbank haben! Worum geht es also? Ziel ist es, die Funktionsweise der Datenbank vor Personen zu verbergen , die das Database
Objekt verwenden. Gute Klassen vereinfachen das Denken bei der Manipulation des internen Zustands. Für dieses Database
Objekt können Sie die Funktionsweise der Netzwerkaufrufe oder Stapelabfragen oder Aktualisierungen ausblenden oder eine Caching-Ebene bereitstellen.
Das Problem ist, dass dieses Database
Objekt riesig ist. Es stellt dar, wie auf eine Datenbank zugegriffen werden kann, sodass unter dem Deckmantel alles möglich ist. Es ist klar, dass Networking, Caching und Batching je nach System nur schwer zu bewältigen sind. Daher wäre es sehr hilfreich, sie zu verstecken. Wie viele Leute bemerken werden, ist eine Datenbank jedoch wahnsinnig komplex. Je weiter Sie von den unformatierten DB-Aufrufen entfernt sind, desto schwieriger ist es, die Leistung abzustimmen und zu verstehen, wie die Dinge funktionieren.
Dies ist der grundlegende Kompromiss von OOP. Wenn Sie die richtige Abstraktion auswählen, wird die Codierung einfacher (String, Array, Dictionary). Wenn Sie eine zu große Abstraktion auswählen (Database, EmailManager, NetworkingManager), wird sie möglicherweise zu komplex, um wirklich zu verstehen, wie sie funktioniert oder was zu tun ist erwarten von. Das Ziel ist es, die Komplexität zu verbergen , aber eine gewisse Komplexität ist notwendig. Eine gute Faustregel ist, zunächst Manager
Objekte zu vermeiden und stattdessen Klassen zu erstellen, die wie structs
folgt aussehen : Sie enthalten lediglich Daten und einige Hilfsmethoden zum Erstellen / Bearbeiten der Daten, um Ihnen das Leben zu erleichtern. Zum Beispiel beim EmailManager
Start mit einer aufgerufenen Funktion sendEmail
, die ein Email
Objekt nimmt. Dies ist ein einfacher Ausgangspunkt und der Code ist sehr leicht zu verstehen.
Überlegen Sie sich in Ihrem Beispiel, welche Daten zusammen sein müssen, um zu berechnen, wonach Sie suchen. Wenn Sie beispielsweise wissen möchten , wie weit ein Tier läuft , können Sie AnimalStep
und AnimalTrip
(Sammlung von AnimalSteps) Klassen haben. Jetzt, da jede Reise alle Schrittdaten enthält, sollte es in der Lage sein, Dinge darüber herauszufinden, was vielleicht AnimalTrip.calculateDistance()
Sinn macht.