Mantıksal Operatörler: Olduğu Ve Veya daha iyi?

9 Cevap php

Bu bir comp-bilim 101 soru ise özür dilerim. Ben belirgin bir şey eksik yaşıyorum ben sadece emin değilim.

Yani bazı kullanıcı girişi bir hata atar diyelim, ve ben onu yakalamak ve bazı geri dönmek istiyorum. . 8 0 anlamına gelir "Hata Yok" - hatası sayı, 0 olacak. Ben hata 3 ise (diyelim ki, izin Hayır numaraları) kullanıcıya çok özel geribildirim vermek istiyorum. Diğer 7 olasılıklar için, ben sadece senaryoyu bitirmek istiyorum ve hata yankı.

Ben bu çalışma dışarı ve bu ile gitmek için karar verildi:

$no_errors ($_error != 0 || $_error != 3) ? FALSE : TRUE;
if (!$no_errors)
echo $error_msg['$_error'];
$error_3 ($no_errors && $_error == 3) ? TRUE : FALSE;
if ($error_3)
   bunch of stuff happens;
else
   bunch of other stuff;

Her neyse, ben o zaman ilk satırda OR operatörü fark edildi ve kullanıcı bir VE operatöre güvenli / daha iyi olabileceğini düşünüyordum. Ama daha ben düşünmek, az bir fark görüyorum.

Belirli bir değişkenin iki olanaklarını ortadan kaldırmak istiyorsanız, bu yüzden asıl soru, AND ve OR aynı veya daha optimal bir mantıksal / işlevsel olduğunu?

9 Cevap

mantıklı aşağıdaki aynıdır (benim sözde kod bahane)

(! expression_one || ! expression_two) /** this is the same as the one below **/
! (expression_one && expression_two)

Fonksiyonel hangisi daha uygun? Her ikisi de birbirini olarak optimal. Her iki yolu (&& ve | |) ilk ifadesi doğruysa, kısa devre izin (de | | durum) ya da false (&& durumda)

Eğer bir switch deyimini kullanırsanız çok daha okunabilir olacaktır:

switch ($_error) {
    case 0;
        nothing happens;
        break;
    case 3:
        bunch of stuff happens;
        break;
    default:
        bunch of other stuff;
        break;
}

Her şeyden önce, ben "sihirli sayı" kullanarak daha hataları belirleme başka bir yolu kullanarak öneriyoruz düşünüyorum. Kolayca "3" ne demek unutmak gibi Onlar, korumak zordur. Dil istisnalar desteği vardır PHP gibi görünüyor. Ben yerine onları kullanmanızı tavsiye ederim, onlar hakkında daha fazla buradan okuyabilirsiniz: http://dk.php.net/exceptions

Mantıksal operatörler gelince, gerçekten "iyi uygulama" olarak kabul edilir herhangi yok. Ne istediğinizi kullanın. Eğer sorun ifadesi doğru / yanlış olduğu zaman sergiyi varsa, doğruluk tablosu yapmayı deneyin: http://en.wikipedia.org/wiki/Truth_table

Performans açısından, değerlendirme çoğu dilde tembel olacağını unutmayın. Ilk koşul doğruysa OR kullanarak, bu ikinci koşulu değerlendirerek olmadan doğru dönecektir. İlk koşullar yanlış ise AND için, ikinci değerlendirerek olmadan, yanlış dönecektir.

Aksi takdirde, operatörlerin kendilerini performansı gerçekten farklı değildir. Sizin için en okunabilir ne kullanın.

En iyi you kod hızlı okuma yardımcı biridir. Bu, başka yerlerde milyonlarca muhtemelen burada yapabilir ve tek gerçek optimizasyonu olduğunu.

Bu okumak için daha basit olmazdı:

  if($_error==3)
      do stuff;
    else if($_error>0)
      do some other stuff
    else
      do normal stuff

Kimse kazansın mikrosaniye fark eder.

Performans açısından onlar (wvanbergen tarafından yazı bakın) çok benzer olduğuna inanıyorum, ancak davranışlarında belirgin farklılıklar vardır. Ben mevcut gönderme için umut ne yapıyor olabilir diye düşünüyorum. İlk satırda, o zaman $ no_errors = false $ = 3 _error var eğer. Hem memnun olması gereken iki koşul kontrol gibi belki bir ve daha uygun olurdu.

Bazen benim mantık kontrol etmek kolay yolu aslında ben yüksek sesle istediğini söylemek için bulmak. Örneğin, "Biz hata kodu not 0 and not 3 ise hata yok"

Ben genellikle sadece birkaç değişken, ben mantıksal operatörleri belirlenmesi için en sezgisel (ve doğru) yöntemi ile bana sağlar İngilizce cümle yazmak yolu ile bu gibi durumda olduğunu bulmak.

Eğer kod bu süreçten sonra dağınık görünüyor bulursanız o zaman yararlı De Morgan yasalara this bağlantı bulabilirsiniz

! (A | | B) = (A && B). Yani gerçekten bir fark yapmaz

EDIT: (A | | B) = (A && B) yanlıştır. Yorumlarınız için tks. (! |! | B A)! = (A && B) doğru şeklidir.

Özürlerimi

Eğer kullanıyorsanız:

$no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;

This means if $error != 0 AND $error != 3 which is invalid logic because $error cannot be == to 3 and 0 it can be 3 OR 0 but not both.
In the above example if $error = 0 then it would evaluate to FALSE because it is not 3 && 0 you are looking for it to be either 3 || 0.