फ़ॉल-थ्रू (क्लासिक) स्विच स्टेटमेंट का उपयोग करना कब उचित है? क्या इस तरह के उपयोग की सिफारिश और प्रोत्साहन किया जाता है या इसे हर कीमत पर टाला जाना चाहिए?
फ़ॉल-थ्रू (क्लासिक) स्विच स्टेटमेंट का उपयोग करना कब उचित है? क्या इस तरह के उपयोग की सिफारिश और प्रोत्साहन किया जाता है या इसे हर कीमत पर टाला जाना चाहिए?
जवाबों:
यहां एक उदाहरण है जहां यह उपयोगी होगा।
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;
}
इस तरह की बात (जहां एक मामले में अन्य शामिल है) बल्कि दुर्लभ है, मुझे लगता है, यही वजह है कि कुछ नई भाषाएं या तो फालोवर की अनुमति नहीं देती हैं या इसके लिए विशेष वाक्यविन्यास की आवश्यकता होती है।
// INTENTIONAL FALL THROUGH HERE
टिप्पणी का अभाव है ।
GetItemsForLevel(Info)
कॉल इनवॉइस वगैरह के माध्यम से गिरने के साथ इस कोड को लिखना आसान है GetItemsForLevel(Warning)
।
जब कुछ कार्यक्षमता को एक से अधिक मान के लिए लागू करना होता है, तो मैं उनका उपयोग करता हूं। उदाहरण के लिए, मान लीजिए कि आपके पास ऑपरेशनकोड नामक एक संपत्ति है। यदि कोड 1, 2, 3 या 4 के बराबर है, तो आप startOperationX () करना चाहते हैं। यदि यह 5 या 6 है, तो आप startOperationY () और 7 आप startOperationZ () करना चाहते हैं। कार्यक्षमता और विराम के साथ 7 पूर्ण मामले क्यों होते हैं जब आप फॉल-थ्रू का उपयोग कर सकते हैं?
मुझे लगता है कि यह कुछ स्थितियों में पूरी तरह से मान्य है, खासकर अगर यह 100 अगर-और बयानों से बचता है। =)
switch
साथ एकाधिक case
s से बंधा है। यह एक गिरावट के माध्यम से अलग है, जहां एक का निष्पादन case
अगले के break
बीच जारी रहता है क्योंकि उनके बीच की कमी है ।
पतन के मामले पूरी तरह से ठीक हैं। मुझे अक्सर पता चलता है कि बहुत सारे स्थानों में एक एन्यूमरेशन का उपयोग किया जाता है, और जब आपको कुछ मामलों में अंतर करने की आवश्यकता नहीं होती है, तो फॉल-थ्रू लॉजिक का उपयोग करना आसान होता है।
उदाहरण के लिए (व्याख्यात्मक टिप्पणियों पर ध्यान दें):
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;
}
}
मुझे इस तरह का उपयोग पूरी तरह स्वीकार्य लगता है।
case X: case Y: doSomething()
और के बीच एक बड़ा अंतर है case X: doSomething(); case Y: doAnotherThing()
। पहले में, इरादा काफी स्पष्ट है, जबकि दूसरे में, के माध्यम से गिरावट जानबूझकर हो सकती है या नहीं। मेरे अनुभव में, पहला उदाहरण कभी भी संकलक / कोड विश्लेषक में किसी भी चेतावनी को ट्रिगर नहीं करता है, जबकि दूसरा करता है। व्यक्तिगत रूप से, मैं केवल दूसरा उदाहरण "फॉल थ्रू" कहूंगा - हालांकि "आधिकारिक" परिभाषा के बारे में निश्चित नहीं है।
पर निर्भर करता है:
एक के बाद एक मामले को आने देने से जुड़ी दो मुख्य समस्याएं हैं:
यह आपके कोड को केस स्टेटमेंट के आदेश पर निर्भर करता है। यदि आप कभी नहीं गिरते हैं, तो यह मामला नहीं है और यह जटिलता की एक डिग्री जोड़ता है जो अक्सर अवांछित होता है।
यह स्पष्ट नहीं है कि एक मामले के लिए कोड में एक या अधिक बाद के मामलों के लिए कोड शामिल है।
कुछ स्थानों पर स्पष्ट रूप से गिरने पर रोक है। यदि आप ऐसी जगह पर काम नहीं करते हैं, और यदि आप अभ्यास में सहज हैं, और यदि प्रश्न में कोड को तोड़ने से कोई वास्तविक दुख नहीं होगा, तो यह दुनिया की सबसे बुरी बात नहीं हो सकती है। यदि आप इसे करते हैं, हालांकि, बाद में आने वालों को चेतावनी देने के लिए पास में एक ध्यान खींचने वाली टिप्पणी डालना सुनिश्चित करें (भविष्य में आप भी शामिल हैं)।
यहाँ मेरे जीवन को सरल बनाने के लिए गिरने के माध्यम से एक त्वरित (संयुक्त रूप से अपूर्ण (लीप वर्ष की कोई विशेष हैंडलिंग नहीं) उदाहरण दिया गया है:
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;
}
यदि मुझे एक मामले से दूसरे मामले में जाने की आवश्यकता महसूस होती है (दुर्लभ, स्वीकार की जाती है), तो मैं बहुत स्पष्ट होना पसंद करता हूं और goto case
निश्चित रूप से, यह मानता है कि आपकी भाषा इसका समर्थन करती है।
क्योंकि गिरना इतना असामान्य है, और कोड को पढ़ते समय अनदेखी करना बहुत आसान है, मुझे लगता है कि यह स्पष्ट होना उचित है - और एक गोटो, भले ही यह एक मामले में हो, एक गले में अंगूठे की तरह बाहर खड़ा होना चाहिए।
यह उन बग्स से बचने में भी मदद करता है जो तब हो सकते हैं जब केस स्टेटमेंट को फिर से व्यवस्थित किया जाता है।