[Offtopic]
Commodore schrieb:
Nur weil etwas funktioniert, muss es noch lange nicht die empfehlenswerteste Loesung sein.
Dein Wort in Gottes Ohr. :?
In diesem Fall: Das Nutzen des "Seiteneffekts" einer Zuweisung mag unter gewissen Umständen sinnvoll (oder zumindest gebräuchlich sein) sein[1], oft ist es aber so -- meiner Meinung nach -- idiosynkratisch wie in #9 und widerspricht diversen Stil-Empfehlungen oder auch dem KISS-Prinzip.
Ich gebe mal ein Extrembeispiel:
PHP:
function filter_username($val) {
return !($val = filter_text($val)) || $val !== str_replace(array(
// non-printing ascii
chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10), chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20), chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30), chr(31), chr(127), chr(129), chr(141), chr(143), chr(144), chr(157),
// our prohibited chars
chr(160),// non-breaking space
chr(173),// soft hyphen
), '', $val) ? '' : $val;
}
Das ist einfach ein riesiges "F*ck You" in Richtung eines potentiellen Lesers.
Nicht gar so abgedreht:
PHP:
return $list[floor($tmp / 10) + 1][]=$e;
Auf den ersten Blick: Was gibt diese return-Anweisung zurück? Richtig, den Inhalt von $list. Das erfährt man aber erst am viertletzten Zeichen der Zeile. Und selbst dort gilt es noch zu überlegen, ob eigentlich eine Bedingung gemeint sein soll (==) oder tatsächlich eine Zuweisung (=).
An den Stellen, an denen mit Seiteneffekten gearbeitet wird, stehen nämlich alternativ häufig Bedingungen.[2] Da liegt der Verdacht nah, dass ein Gleichheitszeichen vergessen wurde.
PHP:
$list[floor($tmp / 10) + 1][]=$e;
return $list;
Etwas offensichtlicher, was hier zurückgegeben wird, oder? (Die obere Zeile ist immer noch etwas kompliziert, aber das ist ein anderes Thema.)
Wenn ich sowas sehe (Beispiel fiktiv)...
PHP:
function test()
{
$ret = 0;
$options = getOptions();
$fileHandel = file($filename = 'media/mitschnitte/mitschnitte.txt');
$parsedContent = irgendwas($fileHandel, $options);
foreach ($parsedContent as $line) {
$ret += $line;
}
echo $filename . ' geladen.';
return $ret;
}
...ist mein erster Verdacht, dass dort in der echo-Zeile der Wert einer Variable ausgegeben werden soll, die nicht initialisiert wurde, weil ich sie in keiner Zeile ganz links stehen sehe. Ich halte das für einen potentiellen Bug und beginne damit, ihn zu suchen.
Klar, in diesem Fall ist es vielleicht noch trivial und es mag wie gesagt sinnvolle Einsatzmöglichkeiten geben. Aber bitte postet nicht einfach kommentarlos irgendwelche alternativen Codeschnippsel, die zwar syntaktisch gültig sind, die aber schlichtweg keinen "sauberen" oder besonders geschickten Code ergeben. (Ich weiß, dass die Beurteilung letztlich auch subjektiv ist, aber ich denke, gewisse "objektivere" Grenzen gibt es da durchaus.)
Erfahrenere Programmierer kommen mit sowas natürlich klar, aber gerade sie reagieren besonders allergisch auf alles, was das Verständnis erschwert, denn das Eindenken in größere Codeabschnitte kostet ohnehin schon genug Zeit und Energie.
Die eingangs erwähnte filter_username()-Funktion disqualifiziert den Autor zum Beispiel in meinen Augen völlig. (Ich habe sie übrigens bis heute nicht genau durchgesehen.) Auch weil ich an die denken musste, habe ich das hier mal so ausführlich formuliert. ;) Ich habe das, was Commodores Zitat besagt, hier an anderen Stellen im Forum schon gedacht, wollte (und will) aber nicht immer eine Diskussion anzetteln (es sind ja in der Regel auch Kleinigkeiten, überinterpretiert das bitte nicht :)). Aber irgendwo musste ich meinen Senf mal loswerden.
Weil es so schön war:
Nur weil etwas funktioniert, muss es noch lange nicht die empfehlenswerteste Loesung sein.
1: Ich denke konkret an while-Schleifen:
PHP:
while ($row = mysql_fetch_assoc($result)) {
// ...
}
Alternative:
PHP:
$row = mysql_fetch_assoc($result);
while ($row) {
// ...
$row = mysql_fetch_assoc($result);
}
2: Um der Verwechslungsgefahr (bzw. auch der Vergessensgefahr ;)) vorzubeugen, können etliche Bedingungen "umgedreht" formuliert werden:
PHP:
if ('Hello World' == $var)
Ein vergessenes Gleichheitszeichen würde zu einem Syntax-Fehler führen.