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 QueryObjekt und ein DatabaseObjekt:
Das QueryObjekt 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 QueryObjekt 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 DatabaseObjekt 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 DatabaseObjekt verwenden. Gute Klassen vereinfachen das Denken bei der Manipulation des internen Zustands. Für dieses DatabaseObjekt können Sie die Funktionsweise der Netzwerkaufrufe oder Stapelabfragen oder Aktualisierungen ausblenden oder eine Caching-Ebene bereitstellen.
Das Problem ist, dass dieses DatabaseObjekt 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 ManagerObjekte zu vermeiden und stattdessen Klassen zu erstellen, die wie structsfolgt aussehen : Sie enthalten lediglich Daten und einige Hilfsmethoden zum Erstellen / Bearbeiten der Daten, um Ihnen das Leben zu erleichtern. Zum Beispiel beim EmailManagerStart mit einer aufgerufenen Funktion sendEmail, die ein EmailObjekt 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 AnimalStepund 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.