her biri için ...

14 Cevap php

Ben her zaman için-her yapı out "break" (PHP / JavaScript) kirli hissediyorum

Yani böyle bir şey:

/ / Javascript örneği

for (object in objectList)
{
   if (object.test == true)
   {
      //do some process on object
      break;
   }

}

Büyük objectLists için ben daha zarif bir çözüm bina güçlük gitmek istiyorum. Ancak küçük listeleri için hiçbir fark performans sorunu olduğunu ve dolayısıyla "neden olmasın?" Bu hızlı ve anlamak ve takip etmek daha da önemlisi kolay.

Ama sadece "yanlış" hissediyor. Tür goto deyimi gibi.

Nasıl bir durum bu tür ele?

14 Cevap

Ben bir ara kullanın. Bu mükemmel cromulent çözümdür.

Bu hızlı ve anlamak ve takip etmek daha da önemlisi kolay.

Mola hakkında kötü hissetmeyin. Goto anlamak ve takip etmek daha da önemlisi not kolay, hızlı ve çünkü hoş karşılanmaz.

Bkz, mola etmez bug me at all. Tüm kontrol yapıları gibi - - sadece a special-purpose form of goto kodunuzu okunabilirliği artırmak amaçlı olduğunu Programlama built Goto ile ilgili, ve için-bir mola olduğunu. Don't ever feel bad about writing readable code!

Şimdi, do doğrudan karşılaştırmalar hakkında kirli hissediyorum true, especially tip dönüştürme eşitlik operatörünü kullanırken ... Oh evet. Ne yazdım - if (object.test == true) - if (object.test) yazılmasına eşdeğerdir, ama daha düşünce gerektirir. Eğer really istiyorsanız o object.test bir boolean değer and true, ardından [{kullanmak istiyorum hem de yalnızca başarılı olmak için karşılaştırma (9)]}) ... Aksi halde, atlayın.

For small lists, there's no issue with doing this. As you mention, you may want to think about a more 'elegant' solution for large lists (especially lists with unknown sizes).

Bazen yanlış geliyor, ama hepsi doğru. Sen zamanında break sevmeyi öğreneceksiniz.

Gibi "neden? Değil" anlamak ve takip etmek hızlı ve daha da önemlisi kolay "dedi."

Kirli hissediyorum Neden, bu yanlış bir şey görmüyorum.

Ben isimli okumak daha kolay ve dolayısıyla korumak daha kolay olduğunu düşünüyorum.

Öyle olması gerekiyordu. Arası bir döngünün dışına atlamak için tasarlanmıştır. Eğer bir döngü içinde ne gerek bulduysanız neden oluyor döngü devam?

Tatili ve devam Gotos değildir. Onlar bir nedeni vardır. En kısa zamanda bir döngü yapısı ile bitince, get out of the loop.

Şimdi, ne önleyeceğini çok, çok derin (ok ucu tasarımı, anti-desen aka) yuvalama.

if (someCondition)
{
    for (thing in collection)
    {
        if (someOtherCondition)
        {
            break;
        }
    }
}

Eğer bir mola yapmak için gidiyoruz eğer, o zaman sadece hiç bir düzey derin böylece kodunuzu yapılandırırken ettik emin olun. Kullanım fonksiyonu mümkün olduğunca sığ yineleme tutmak için çağırır.

if (someCondition)
{
    loopThroughCollection(collection);
}

function loopThroughCollection(collection)
{
    for (thing in collection)
    {
        if (someOtherCondition)
        {
            doSomethingToObject(thing);
            break;
        }
    }
}

function doSomethingToObject(thing)
{
    // etc.
}

Gerçekten döngü için bir patlak ile anythign yanlış görmüyorum. Eğer bir değer elde etmek için anahtar çeşit karma tablo çeşit, sözlük yoksa gerçekten başka bir yolu yoktur.

Ben bir break deyimi kullanmak istiyorum.

Genel break deyimi ile yanlış bir şey yoktur. Bu gibi bloklar kod tabanının farklı yerlerde görünür Ancak kodunuzu bir sorun haline gelebilir. Bu durumda break ifadeleri çoğaltılamaz kod için küçük bir kod vardır.

Kolayca yeniden işlevi arama çıkarabilir:

function findFirst(objectList, test)
{
  for (var key in objectList) {
    var value = objectList[key];
    if (test(value)) return value;
  }
  return null;
}

var first = findFirst(objectList, function(object) {
  return object.test == true;
}
if (first) {
  //do some process on object
}

Her zaman bir şekilde bulunan elemanı işlemek Eğer kodunuzu daha kolaylaştırabilirsiniz:

function processFirstMatch(objectList, test, processor) {
  var first = findFirst(objectList, test);
  if (first) processor(first);
}

processFirst(
  objectList,
  function(object) {
    return object.test == true;
  },
  function(object) {
    //do some process on object
  }
}

Yani özgün kod çok daha anlamlı hale getirmek için JavaScript fonksiyonel özelliklerin gücünü kullanabilirsiniz. Bir yan etki olarak bu bir yardımcı işlev içine düzenli kod tabanının dışına break deyimi itecektir.

Belki senin kullanım durumunun yanlış anlama ediyorum, ama neden hiç ara? Ben test listesinde en çok bir eleman için doğru olmasını bekliyoruz varsayarak yaşıyorum?

Hiçbir performans sorunu var ve kod temizlemek istiyorsanız, her zaman test ve mola atlayın.

for (object in objectList)
{
  //do some process on object
}

Bu şekilde yaparsanız kodu (cinas amaçlanan) kırmak olmaz birden fazla eleman üzerinde işlem yapmak gerekir.

Bir kullanın

Object object;
int index = 0;

do
{
    object = objectList[index];
    index++;
}
while (object.test == false)

Bir for döngü kırma yapar eğer huzursuz hissediyorum.

Benim tercih sadece break kullanmaktır. Bu işlem hızlı ve genellikle karmaşık şeyler değil.

Bir for, while, ya da do while döngü kullanırsanız, devam etmek olup olmadığını belirlemek için bir değişkeni kullanabilirsiniz:

for ($i = 0, $c = true; ($i < 10) && $c; $i++) {
    // do stuff

    if ($condition) {
        $c= false;
    }
}

Bir foreach döngü kırmak için tek yol break veya return etmektir.