Ich habe Head First Java gelesen und verstehe, wie OOP funktioniert. Hier ist mein Problem: Ich bin ein PHP-Programmierer, und während ich OOP in PHP verwendet habe, habe ich Probleme herauszufinden, was ein Objekt sein sollte und welche Methoden es geben.
Nehmen wir zum Beispiel an, ich hätte eine App, mit der sich Benutzer anmelden und ein Dokument bearbeiten können. Warum sollte das Dokument ein Objekt sein, wenn es immer nur eine Instanz geben wird? Soll ich dem Dokumentobjekt oder dem Admin-Objekt die Methode deleteDocument()
geben? Das Dokument wird gelöscht, aber der Administrator führt die Aktion aus.
Meine wirkliche Frage ist also, ausgehend von einem prozeduralen Hintergrund, wie finde ich heraus, was Objekte sein sollten und welche Methoden welche Methoden haben sollten?
Nun, in Ihrem Beispiel bin ich mir nicht sicher, warum in Ihrem Design nur ein Dokument vorhanden ist, aber es sollte trotzdem ein Objekt sein, falls Sie zu einem späteren Zeitpunkt mehr als eins wollen.
Was die Löschfunktion betrifft, gibt es wirklich keine einfache Antwort; Sie werden wahrscheinlich Argumente auf beiden Seiten finden. Ich selbst würde die Löschfunktion auf der unteren Ebene (Dinge wie das Löschen von Datenbankeinträgen) in die Dokumentklasse einfügen, aber jede andere Funktionalität könnte in der übergeordneten Klasse enthalten sein. Wenn alle Dokumente einem Administrator gehören, sollte der Administrator über ein DeleteDocument verfügen, das für das Dokument löscht und alle Zuordnungen aus der Datenbank entfernt.
Wenn Sie im Allgemeinen aus prozeduralen Prozeduren herauskommen und eine große Menge von Zustandsvariablen weitergeben oder viele globale Variablen deklarieren, dann verwandeln Sie diese verwandte Funktionalität in eine Klasse. Versuchen Sie, die Funktionalität, die ein Objekt enthält, so eng wie möglich zu halten, oder Sie könnten feststellen, dass Ihre Klassen nicht mehr unter Kontrolle sind.
Es gibt keine Antwort, die immer gilt. Wenn Sie an objektorientiertem Design interessiert sind, empfehle ich dieses Buch .
Was deine Frage betrifft, wie man herausfinden soll, was Objekte sein sollten und welche Methoden sie haben sollten, ist eine gute Heuristik, sich zu fragen, ob es wichtig ist, etwas zu haben, um etwas zu sein. Hier ist ein Beispiel, an das ich mich aus meiner OOP-Klasse erinnere ... Sie verfolgen in einer Anwendung Personen und Haustiere. Sollte die Personenklasse eine getPets()
Methode haben? Nun, ist ein Haustier wichtig, um eine Person zu sein? Nein. Eine bessere Lösung könnte darin bestehen, eine separate Beziehungsklasse zu haben, die den Heimtierbesitz repräsentiert.
Es hängt zu einem gewissen Grad von Ihrer Sprachwahl ab. Java ist eine "reine OO" Sprache, was bedeutet, dass alles in Klassen verpackt werden muss. C ++ ist "unrein" - Sie könnten entscheiden, dass Ihr Dokument nur ein paar globale Variablen sein wird, wenn Sie wollen.
Selbst in C ++ werden Sie Dinge oft in Klassen packen, obwohl es nur eine Instanz gibt. Das liegt daran, dass eine Klasse mehr als nur eine Möglichkeit ist, beliebige Sachen zusammen zu verpacken - es ist ein Abstraktionsmechanismus. Indem Sie zusammengehörige Dinge gruppieren und den Gruppen Namen geben, machen Sie Ihren Code lesbarer und wartbarer - die Wiederverwendbarkeit ist ein großer Vorteil, aber nicht der einzige Grund, eine Klasse zu verwenden.
Ich würde Wie entwerfe ich objektorientierte Projekte . Die angenommene Antwort ist eine gute.
Die Schritte, die ich für das anfängliche Design (zu einem Klassendiagramm) verwende, sind:
Anforderungen sammeln. Sprechen Sie mit dem Kunden und räumen Sie die Anwendungsfälle aus, um zu definieren, welche Funktionalität die Software haben soll.
Verfassen Sie eine Beschreibung der einzelnen Anwendungsfälle.
Gehe durch die Erzählung und markiere Substantive (Person, Ort, Ding) als Kandidaten und Verben (Aktionen) als Methoden / Verhaltensweisen.
Verwerfen Sie doppelte Substantive und eliminieren Sie die allgemeine Funktionalität.
Erstellen Sie ein Klassendiagramm. Wenn Sie Java-Entwickler sind, verfügt NetBeans 6.7 von Sun über ein UML-Modul, das sowohl Diagramm- als auch Round-Trip-Engineering ermöglicht und KOSTENLOS ist. Eclipse (eine Open-Source-Java-IDE), hat auch ein Modellierungs-Framework, aber ich habe keine Erfahrung damit. Sie können auch ArgoUML ausprobieren, ein Open-Source-Tool.
Wenden Sie OOD-Prinzipien an, um Ihre Klassen zu organisieren (schließen Sie allgemeine Funktionen aus, erstellen Sie Hierarchien usw.)
Meine eigentliche Frage ist also, ausgehend von einem prozeduralen Hintergrund, wie finde ich heraus, was Objekte sein sollten und welche Methoden welche Methoden haben sollten?
Nachdem ich ein wenig Verständnis für die Funktionsweise von OOP von Head First Java gewonnen habe, empfehle ich Ihnen, sich jetzt ein paar der Prinzipien eines guten OO-Designs anzusehen. Es gibt eine Menge Material im Internet, gut und schlecht, aber wenn dir Head First Java gefallen hat, dann empfehle ich dir, eine Kopie des exzellenten Head First OO Analyse & amp; Design Es beantwortet viele Ihrer Fragen und enthält einige hervorragende Beispiele für Szenarien, die Sie hier ansprechen.
Nachdem Sie sich damit befasst haben, sollten Sie sich die SOLID-Grundsätze ansehen und dann (als jemand anderen hier wurde bereits empfohlen, einige OO-Design-Muster .
'Dokument' ist ein spezieller Objekttyp - eine Entität. Die Tatsache, dass sie persistiert oder aus dem Speicher entfernt werden kann, ist ein separates Problem, das von einer anderen Klasse behandelt werden sollte, die einige als "Datenzugriffsschicht" bezeichnen. Ihre Business-Klassen (hoffe, Sie haben einige) verwenden die Entität, dal und andere Klassen, um Ihre Geschäftsfunktionen durchzuführen.
Es geht weit darüber hinaus, mit der Einführung von Schnittstellen und Generika.
Tags und Links oop