मेरे पास एक switchसंरचना है जिसे संभालने के लिए कई मामले हैं। switchएक से अधिक चल रही है enumजो संयुक्त मूल्यों के माध्यम से डुप्लिकेट कोड के मुद्दे बन गया है:
// 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.
}
वर्तमान में switchसंरचना प्रत्येक मूल्य को अलग से संभालती है:
// 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;
...
}
आपको वहां विचार मिलता है। मैंने वर्तमान में ifइसके बजाय एक एकल पंक्ति के साथ संयोजन को संभालने के लिए एक खड़ी संरचना में तोड़ दिया है :
// All possible combinations of One - Eight.
if (One || TwoOne || ThreeOne || ThreeOneTwo)
DrawOne;
if (Two || TwoOne || ThreeTwo || ThreeOneTwo)
DrawTwo;
if (Three || ThreeOne || ThreeTwo || ThreeOneTwo)
DrawThree;
यह अविश्वसनीय रूप से लंबे तार्किक मूल्यांकन के मुद्दे को प्रस्तुत करता है जो पढ़ने के लिए भ्रमित कर रहे हैं और बनाए रखने में मुश्किल हैं। इसे बाहर करने के बाद मैंने विकल्पों के बारे में सोचना शुरू किया और switchमामलों के बीच में एक संरचना के विचार के बारे में सोचा ।
मुझे gotoउस मामले में उपयोग करना होगा क्योंकि C#गिरावट की अनुमति नहीं है। हालाँकि, यह switchसंरचना में इधर-उधर कूदने के बावजूद अविश्वसनीय रूप से लंबी तर्क श्रृंखला को रोकता है , और यह अभी भी कोड दोहराव में लाता है।
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;
}
यह अभी भी एक साफ पर्याप्त समाधान नहीं है और उस gotoकीवर्ड से जुड़ा एक कलंक है जिससे मैं बचना चाहूंगा। मुझे यकीन है कि इसे साफ करने का एक बेहतर तरीका होना चाहिए।
मेरा प्रश्न
क्या पठनीयता और स्थिरता को प्रभावित किए बिना इस विशिष्ट मामले को संभालने का एक बेहतर तरीका है?
gotoतब करते हैं जब आपकी भाषा में उच्च स्तरीय संरचना मौजूद नहीं होती है। मैं कभी-कभी चाहता था कि ए fallthru; कीवर्ड gotoलेकिन ओह अच्छी तरह से उस विशेष उपयोग से छुटकारा पाने के लिए ।
gotoC # जैसी उच्च-स्तरीय भाषा में एक का उपयोग करने की आवश्यकता महसूस होती है , तो संभवतः आपने कई अन्य (और बेहतर) डिज़ाइन और / या कार्यान्वयन विकल्पों की अनदेखी की है। अति हतोत्साहित।