2008-11-25 7 views
21

Ich benutze NetBeans für PHP 6.5.Warum sind Zuordnungen unter Bedingungen schlecht?

In meinem Code verwende ich häufig den folgenden Befehlstyp:

if (($row = $db->get_row($sql))) { 
     return $row->folder; 
    } else { 
     return FALSE; 
    } 

Netbeans sagt mir, dass ich nicht in der IF-Anweisung mit Zuweisungen werden.

Warum?

+0

Ich hätte gedacht, dass die doppelte Klammer (die Klammer um die Zuweisung) sollte zeigen, dass die Zuordnung beabsichtigt ist. Einige Compiler unterdrücken die Warnung in diesem Fall, denke ich. – Draemon

+0

Überprüfen Sie die Antwort der Marke: http://StackOverflow.com/a/2576969/560287 –

+0

Schalten Sie diese Warnung aus, ersetzen Sie sie durch testgesteuerte Entwicklung. ;) Der Unterschied im Verhalten zwischen '=' und '==' ist so groß, dass deine Tests fehlschlagen sollten. (Anders als '==' vs '===' - Ich möchte meine IDE davor warnen, vorzugsweise) –

Antwort

38

Sie sind nicht schlecht, aber sie können zu gefährlichen Fehlern führen.

In c wie Sprachen, in denen eine Zuordnung ein Ausdruck ist, (unterstützen beispielsweise a = b = c = 1;) ein häufiger Fehler ist:

if (a = 1) { .. } 

Aber Sie wollten

haben
if (a == 1) { .. } 

haben Einige Entwickler gelernt

if (1 == a) { .. } 

um einen Fehler zu erzeugen, wenn ein ‚=‘ vergessen zu geben. Aber ich denke, dass es die Lesbarkeit nicht verbessert.

jedoch moderne Compiler, eine Warnung, wenn Sie

if (a = 1) { .. } 

schreiben, die ich denke, eine bessere Lösung ist. In diesem Fall müssen Sie prüfen, ob Sie das wirklich wollten.

+1

Ich glaube, die Zuweisung in den if mit seinen eigenen Klammern sollte dem Compiler sagen, der Coder weiß, was er tut, und er sollte nicht gewarnt werden. – strager

+3

@strager Ich halte das immer noch für eine schlechte Methode, weil es Lesbarkeit nicht wirklich hilft, wenn Sie etwas in einer if-Klausel zuweisen. Sie tun zwei Dinge in einem Befehl, die zu Missverständnissen führen können und sollten vermieden werden. – Tigraine

+1

@strager Ich habe diesen exakten Tippfehler schon mehrmals gemacht und der Compiler hat mich dabei abgefangen was gespeichert hätte sparen können Stunden Debugging je nachdem wann sich die Nebeneffekte manifestiert hätten (dh ob ein Kompilierfehler vs. dem Benutzer falsche Daten anzeigt irgendwo auf der Linie) – Davy8

4

Es ist wahrscheinlich versuchen Sie die gefürchteten Tippfehler vermeiden helfen:

if(a = b) 
    //logic error 

Obwohl ich eine Umgebung intelligent genug, erwarten Sie, dass, zu warnen, auch klug genug zu sein, „oh haben, Mach dir keine Sorgen über diesen Fall "Bedingungen.

-1

Ich benutze sie die ganze Zeit, mit Schlaufen (nicht sicher, warum das einen Unterschied machen würde), wie:

$counter = 0; 
while($getWhateverDataObj = mysql_fetch_object($sqlResult)) { 
    $getWhateverObj->firstName[$counter] = $getWhateverDataObj->firstName; 
    $getWhateverObj->lastName[$counter] = $getWhateverDataObj->lastName; 
    $counter++; 
} 

Und es funktioniert gut.

1

In Sprachen, die durchweg Wert auf Zuweisungen zurückkehren, es ist nicht schlecht (ich glaube, es in funktionalen Sprachen durchaus üblich ist), aber (wie andere allready gesagt haben, während ich dies getippt) ist es in der Regel, da Sie oder jemand soll vermieden werden sonst könnte es für einen Vergleich verwechseln. Der Compiler sollte normalerweise darüber warnen, aber er kann ignoriert werden, wenn Sie sicher sind, was Sie tun ...

4

Bedingungsfaktoren enthalten oft Kurzschlussoperatoren. Also, dieses Beispiel gegeben:

if (a=func(x) && b=func(y)) 
{ 
    // do this 
} 

Es kann nicht ohne weiteres ersichtlich sein, aber die zweite Zuordnung erfolgt nur dann, wenn die ersten >0 zurückgekehrt, und wenn func(y) andere Nebenwirkungen haben, dass Sie erwartet haben, würden sie auch nicht passieren .

Kurz gesagt, wenn Sie wissen, was Sie tun und die Nebenwirkungen verstehen, dann ist nichts falsch daran. Sie müssen jedoch die Möglichkeit in Erwägung ziehen, dass jemand anders Ihren Code beibehält, wenn Sie nicht mehr in der Lage sind. Möglicherweise sind Sie nicht so erfahren wie Sie.

if (a==func(x) && b==func(y)) ... 

Wenn sie „reparieren“ Ihr Code, brechen sie es tatsächlich: die folgenden soll

Auch Sie zukünftige Maintainer vielleicht denken.

+0

Ich würde argumentieren, dass dies für jeden Programmierer, der sein Geld wert ist, sofort offensichtlich sein sollte. Vielleicht bin ich zu hart. – Kip

+0

Ja, aber beim Debuggen können Dinge wie "Blend In" nicht sofort herausspringen, daher die Argumente für das Ausbrechen der Zuweisungsoperationen. –

+0

@Kip ja ich stimme dir zu 100% zu. Das Problem ist nicht alle Programmierer sind ihr Geld wert. wir sind es unseren Kunden schuldig, wartbare Software zu erstellen. Es ist unmöglich, Software zu entwickeln, die durch den kleinsten gemeinsamen Nenner des Entwicklers gewartet werden kann, aber wir können zumindest einige Zugeständnisse machen. – rev

1

Wie würde ein Code aussehen, wenn Sie den $ -Zeilenwert im Loop-Zustand nicht zuweisen das wäre viel komplizierter ich denke ... obwohl nicht so gut für einige Betreuer zu lesen, nicht? gut Sie können es tun, wie

$next = mysql_fetch_assoc($result) 
do{ 
... 
... 
... 

$next = mysql_fetch_assoc($result) or break; 
}while ($next) 
+0

Das ist sicher besser lesbar: [Sorry, keine Zeilenumbrüche in Kommentaren AFAIK]. 'while (wahr) {$ next = mysql_fetch_assoc ($ result); if (! $ next) {Pause; }/* Körper hier * /} ' – IMSoP

Verwandte Themen