PHP IF büyük tablolar ile başa çıkmak

6 Cevap php

Ovada PHP if ifadeleri için herhangi bir iyi bir alternatif var mı? I switch hakkında biliyorum, ama ben gerçekten büyük if tabloları ile çalışırken bu kullanışlı geliyor biraz daha rafine bir alternatif orada olduğunu tahmin edeceksiniz.

Çok teşekkürler,

6 Cevap

Yalnızca okunabilirliği artırmak istiyorsanız, o zaman her zaman eğer deyimi içindeki ifadeler kadar bölebilirsiniz:

$exp1 = is_array($var) && isset($var['key']);
$exp2 = is_object($var) && isset($var->key);
$exp3 = substr($string, 0, 4) == 'foo';
$exp4 = ($exp1 || $exp2) && $exp3;
if ($exp4) {}

yerine

if (((is_array($var) && isset($var['key'])) || (is_object($var) && isset($var->key))) && substr($string, 0, 4) == 'foo') {}

Açıkçası, bu basitleştirilmiş örnekler, ama fikir olsun ...

Eğer tek bir ekran kat üzerinde algoritması okuyamıyor, daha fazla okunabilirlik doğru kodunuzu refactor gereken bir 99.9% şans var.

Değişim

if ($isHappening) {
  // ... millions of lines of code
} else {
  // .. another million lines of code
} 

içine

if ($isHappening) {
  happen();
} else {
  didntHappen();
}

function happen() {
  // millions of lines of code
}

function didntHappen() {
  // another million lines of code
}

Gerçekten hiçbir sihirli çekiç yoktur. Onları yönetilebilir hale getirmek için en iyi bahis onları daha okunabilir hale getirmek için kendi fonksiyonları içine yuvalanmış IFS kırmaktır.

Ayrıca, array_filter hakkında unutmayın. Bu öğeleri filtrelemek için bir for döngüsü yazmak zorunda sizi kaydedebilirsiniz.

Ayrıca, guard statements kullanarak yuvalama ortadan kaldırabilir. Siz temelde eğer ters ve bunun yerine (fonksiyonlara koşulları kırmak için başka bir neden) bir return yapmak.

Nesne Yönelim dünyasına hoşgeldiniz :)

class Case1 {
   function do() { echo "case 1"; }
}

class Case2 {
   function do() { echo "case 2"; }
}


$object = new Case1();

$object->do();

Ve sonra, bir dizi kullanarak oraya gönderiyor:

$choices = array( "case1" => new Case1(), "case2" => new Case2(), ... );

$choices[ $_GET["case"] ]->do();

Peki if if, çok başka orada değil mi. Tabii ki switch alternatif fakat geçerli olmayabilir koşullara bağlı olup.

Eğer OOP yapıyorsanız, state design pattern neye ihtiyacınız olabilir.

Aksi takdirde daha fazla bilgi vermek zorunda ...

"Büyük" ile Eğer büyük, son derece iç içe "IFS" demek ise, bu kod koku açık bir işareti olduğunu ve OOP ve tasarım desenleri bakıyor olmalıdır.