neden kötü koşullarda atamaları?

6 Cevap php

PHP 6.5 için NetBeans kullanıyorum.

Benim kodda sık sık komuta aşağıdaki türünü kullanın:

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

Netbeans Ben IF deyimi içinde atamaları kullanarak gerektiğini söylüyor.

Neden?

6 Cevap

Bunlar kötü değil, ama onlar tehlikeli hatalara yol açabilir.

Bir atama olduğunu ifade dilde, (örneğin, destek gibi c a = b = c = 1 ;) yaygın bir hatadır:

if (a = 1) { .. }

Ama sahip olmak istedim

if (a == 1) { .. }

Bazı geliştiriciler yazın öğrendim

if (1 == a) { .. }

Bir '=' unutulmuş eğer bir hata oluşturmak için. Ama okunabilirliği artırmak olmadığını düşünüyorum.

Eğer yazmak Ancak modern derleyiciler, bir uyarı verecektir

if (a = 1) { .. }

hangi daha iyi bir çözüm olduğunu düşünüyorum. Bu durumda size gerçekten ne demek olduğunu kontrol etmek zorunda kalıyor.

Şart Genellikle kısa devre operatörleri dahil. Yani, bu örnek verilmiştir:

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

Hemen belli olmayabilir, ama ilk >0 döndü, ikinci atama sadece oluşacak, ve func(y) Ne bekliyordun ki başka yan etkileri olsaydı, onlar da olmazdı.

Eğer ne yaptığınızı biliyor ve yan etkilerini anlamak Kısacası, o zaman yanlış bir şey yoktur. Ancak, sen gidince ve onlar sizin gibi deneyimli olmayabilir gibi başkasının kodu muhafaza edilmesi ihtimalini göz önünde bulundurmalıdır.

Ayrıca, gelecek sürdürücüler aşağıdaki amaçlanan düşünebilir:

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

Onlar kodunu "düzeltmek", onlar aslında bunu kırmak.

Muhtemelen size korkunç yazım yanlışı önlemek için çalışıyor:

if(a = b)
   //logic error

Yeterince bir çevre akıllı da olması kadar akıllı olması, bu konuda sizi uyarmak için beklediğiniz rağmen şartlar "oh, bu durumda dert etme".

Daima o bad genellikle sizin ya birisi beri kaçınılmalıdır (Ben bu yazdığınız diğerleri Allready söylediğim gibi) (Ben fonksiyonel dillerde oldukça yaygın olduğunu düşünüyorum), ama değil atamaları üzerinde bir değer döndürür dilde Başka bir karşılaştırma için hata olabilir. Derleyici genellikle bu konuda uyarmak gerekir, ama ne yaptığınızı emin iseniz bu göz ardı edilebilir ...

Tamamen alakasız bir not. (Burada birçok Durumluk gibi bir if şeyler atama okunabilirliği sorunlara neden düşünüyorum).

For the given snipped above there is the ? operator in C languages that do exactly this. I guess it's there in PHP too.

http://davidhayden.com/blog/dave/archive/2006/07/05/NullCoalescingOperator.aspx

Ben gibi, (neden bir fark yaratacağını emin değilim) döngüler ile, onları her zaman kullanabilirsiniz:

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

Ve gayet iyi çalışıyor.