switch
Ele alması gereken birkaç durumu olan bir yapıya sahibim . switch
Aşırı faaliyet enum
kombine değerler aracılığıyla yinelenen kod sorunu teşkil hangi:
// All possible combinations of One - Eight.
public enum ExampleEnum {
One,
Two, TwoOne,
Three, ThreeOne, ThreeTwo, ThreeOneTwo,
Four, FourOne, FourTwo, FourThree, FourOneTwo, FourOneThree,
FourTwoThree, FourOneTwoThree
// ETC.
}
Şu anda switch
yapı, her bir değeri ayrı ayrı ele almaktadır:
// All possible combinations of One - Eight.
switch (enumValue) {
case One: DrawOne; break;
case Two: DrawTwo; break;
case TwoOne:
DrawOne;
DrawTwo;
break;
case Three: DrawThree; break;
...
}
Oradaki fikri anladın. Şu anda if
bunun tek bir satırla kombinasyonları işlemek için yığılmış bir yapıya dönüştürdüm :
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
Bu, okumak için kafa karıştırıcı ve bakımı zor olan inanılmaz derecede uzun mantıksal değerlendirme sorununu ortaya koymaktadır. Bunu tekrar gözden geçirdikten sonra, alternatifler hakkında düşünmeye başladım, switch
davalar arasında ters düşecek bir yapı fikrini düşündüm .
Bir goto
olayı kullanmak zorundayım çünkü C#
düşmeye izin vermiyor. Bununla birlikte, switch
yapı içinde atlamasına rağmen inanılmaz derecede uzun mantık zincirlerini önler ve hala kod çoğaltması getirir.
switch (enumVal) {
case ThreeOneTwo: DrawThree; goto case TwoOne;
case ThreeTwo: DrawThree; goto case Two;
case ThreeOne: DrawThree; goto default;
case TwoOne: DrawTwo; goto default;
case Two: DrawTwo; break;
default: DrawOne; break;
}
Bu hala yeterince temiz bir çözüm değil ve goto
kaçınmak istediğim anahtar kelimeyle ilişkili bir damgalama var . Eminim bunu temizlemenin daha iyi bir yolu olmalı.
Benim sorum
Okunabilirliği ve bakımını etkilemeden bu özel durumu ele almanın daha iyi bir yolu var mı?
goto
üst düzey yapısı sizin dilinizde mevcut değil iken. Bazen bir keşke olsaydı fallthru
; Bu özel kullanımdan kurtulmak için anahtar kelime goto
ama ah iyi.
goto
C # gibi yüksek seviyeli bir dilde kullanma gereksinimi duyuyorsanız , birçok başka (ve daha iyi) tasarım ve / veya uygulama alternatifini de gözden kaçırmışsınızdır. Son derece cesareti kırılmış.