Schönen Abend.
Ich sehe mich vor dem Problem, dass meine php-Programme langsam zu groß werden. Die Ablaufsteuerung (If-Blöcke, Schleifen und Switches) gehen unter zwischen den ganzen Anweisungen (Kopiervorgänge, Tests, Fehlermeldungen, Datenbankschreibereien, etc.). Wie trennt man das schön voneinander. Gerne würde ich das alles Modularisieren. Doch ich weiß nicht recht wie. Ich habe überlegt, eine Klasse zu missbrauchen, weiß aber nicht, ob das das adäquate Mittel ist. Normalerweise benutze ich Klassen für Exemplare irgendeiner Sache (wie User, der dann Methoden hat, wie GetUsername()) oder als Werkzeuge (wie eine Abstraktionsschicht für Sqlite-Datenbanken, die dann Methoden hat wie InsertInto()). Ich weiß einfach gerade nicht, ob man Klassen auch zur Ablaufsteuerung verwenden sollte.
Das andere Problem, neben der Frage, ob es das richtige Mittel ist, sehe ich darin, dass ich dann ziemlich frickeln muss mit Übergabewerten und Rückgabewerten. Beispiel: momentan habe ich im Script 15-20 Dateinamen und Pfade definiert auf die immer wieder zugegriffen wird, es gibt ein XML-Objekt, dass eine Art logging für den gesamten Ablauf mitschneidet, auf das ich nicht verzichten kann.
Die Frage lautet: kann/sollte man eine Klasse zur Ablaufsteuerung verwenden?
Wenn ich jetzt zum Beispiel an das XML-Objekt (logging-Objekt) denke, frage ich mich, wie ich das in jede Methode rein- und wieder rauskriege. Ok, vielleicht so:
class Process{
public $XML;
// set or get xml
public function XML($xml = null){
if(is_null($xml)) return $this->XML;
else $this->XML = $xml;
}
public function ConnectToDatabaseA($var){
//## tu et hier und im Fehlerfall:
$this->XML->log("connection failed");
}
}
$Process = new Process();
$Process->XML($_XML);
$Process->ConnectToDatabaseA("dbxy");
$Process->CheckIrgendwas("whatever");
$Process->RechneIrgendwas("dbxy");
$_XML = $Process->XML();
Aber dann: wie kriege die Programmabläufe umgesetzt? Wenn ConnectToDatabaseA() die Verbindung nicht schafft, etc. Läuft das dann über die returns der einzelnen Methoden?
$Process = new Process();
$Process->XML($_XML);
if($Process->ConnectToDatabaseA("dbxy")){
if($Process->CheckIrgendwas("whatever")){
$Process->RechneIrgendwas("dbxy");
}
}
$_XML = $Process->XML();
Bislang konnte ich durch ein break;
stets raus aus der Kette, ohne jedesmal eine neue If-Ebene einzufügen. Gibt es einen Pauschal-Abbruch für die Prozesskette bei dieser Art Umsetzung? (ohne die
und throw new exception
)
Bin ich damit komplett auf dem Holzweg? Gibt es vielleicht etwas viel einfacheres zum Umsetzen von Programmabläufen und Modularisieren von Code?
Zwei Dinge noch:
- der jetztige Code hat 1000 Zeilen und wird jetzt schwer zu warten. Bis 300 Zeilen war das alles noch ok, aber es wird ja immer komplexer.
- dies ist eine Lernfrage(!). Ich bin mir ganz sicher, dass die Antwort auf der Welt schon jemand gefunden hat. Nur für mich ist das jetzt neu (auf diesem Level).
Cheers,
Baba