Mailinglisten-Archive |
On Sunday 01 August 2004 00:22, Hinrich Donner wrote: > > On Saturday 31 July 2004 12:15, Hinrich Donner wrote: > > > > Wer goto nicht nutzen moechte, wird nicht dazu gezwungen....;-) Doch: Wenn man an einem Projekt weiterarbeiten will/soll/muss/darf in dme ein vorheriger PRogrammierer goto missbraucht hat. > > Es soll Leute geben, die das sinnvoll einsetzten können... > > Ja, weil sie wahrscheinlich andere Sprachkonstrukte nicht sinnvoll > einsetzen können. Oder weil sie goto richtig einsetzen können. Bis heute hielt ich goto auch für recht veraltet und selten gebraucht - obgleichich wusste, dass man es häufig doch gut gebrauchen kann. Inzwischen habe ich ein wenig recherchiert und in eigentlich jedem C (nicht C++) Source mit mehr als 1000 Zeilen habe ich gotos gefunden (z.B. 44x im Apache 1.3, 2003 mal im aktuellen xorg-X-Server, ... Meßmethode habe ich in nem anderen Posting heute Nahcmittag schon angegeben), so ausgefallen kann es also nicht sein, zumindest in C und C ist nicht PHP. Aber aus neugier mal folgendes Problem: Es soll eine PHP-Funktion (nicht Methode *g*) entwickelt werden, die eine Datenbank-Transaktion startet ein paar SQL-Queries absetzt, ein paar Berechnungen durchführt, dann wieder ein paar SQL-Queries absetzt usw. Wenn irgendwo ein Fehler auftritt soll so früh wie möglich abgebrochen werden und Transaktion zurück genommen werden und ein log-Eintrag geschrieben werden. Bei Erfolg gibt die Funktion true sonst false zurück. <?php function foobar() { begin_transaction(); $result = db_query('SELECT foo, bar FROM tabelle1 WHERE id=2'); if (!$result) { goto error; } $row = db_fetch_row($result); $result = db_query('UPDATE tabelle1 SET foo=1024, bar=23 WHERE id=2'); if (!$result) { goto error; } $result = db_query('UPDATE tabelle2 SET ergebnis='.($row[0]+$row[2]).' WHERE id=2'); if (!$result) { goto error; } // ..... commit_transaction(); return true; error: error_log(db_error()); transaction_rollback(); return false; } ?> Hier finde ich das goto wunderbarklar und ÜBersichtlich. Was wären die Alternativen? - am Anfang ein "try {", statt "goto error" je ein "throw new Exception('foobar');" und am Ende ein "} catch Exception $w { error_log; rollback();" - wie ich schonmal schrieb: Ein imho blöder Paradigmen-Wechsel. - Am Anfang ein "do {" statt "goto error" je ein "break;" und am Ende ein "return true; } while(0); error_log(...); rollback(); return false;" - Das ist wohl ein Missbrauch der "do { ... } while" Schleife - Eine Fehlerfunktion, die statt der "goto error" mit "return my_error_function(db_error());" aufgerufen wird - auch nicht besonders übersichtlich und wenn man im Fehlerfall mit mehreren Reosurcen Arbeiten will eine lange Parameterliste - Die Fehlerbehandlungsroutinen gleich zur Fehlerquelle und dann gleich return false - dass das dumm ist, darüber müssen wir uns ja wolh nicht unterhalten. Sonst noch Vorschläge? Habe ich zu später Stunde was übersehen? > Hinrich Donner johannes -- Johannes Schlüter http://schlueters.de php::bar | Der Treffpunkt für Einsteiger und Profis http://www.phpbar.de
php::bar PHP Wiki - Listenarchive