Tutorial "Objektorientierte Implementierung eines Gästebuch"

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
Antworten
apffan200
Beiträge: 41
Registriert: 15.09.2013, 20:22:40

Tutorial "Objektorientierte Implementierung eines Gästebuch"

Beitrag von apffan200 » 15.09.2013, 20:36:56

Hallo liebe APF Community,

ich hab mich jetzt vor kurzem bei einem neuem Projekt für das APF entschieden. Auch wenn es einige Sachen enthielt, an die ich mich gewöhnen musste, bereue ich meine Entscheidung nicht.

Ich hab mal, um mich in die Entwickelung komplexer Module einzuarbeiten, dieses Tutorial gesehen: http://adventure-php-framework.org/Seit ... aestebuchs
Leider hab ich nicht alles so gut verstanden, weshalb ich euch mal um Rat fragen wollte.
Bei der Gestaltung von mehrfach einsetzbaren Modulen ist es zudem wichtig, dass diese keine direkte Abhängigkeit zu bestehenden Funktionalitäten einer Webseite oder Applikation besitzen.
Ja, das hab ich auch schon gehört. Aber im Kommentarmodul wurde doch auch über die Klasse "APF Object" ein Objekt aus dem Pager Modul eingebunden, ist das dann nicht auch eine Abhängigkeit?

Zum laden von GB Einträgen wird das Pattern "Domain Model" verwendet. Ich kenn das zwar vom lesen her, hab bisher aber noch nie so wirklich verstanden, was es mir nützt, weshalb die Frage aufkommt, welche Vorteile es hat, weil ich fand es eigentlich ausreichend fand, wenn man das Array aus der SQL Abfrage returned oder es leicht verändert.

Ich wäre sehr dankbar, wenn man mich aufklären würde,

Schönen Abend noch,
apffan200

Benutzeravatar
dr.e.
Administrator
Beiträge: 4537
Registriert: 04.11.2007, 16:13:53

Re: Tutorial "Objektorientierte Implementierung eines Gästeb

Beitrag von dr.e. » 16.09.2013, 14:47:13

Hallo apffan200,

herzlich Willkommen im APF-Forum und der APF-Community! Freut mich sehr, dass dich das Framework überzeugen konnte. :)
Bei der Gestaltung von mehrfach einsetzbaren Modulen ist es zudem wichtig, dass diese keine direkte Abhängigkeit zu bestehenden Funktionalitäten einer Webseite oder Applikation besitzen.

Ja, das hab ich auch schon gehört. Aber im Kommentarmodul wurde doch auch über die Klasse "APF Object" ein Objekt aus dem Pager Modul eingebunden, ist das dann nicht auch eine Abhängigkeit?
Hier geht es im Kern um das Thema Wiederverwendbarkeit. Existieren explizite Abhängigkeiten von einer Applikation zu einem Modul ist das kein Problem. Umgekehrt schon, da sich ein Modul dann auf das Vorhandensein einer Applikation verlassen können muss und du damit das Modul nicht "einfach mal so" in einer anderen Applikation einsetzen kannst.

Die von dir angemerkte Abhängigkeit ist auch eine Abhängigkeit, jedoch auf einem deutlich niedrigeren Level - eine Code-Abhängigkeit. Diese ist natürlich zulässig, denn du musst dich im Code schon auf "irgendetwas" verlassen können. Sei es einen Server, der PHP installiert hat, eine Funktion, die von PHP angeboten wird oder eine Framework-Komponente, die du in deiner Applikation oder deinem Modul nutzen möchtest, wenn du das Framework einsetzt. Das sind alles Abhängigkeiten, die sehr wohl zulässig sind.
Zum laden von GB Einträgen wird das Pattern "Domain Model" verwendet. Ich kenn das zwar vom lesen her, hab bisher aber noch nie so wirklich verstanden, was es mir nützt, weshalb die Frage aufkommt, welche Vorteile es hat, weil ich fand es eigentlich ausreichend fand, wenn man das Array aus der SQL Abfrage returned oder es leicht verändert.
Konkrete Typen in deiner Applikation oder deinem Modul zu verwenden bedeutet Typisierung und Kapselung.

Die Typisierung bietet einige Vorteile, da du in einem Controller sehr klar weißt, was dein Objekt "kann", sprich welche weiteren Typen dort vielleicht enthalten sind oder welchen Inhalte und Funktionen deine Daten haben. Arbeitest du mit Arrays kannst du dich nicht drauf verlassen, dass etwas vorhanden ist und du es auch nutzen kannst.

Kapselung ist ebenso wichtig, da du beispielsweise basierend auf ein oder mehreren Daten ein Objekt (=konkreter Datentyp) fragen kannst, ob er die ein oder andere Bedingung erfüllt. Arbeitest du mit Arrays musst du im schlimmsten Fall die Abfragen bzw. die Logik an mehreren Stellen einbauen und das führe schnell zu Inkonsistenzen.

Hoffe das hilft dir weiter und du hast weiter Freude am APF!
Viele Grüße,
Christian

apffan200
Beiträge: 41
Registriert: 15.09.2013, 20:22:40

Re: Tutorial "Objektorientierte Implementierung eines Gästeb

Beitrag von apffan200 » 16.09.2013, 16:08:05

@dr.e.

danke für deine Hilfe!

Zum Thema Abhängigkeit:

Ja gut, aber das Gästebuch ist doch auch "nur" ein Modul, wie der Pager und müsste doch, sofern man es im nächsten Projekt wiederverwenden will, beides mit Copy+Paste ins nächste Projekt bringen. Gut: bei den Modulen is das kein Problem, die sind ja in jedem APF Pack mitgeliefert, aber bei selbst entwickelten Modulen, die man später noch mal braucht, ist das doch dann ein Problem.
Vielleicht verstehe ich den Unterschied zwischen Codeabhängigkeiten und "größeren" Abhängigkeiten noch nicht so ganz. Wäre ganz nett, wenn du mir dazu ein Beispiel nennen könnstest.

Zum Thema Domain Object:

Gut erklärt, hab keine Fragen mehr!
Hoffe das hilft dir weiter und du hast weiter Freude am APF!
Davon bin ich überzeugt!

LG apffann200

Benutzeravatar
dr.e.
Administrator
Beiträge: 4537
Registriert: 04.11.2007, 16:13:53

Re: Tutorial "Objektorientierte Implementierung eines Gästeb

Beitrag von dr.e. » 16.09.2013, 19:52:09

Hallo apffan200,
Ja gut, aber das Gästebuch ist doch auch "nur" ein Modul, wie der Pager und müsste doch, sofern man es im nächsten Projekt wiederverwenden will, beides mit Copy+Paste ins nächste Projekt bringen. Gut: bei den Modulen is das kein Problem, die sind ja in jedem APF Pack mitgeliefert, aber bei selbst entwickelten Modulen, die man später noch mal braucht, ist das doch dann ein Problem.
Dein Einwand ist schon korrekt. Sofern du eigene Module erstellst, die du in mehreren Projekten verwenden möchtest, gelten die gleichen Überlegungen. Hier ist es beispielsweise wichtig, diese so abzufassen, dass eine Nutzung von mehreren Modulen möglich ist (Kapselung, saubere API) und diese in mehreren Modulen zur Verfügung stehen. Für letzteres reicht an sich natürlich c&p, allerdings ist das für mehrere Projekte kaum praktikabel. Hier empfiehlt sich die Nutzung von SVN und ein entsprechendes Setup der Projekte (z.B. auschecken von Modulen in ein "lokales" Projekt oder Nutzung von svn:externals).
Vielleicht verstehe ich den Unterschied zwischen Codeabhängigkeiten und "größeren" Abhängigkeiten noch nicht so ganz. Wäre ganz nett, wenn du mir dazu ein Beispiel nennen könnstest.
Code-Abhängigkeiten gibt es auf mehreren Ebenen und die Ebene entscheidet letztlich (mehr oder weniger) über die Art der Nutzungsmöglichkeiten. Konkret bedeutet das: möchtest du ein Modul oder eine Komponente (letztlich das gleiche) in mehreren Projekten nutzen, solltest du versuchen keine Abhängigkeiten von Modul zum Projekt, sondern nur umgekehrt zu haben (Indirektion, inversion of control). Damit ist sichergestellt, dass du in einem Controller, einer Front-Controller-Action o.ä. Modul-Code hast, der sich auf das Vorhandensein eines Projektes bezieht und in einem anderen Projekt nicht funktionieren kann. Befolgst du das, wirst du keine Probleme haben.

Wenn es um Code- vs. Modul-Abhängigkeiten geht, so geht es natürlich nicht ohne Abhängigkeiten. Wichtig ist dabei immer, sich sehr klar über die Abhängigkeiten und deren Konsequenzen im Klaren zu sein. Ist dein Modul von einer Framework-Komponente abhängig (nach "unten"), ist das eine gute Abhängigkeit, ist es von einem Projekt abhängig (nach "oben"), ist das schlecht. Insofern kannst du dir Abhängigkeiten als Baum oder Schichten-Modell vorstellen, und jeweils an Hand des Einsatzgebietes deines Codes genau entscheiden, ob du Abhängigkeiten hast und wenn ja, wohin. In letzter Konsequenz ist es jeweils sehr individuell, wo du die Grenze deines Moduls Code-technisch ziehst und welche Deklaration von Abhängigkeit sich daraus ergibt.

Ein einfaches Beispiel wäre:
  • Code-Abhängigkeit: In einem Controller eines Projektes wird ein Modul genutzt und direkt im Code referenziert.
  • Modul-Abhängigkeit: in einem Projekt (z.B. in Templates, Controllern oder Actions) wird ein Modul mit seiner API genutzt.
Hoffe das hilft dir weiter! :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast