Anahtardaki varsayılan durumu kır


88

breakSık sık, son davadan sonra ne zaman ekleyip eklemeyeceğime biraz şaşırdım default.

switch (type) {
    case 'product':

        // Do behavior

        break;
    default:

        // Do default behavior

        break; // Is it considered to be needed?
}

breakTek amacım, kodun switchkasanın geri kalanından geçmesini engellemem.

Bu breakdurumda, tutarlılık nedeniyle bir sonun olması veya breakherhangi bir işlevsel kullanımın uygulanmaması nedeniyle atlamanın daha mantıklı olduğu düşünülüyor mu? Her ikisi de bence farklı şekillerde mantıklı.

Bu bir dereceye kadar bir .phpdosyayı sonlandırmakla karşılaştırılabilir ?>. ?>Çoğunlukla boşluk bırakma riski nedeniyle asla sona ermem, ancak biri dosyayı sonlandırmanın mantıklı bir şey olduğunu iddia edebilir.

Yanıtlar:


144

breakson alternatifin ardından teknik olarak ihtiyaç duyulmuyor (aklınıza gelmek zorunda değilsiniz default: defaultbranşı ilk sıraya koymak tamamen yasal ve hatta bazen faydalı olabilir ); Kodunuz switchifadenin sonuna mı yoksa breaksson şubenin sonuna mı düşerse aynı sonucu verir.

Ancak, sonuncusu da dahil olmak üzere her şubeyi üç nedenden dolayı bir returnveya daha fazla breakifadeyle sonlandırmaya devam ediyorum :

  1. Refactorability. Tüm dallarınız breakveya ile returnbitiyorsa, anlamını değiştirmeden onları yeniden sıralayabilirsiniz. Bu, böyle bir yeniden düzenlemenin bir regresyon ortaya koyma olasılığını azaltıyor.
  2. Tutarlılık ve En Az Sürpriz. Tutarlılık, anlam bakımından farklı olmadıkça, dallarınızın tutarlı bir şekilde sona ermesi gerektiğini söylüyor. En Az Sürpriz Prensibi, benzer şeylerin benzer görünmesi gerektiğini belirtir. Bir switchbloğun son dalı sonuncusu gibi sonlandırmak her ikisini de yerine getirir, bu da kolay okuma ve anlama sağlar. Açık bırakmazsanız break, son dal optik olarak farklı olacaktır (bu özellikle hızlı tarama için önemlidir) ve gerçekten farklı olmadığını görmek için, okuyucunun bireysel ifadeleri okumaya ilişkin nitrit-kumluk seviyesine inmesi gerekir. .
  3. Kendini korumak Tüm switchdallarınızı a ile sonlandırma alışkanlığı yaparsanız break, bir süre sonra otomatik hale gelir ve önemli olduğu yerde yanlışlıkla unutabilirsiniz. breakHer dalın sonunda beklemek için kendinizi eğitmek aynı zamanda breakhata ayıklama ve sorun giderme için harika olan eksik ifadeleri tespit etmeye yardımcı olur .

Bu konudaki görüşünüz için teşekkür ederiz! breakDava devam edecek :)
Robin Castlin 17:13

7
C #, In break(veya çıkar diğer kontrol akış tablosu case) olduğu teknik olarak son alternatif sonra gerekli.
dan04

3
@ dan04: evet, iyi nokta. C # burada bir istisnadır ve muhtemelen dil tasarımcılarının switchmevcut dillerdeki sorunların farkında olduğunu ve bunları önlemek istediğindendir. C # kuralları, benim cevabımdaki tavsiyelere uyuyor.
tdammers

Özellikle hangi dilden bahsediyorsun? C? C ++? C #? Java? PHP?
svick

2
İyi bir derleyici breakbir jmpsonraki talimata a üretmek yerine finali NO-OP olarak değerlendirirdi , doğru mu?
Nathan Osman

11

switch-caseÇoğu dilde kullanımı ile ilgili belirsizlikler göz önüne alındığında, onu kullanırken break, açıkça belirtilmediği ve istenmediği tasarım haricinde, her zaman bir ifade kullanmanızı öneririm .

Kısmen bunun nedeni her casegörüşmenin aynı görünmesini sağlamasıdır, bence okunabilirliği artıracaktır. Ancak, eğer biri (siz bile) caseson bir sonraki aşamada sonuncuyu yerleştirmeyi seçerse, yeni kod eklerken hataları azaltmaya yardımcı olabilecek önceki bloğu kontrol etmekle ilgilenmeleri gerekmediği anlamına gelir.


7
Bir vakanın diğerine geçmesini istediğimde (ve dejenere durum değil case foo: case bar: ...) Ben düşmenin gerçekleşmesini istediğime dair açık bir yorum yaptım. Çok daha net hale getirir.
Donal Fellows

3
Evet // no breakyerine basit bir yorum gibibreak;
Pacerier 8:13

Veya [[fallthrough]]C ++ durumunda bir öznitelik.
Ruslan

1

Hiçbir yoktur breaksonrasında gerekli son durumda. " Last " kelimesini kullanıyorum ( varsayılan değil ), çünkü zorunlu değil, son durumda.

switch(x)
{
case 1:
//do stuff
break;

default:
//do default work
break;

case 3:
//do stuff

}

Ve biliyoruz ki, break ardışık iki cases arasında bir a gereklidir . Bazen, if(a!=0)kodumu başkaları kodumu okuduğunda okunabilirlik için kodumda kullanırım. Kullanmayı seçebilirim if(a), bu benim seçimim meselesi olur


5
Benim için bu, "her zaman kullanım sonu" anlamına gelecektir, sadece bazı programcıların case, var olup switcholmadığını kontrol etmeden yenisini eklemiş olması durumunda break(bu programcının hatası olabilir, ancak yine de daha iyi olması gerekir) çünkü 6 ay içinde o programcı olabilirsin-)
SJuan76

@ SJuan76 Evet, katılıyorum, üzgünümden daha güvenli, gelecekteki hatalar için korumayı korumak istiyorsanız, bir tanesini eklemelisiniz.
Suvarna Pattayil

1
Bu argüman dikkate alındığında, , yeni bir değer girilmesi durumunda dizilerin sonunda her zaman bulunabileceğini iddia edebilirsiniz . Ancak bu bazı kodları kırar ve genellikle çirkin görünür :)
Robin Castlin

1
@Robin Virgülle koymak farklıdır. Orada değilse ve birisi diziye yeni bir değer eklerse derleme hatası alırlar. Ancak, önceki durum ifadesinde bir ara eksikse derleme hatası olmaz - bu nedenle bunun kaçırılması ve çalışma zamanı hatalarına neden olması olasıdır.
Keith Miller

@RobinCastlin Bir dil koymak için sağlanan dil sağladı ,. İnasa, defaultson durum olarak tasarlandı. Belki dil bundan breaksonra bir hata olarak değerlendirir. breakSADECE iki vaka arasında farklılaştırıcı olarak kabul edildi.
Suvarna Pattayil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.