Andreas Korthaus: Web-Programme modular aufbauen

Beitrag lesen

Hallo Sven!

Ich weiß nicht, was du programmieren willst. Insofern ist es schwierig, da irgendwas konkret zu sagen. Aber eines stimmt: Die einzelnen Module selbst haben mit anderen Modulen nicht zu kommunizieren, sondern nur mit dem Basismodul. Bzw. genauer gesagt: Mit ihrem Elternmodul. Denn es ist ja durchaus denkbar, dass du ein Ausgabemodul geschrieben hast, welches allgemein gehalten ist. Dieses Ausgabemodul kriegt jetzt Untermodule, die die Ausgabe als HTML, XHTML, LaTeX, PDF, GIF, ASCII etc. auf Bildschirm, Festplatte, Papier usw. erledigen können. Das Basismodul sorgt dafür, dass das Ausgabemodul die auszugebenden Daten kriegt. Das Ausgabemodul verwaltet die vorhandenen Submodule und reicht die Daten an das passende Modul weiter.

Leider kann ich mir auch überhaupt nicht vorstellen, wei eien Modul eine Ausgabe erledigen soll! So soll z.B eine Tabelle mit Lieferanten angezeit werden. Was genau für so een HTML-Ausgabemodul jetzt machen und welche Daten müßte man dem übergeben? Die Datenquelle ist eine Datenbank. Die erste Frage, wie wird die Ausgabe überhaupt ausgelöst? Ich sage mal ich habe eine Startseite, mit einem Link auf "Lieferantenübersicht". Wenn man auf den Link klickt soll sich eien neue Seite im selben Layout öffnen, mit der Überschrift "Lieferantenübersicht" und einer HTML-Tabelle mit allen Lieferanten alphabetisch sortiert und mit je einem Link versehen um Details zu erfahren.
Wieder von vorne angefangen: Was löst der 1. Link aus? Bei mir jetzt öffnet er eine neue Datei, "lieferanten_uebersicht.php" und in dieser Datei steht halt fest drin, das er die Daten wie oben beschreiben ausgeben soll. Wie würde das jetzt theoretisch mit Modulen aussehen?
3 Module würden mir hier einfallen:

1. DB-Modul
2. HTML-Ausgabe-Modul
3: Lieferantenübersichts-Modul.

die wenigsten Probleme habe ich mit DB-Modul, das habe ich eine schöne Klasse und kann von überall hierüber auf die Datenbank zugreifen, welche auch immer dahinter steht. Schwieriger wird es mit der Ausgabe-Modul, wie soll das funktionieren? Und wie greife ich auf das Modul zu? Also mache ich den ersten Link wieder auf eine extra Seite lieferanten_ueberesicht.php, nur das ich hier nicht HTML hinschreibe und direkt auf mysql zugreife, sondern die entsprechnenden Daten über das DB-Modul aus der DB hole, und mit dem Ausgabe-Modul die Ausgabe erzeuge, nur wie? Sagen wir mal das Ausgabe-Modul ist eine Klasse, was sollte die dann können?  Also eine Methode "write_header", "write_footer", "write_navigation", und dann "write_headline('Lieferantenübersicht')", und wie gebe ich die Tabelle und anderen Text aus? Soll ich alle Daten die ich in der Tabelel ausgeben will aus der DB-Klasse als Array ausgeben, und diesen Array dann an die Ausgabe-Klasse übergeben, nur was nehme ich dann für Überschriften? Die originalen Datenbank-Spaltennamen sind nicht immer so der Hit, und bestimmte Zahlen wie Preise würde ich auch gerne vorher noch formatieren! Wie sollte man das machen? Vor allem, wenn ich den Inhalt der Seite vielleicht etwas strukturiert z.B. in einer verschachtelten Tabele augeben möcte, wie bilde ich das mit so einer Ausgabe-Klasse ab?
Und das 3. Modul, das "Lieferantenübersichts-Modul" _selbst_ eine Klasse sein soll, wie ich das mit CK überlegt habe, dann ist mein Verständnis diesbezüglich wieder fast = 0. Das hat zwar seinen Sinn, so dass z.B. ein Menü-Eintrag erfolgt, oder ich global im Projekt eine Lieferanten-Liste über eine Methode bereitstellen kann, aber wie soll dann die Ausgabe funktionieren? Wohon führt der 1. Link von der Startseite? Wenn lieferanten_uebersicht.php jetzt nur noch eine Klasse enthält, an welcher Stelle steht dann das was beim Klick auf dem Link passieren soll, also die Ausgabe der Lieferantentabelle, wo wird die initiiert?
Sorry das ich mich vermutlich selten dämlich anstelle, ich komme mir selbst zielmich bescheuert vor, aber ich _VERSTEHE_ es zum verrecken nicht.

Und das würde sich dann sogar ganz gut machen, denn wenn du sowohl ein MySQL-Modul als auch ein XML-Modul geschrieben hast, kannst du deine MySQL-Datenbank mit einem Export-Modul einfach aus MySQL auslesen und in XML reinschreiben und hast so eine nette Export-Funktion. Auf einem anderen Server hast du vielleicht kein MySQL, sondern PostgreSQL, aber natürlich auch XML, und kannst so den Datenimport regeln. :)

Interessante Variante, werde ich auf alle Fälle versuchen!

Das schreibt und liest sich jetzt natürlich recht leicht - die zentrale Frage dabei ist immer: Wo docken die Module an?

Ah, ja, die Frage stellt sich mir erst recht ;-)

Im obigen Beispiel wäre es z.B. sinnvoll, wenn das MySQL- und das XML-Modul an einem DB-I/O-Modul andocken. Dort könnten dann auch die Funktionsmodule "Export" und "Import" andocken.

Das mit der Datenbank habe ich inzwiwchen so mehr oder weniger verstanden, da bekomme ich das schon hin. Probleme bereitet mir vor allem die Ausgabe, und auch das Basismodul weiß ich nicht so Recht was das soll. Und auch die Module für Zusatzfunktionen wie den "Fragebogengenerator" weiß ich nict so recht. Was ich weiß ist inzwischen das ich hierfür eine Extra-Klasse verwende, die z.B. Methoden enthält um die komplette Menü-Struktur zu ermitteln, oder die Rechte festzulesgen. Aber mir fehlt noch eine Idee dafür, wie ich die eigentliche Funktionalität einbinde, also wie ich es machen soll, dass halt beim Klicken auf einen entsprechenden Menü-Eintrag auch eine HTML-Seite ausgegeben wird, das Aktionen ausgeführt werden können, das geht IMHO nicht mit der einen einzigen Klasse, oder? Oder wenn ich Aktionen ausführe, dann  muß ich ja auf GET/POST Parameter reagieren, wo mache ich das dann genau?

Nein, warum? Auch dynamische Seiten können damit arbeiten. Notfalls greift ein globales URL-Mapping mit mod_rewrite, welches den Sprachbestandteil der URL als Parameter ummodelt.

Eigentlich ziemlich schlau, dann bräuchte ich eigentlich doch keine Session!

Es gibt deswegen nur zwei praktikable Methoden, die Information der gewünschten Sprache sicher zu übermitteln: Entweder als Teil der URL (im Pfad oder als Parameter), oder in Sessions bzw. Cookies (was prinzipiell das Gleiche ist - und schlecht obendrein).

Was ist schlecht an Sessions? Bisher bräuchte ich sie nicht, hätte aber den Vorteil, das ich ganze Objekte in der Session speichern kann, so könnte ich z.B. Basisdaten wie root_path, menu_array... die ich alle immer wieder neu aus verschiedenen Dateien generieren müßte, bei jedem Seitenaufruf, könnte die dann in einem Objekt in der Session speichern und müßte das ganze nur einmal ermitteln. Wobei, ob der Server jetzt eine Session-Datei öffnet oder ich eine andere ist ja auch fast egal, oder?

Ich muß ehrlich sagen: Dein Projekt ist nach meinem Eindruck noch weit davon entfernt, auch nur in irgendeiner Weise modular zu sein.

Ja das ist es auch, aber vor allem durch meine Verständnisschwierigkeiten. Ich danke Euch wirklich sehr für Eure Beiträge und Ihr habt mir auch sehr geholfen, aber Ihr werdet gerne immer ziemlich abstrakt, und da fällt es mir dann manchmal durchaus schwer das ganze noch nachzuvollziehen, das gilt vor allem für CK(nicht böse gemeint ;-)). Leider bin ich kein Informatiker wodurch mir vermutlich einige Grundlagen fehlen, ich habe vor gut einem Jahr mit PHP angefangen, davor konnte ich nur Frontpage, nichtmal Basic oder VBA-Makros! Daher kann ich Euch auch verstehen wenn Ihr glaubt ich sei ein bisschen dämlich ;-)

Da du es allerdings auch nicht näher erläutert hast, könnte dieser Eindruck daran liegen, dass das Projekt sich nicht unbedingt für den modularen Aufbau eignet.

Das kommt drauf an was man unter modularem Aufbau versteht. Es soll keine Gorupware werden, die 100% modular aufgebaut sein muß, sondern es soll nur die Möglichkeit bestehen, 1-3 Erweiterungen einfach nachzuinstallieren oder zu entfernen. Es geht um eine Software im Bereich e-procurement, kein tolles e-comerce tool, sondern eine schlanke, auf speziellen Vorgaben programmierte Lösung. Es soll eine Basisversion geben, die nur eine Lieferantenverwaltung und ein ganz einfaches Ausschreibungs-tool enthält, dann soll das ganze aber auch erweitert werden können, zum einen um ein Tool für komplexere Ausschreibungen, und/oder eine Lieferantenqualifizierung, wofür man einen eigenen Fragebogen generieren kann, den Lieferanten ausfüllen sollen. Das wars eigentlich. Mein Problem war es jetzt, das Basisprogramm schon so zu programieren, dass ich die Erweiterungen mölichst einfach einfügen kann. Ob man das jetzt "module" nennt, oder "plugins" oder nur "Erweiterungen", das weiß ich nicht. Jedenfalls brauche ich keine so abstrakten Plugins, im Prinzip reicht mir ein variables Menü, die restlichen Zugriffe kann ich auch so einprogrammieren, und ja dann habe ich Redundanzen, und ja, dann muß ich die 2 Module ggfs. ändern wenn ich an der Basis oder Datenstruktur was ändert, na und? Das ist erheblich weniger Aufwand als die komplette Software-Struktur so radikal zu verändern. Die Diskussion ist eigentlich weit über das was ich für dieses Projekt wissen wollte hinaus gegangen, aber auch gerade weil es mich trotzdem sehr interessiert. Ob ich das jetzt hier verwende oder nicht weiß ich nicht, aber ich würde es sehr gerne langsam mal verstehen, so dass ich es wenigesten in Zukunft mal einsetzen kann ;-)

Viele Grüße
Andreas

PS: Mozilla ist _G_E_N_I_A_L_ !!! Ich wollte gerade meinen PC aus dem Fenster werfen, nachdem ich diesen Beitrag eben in die die Zwischenablage kopieren wollte, binn nach dem markieren aber irgendwie auf [return] gekommen - alles war weg. Nachdem ich mich wieder beruhugt hatte, aber ich aus Frust einfach mal in das Menü "bearbeiten" geguckt -> da stand doch tatsächlich "rückgängig", und siehe da, der Beitrag war noch da! PERFEKT!