PHP objektorientiert: Verständnisfrage
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgabe
barcode
code
datum
detail
element
gesamte system
grundlage
hilfestellung
http
information
kapsel
kennen
logik
methode
referenz
report
typ
url
vorlage
-
Hi zusammen
Ich beschäftige mich derzeit mit der objektorientierten Programmierung.
Konkret programmiere ich mein Reportsystem neu objektorientiert und dazu habe ich nun eine Verständnisfrage:
Ein Report besteht aus mehreren Teilen, die sogenannten Report-Details.
Im Erstellungsprozess werden die Report-Details als Vorlagen geladen. Anschliessend werden neue Objekte die Report-Elemente gebildet welche die für das derzeit gewählte Dossier die gewünschten Daten enthalten (also Reportelement mit ausgefüllten Daten), diese Elemente behalten als Referenz die Vebindung zu den Details (eingebunden unter $this->vorlage).
Ich habe diese Art gewählt, da ich mir denke, dass diese am performantesten ist:
Zuerst werden die Vorlagen geladen,
dann werden pro gewünschtem Datensatz die Elemente gebildet mit den korrekten Daten
am Schluss wird alles ausgegeben mit der gewünschten Ausgabeart (derzeit HTML, PDF oder xml).
Dafür habe ich drei Klassen: die generelle Reportklasse (vreport), die Detailklasse (vreportdetails) und die Elementeklasse (vreportelemente).
Aufgerufen wird ein Report mittels der vreport Klasse, diese steuert anschliessend die Detail- und Elementeklasse.
Da die Elementeklasse es nicht interessieren sollte, wie die Ausgabe erfolgt wird die Schlussausgabe wiederum von der vreport-Klasse übernommen (durchgehen aller Elemente und abholen der Daten).
Trotzdem benötige ich aber bei der Schlussausgabe wieder Informationen von den Details (z.B. ist es ein Barcodereport, EZ oder normaler Text). Diese Information speichere ich derzeit nicht auf die vreportElemente-Klasse, da diese ja bezogen werden können aus der vreportdetails-Klasse.
Soll ich nun aber in der vreportElemente-Klasse eine spezielle Getter-Methode setzen um den Typ der Detailklasse zu holen:
public function vGetDetailType() { return $this->vorlage->vGetType(); }
oder ist es zulässig, dass ich aus der vreport-Klasse diese direkt via der Vorlagen-Referenz bedient:
$reportelement->vorlage->vGetType();
Oder ist das reine Ansichtssache?
Wäre froh wenn mir hier jemand helfen könnte (vielleicht mache ich mir auch zuviele Gedanken, aber soll halt einigermassen richtig kommen und nicht schon von Anfang an Designfehler enthalten).
Gruess
Meron -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Allgemein kannst du das machen wie Du willst, aber einen Method wrapper würde ich dennoch benutzen. Also:
$reportObj->vDetailGetType(); // GlobalScope
Das ist einfacher zu handhaben. -
Also ich würde die "vorlage"-Variable nicht public machen sondern über den Getter gehen.
Persönlich arbeite ich immer mit Gettern. Dies entspricht eher dem Geheimnisprinzip und der Datenkapselung.
Ansonsten immer überlegen wie man Logik kapseln und zusammenfassen kann. Oft benötigt man dann gar keine Durchreichung von Daten mehr.
Aber dazu müsste ich das gesamte System kennen... -
Danke euch beiden für die Informationen und Hilfestellungen. Ich werde es nun so angehen wie ihr auch empfiehlt via separaten Getter-Methoden.
schrotti12 schrieb:
[...]
Ansonsten immer überlegen wie man Logik kapseln und zusammenfassen kann. Oft benötigt man dann gar keine Durchreichung von Daten mehr.
Aber dazu müsste ich das gesamte System kennen...
Ja, das kann durchaus stimmen, denn ich könnte ja anstelle eines Reportelementes für Barcodes ein separates (Barcode-)Element eröffnen, dann müsste ich den Typ nicht mehr durchreichen, doch das kriege ich derzeit noch nicht in meinen Kopf hinein wie ich dies technisch lösen muss (vorallem wiederum aufgeteilt auf die HTML+PDF-Variante) und die Durchreichemethode finde ich für meinen Zweck noch recht optimal (vorstellen kann man sich das wie bei einer xyz.dotx-Word-Vorlage: bei einem Doppelklick wird zwar ein neues Dokument eröffnet, meines weiss aber noch dass es zur Vorlage xyz gehört und daraus beziehe ich dann die Informationen für die Ausgabe). -
Da kommen dir UML-Tools oft zu Gute wo du dir derartige Konstrukte erst grafisch darstellen kannst bevor du sie ausprogrammierst. Leider sind viele dieser Tools kostenpflichtig, aber ich hab eins gefunden das auf Eclipse basiert, als 64bit-Anwendung verfügbar und für private Anwender kostenlos ist:
Modelio
Vieleicht hilfts dir weiter. Ein paar Grundlagen zu UML findest zu auf Wikipedia
Mir hat das bei komplexen Problemen immer sehr geholfen wenn ich das grafisch mit Kollegen besprechen und durchgehen konnte. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage