Bir düşme (klasik) anahtar deyimi ne zaman kullanılmalı? Bu tür bir kullanım tavsiye edilir ve teşvik edilir mi, ne pahasına olursa olsun kaçınılmalıdır mı?
Bir düşme (klasik) anahtar deyimi ne zaman kullanılmalı? Bu tür bir kullanım tavsiye edilir ve teşvik edilir mi, ne pahasına olursa olsun kaçınılmalıdır mı?
Yanıtlar:
İşte yararlı olacağı bir örnek.
public Collection<LogItems> GetAllLogItems(Level level) {
Collection<LogItems> result = new Collection<LogItems>();
switch (level) {
// Note: fall through here is INTENTIONAL
case All:
case Info:
result.Add(GetItemsForLevel(Info));
case Warning:
result.Add(GetItemsForLevel(Warning));
case Error:
result.Add(GetItemsForLevel(Error));
case Critical:
result.Add(GetItemsForLevel(Critical));
case None:
}
return result;
}
Bu tür bir şey (bir vaka diğerini içerir) oldukça nadir, bence, bu yüzden bazı yeni diller ya fallover'a izin vermiyor ya da bunun için özel sözdizimi gerektirmiyor.
// INTENTIONAL FALL THROUGH HERE
yorumundan yoksundur .
GetItemsForLevel(Info)
çağrıyı çağırarak GetItemsForLevel(Warning)
vb.
Bazı işlevlerin birden fazla değer için uygulanması gerektiğinde bunları kullanıyorum. Örneğin, operasyonKodu adlı bir özelliğe sahip bir nesneniz olduğunu varsayalım. Kod 1, 2, 3 veya 4'e eşitse, startOperationX () işlevini başlatmak istersiniz. 5 veya 6 ise, StartOperationY () 'yi ve 7' yi StartOperationZ () 'ı istiyorsunuz. Düşüşleri kullanabilmeniz için neden 7 tam işlevsellik ve kırılma vakası var?
Özellikle 100 if-else ifadesinden kaçınırsa, bazı durumlarda tamamen geçerli olduğunu düşünüyorum. =)
switch
birden fazla case
s olan bir. Bu, aralarında case
bir eksiklik nedeniyle birinin yürütülmesinin bir sonrakine devam ettiği bir düşüşten farklıdır break
.
Düşen kılıflar gayet iyi. Çoğu zaman bir numaralandırmanın birçok yerde kullanıldığını ve bazı durumları ayırt etmeniz gerekmediğinde düşme mantığını kullanmanın daha kolay olduğunu görüyorum.
Örneğin (açıklayıcı yorumlara dikkat edin):
public boolean isAvailable(Server server, HealthStatus health) {
switch(health) {
// Equivalent positive cases
case HEALTHY:
case UNDER_LOAD:
return true;
// Equivalent negative cases
case FAULT_REPORTED:
case UNKNOWN:
case CANNOT_COMMUNICATE:
return false;
// Unknown enumeration!
default:
LOG.warn("Unknown enumeration " + health);
return false;
}
}
Bu tür kullanımları mükemmel kabul edilebilir buluyorum.
case X: case Y: doSomething()
Ve arasında büyük bir fark olduğunu unutmayın case X: doSomething(); case Y: doAnotherThing()
. Birincisinde, niyet oldukça açıkken, ikincisinde düşme kasıtlı olabilir veya olmayabilir. Deneyimlerime göre, ilk örnek derleyiciler / kod analizörlerinde hiçbir zaman ikinciyi tetiklemez. Şahsen, sadece ikinci örneği "düşmek" olarak adlandırırdım - yine de "resmi" bir tanımdan emin değilim.
Göre değişir:
Bir davanın diğerine düşmesine neden olan iki ana sorun şunlardır:
Kodunuzu vaka ifadelerinin sırasına bağlı hale getirir. Hiç düşmezseniz durum böyle değildir ve genellikle hoş karşılanmayan bir karmaşıklık derecesi ekler.
Bir vakanın kodunun, sonraki bir veya daha fazla vakanın kodunu içerdiği açık değildir.
Bazı yerler açıkça düşmeyi yasaklar. Böyle bir yerde çalışmazsanız ve uygulamadan memnunsanız ve söz konusu kodu kırmak herhangi bir gerçek acıya neden olmazsa, o zaman dünyadaki en kötü şey olmayabilir. Bunu yaparsanız, daha sonra gelenleri uyarmak için yakınlarda dikkat çekici bir yorum koyduğunuzdan emin olun (gelecek dahil).
İşte hayatımı kolaylaştırmak için hızlı (kuşkusuz eksik (artık yıl özel işlem yok)) düşme örneği:
function get_julian_day (date) {
int utc_date = date.getUTCDate();
int utc_month = date.getUTCMonth();
int julian_day = 0;
switch (utc_month) {
case 11: julian_day += 30;
case 10: julian_day += 31;
case 9: julian_day += 30;
case 8: julian_day += 31;
case 7: julian_day += 31;
case 6: julian_day += 30;
case 5: julian_day += 31;
case 4: julian_day += 30;
case 3: julian_day += 31;
case 2: julian_day += 28;
case 1: julian_day += 31;
default: break;
}
return julian_day + utc_date;
}
Bir vakadan diğerine gitme ihtiyacı hissedersem (nadiren, kuşkusuz), çok açık olmayı tercih ederim ve goto case
elbette, dilinizin bunu desteklediğini varsayar.
Kodlama sırasında düşmek çok nadir ve göz ardı etmek çok kolay olduğu için, açık olmanın uygun olduğunu hissediyorum - ve bir durumda olsa bile bir goto, ağrılı bir başparmak gibi göze çarpmalıdır.
Ayrıca vaka ifadeleri yeniden sıralandığında oluşabilecek hataların önlenmesine yardımcı olur.