switchEle alması gereken birkaç durumu olan bir yapıya sahibim . switchAşırı faaliyet enumkombine 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 switchyapı, 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 ifbunun 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, switchdavalar arasında ters düşecek bir yapı fikrini düşündüm .
Bir gotoolayı kullanmak zorundayım çünkü C#düşmeye izin vermiyor. Bununla birlikte, switchyapı 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 gotokaçı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 gotoama ah iyi.
gotoC # 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ış.