दुविधा
मैं ऑब्जेक्ट ओरिएंटेड प्रथाओं के बारे में बहुत सारी सर्वोत्तम अभ्यास पुस्तकें पढ़ रहा हूं, और मैंने पढ़ा है लगभग हर पुस्तक में एक हिस्सा है जहां वे कहते हैं कि एनम एक कोड गंध हैं। मुझे लगता है कि वे उस हिस्से से चूक गए हैं जहां वे समझाते हैं कि जब एनम मान्य होते हैं।
जैसे, मैं दिशानिर्देशों और / या उपयोग के मामलों की तलाश कर रहा हूं जहां एनम एक कोड गंध नहीं हैं और वास्तव में एक वैध निर्माण है।
सूत्रों का कहना है:
"चेतावनी, अंगूठे के एक नियम के रूप में, एनम कोड की बदबू आ रही है और बहुरूपी कक्षाओं में जाना चाहिए। [classes]" सेमैन, मार्क, .Net, २०११, पी। 342
[[] मार्टिन फाउलर एट अल।, रीफैक्टरिंग: इम्प्रूविंग ऑफ द डिजाइनिंग ऑफ मौजूदा कोड (न्यूयॉर्क: एडिसन-वेस्ले, १ ९९९), ow२।
प्रसंग
मेरी दुविधा का कारण एक ट्रेडिंग एपीआई है। वे मुझे इस विधि को भेजकर टिक डेटा की एक धारा देते हैं:
void TickPrice(TickType tickType, double value)
कहाँ पे enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... }
मैंने इस एपीआई के चारों ओर एक आवरण बनाने की कोशिश की है क्योंकि इस एपीआई के लिए परिवर्तनों को तोड़ना जीवन का तरीका है। मैं अपने रैपर पर प्रत्येक अंतिम प्राप्त टिक प्रकार के मूल्य पर नज़र रखना चाहता था और मैंने ऐसा किया है:
Dictionary<TickType,double> LastValues
मेरे लिए, यह एक दुश्मनी का एक उचित उपयोग की तरह लग रहा था अगर वे कुंजी के रूप में उपयोग किए जाते हैं। लेकिन मेरे पास दूसरे विचार हैं क्योंकि मेरे पास एक जगह है जहां मैं इस संग्रह के आधार पर निर्णय लेता हूं और मैं इस तरह से नहीं सोच सकता कि मैं स्विच स्टेटमेंट को कैसे समाप्त कर सकता हूं, मैं एक कारखाने का उपयोग कर सकता हूं लेकिन उस कारखाने में अभी भी एक होगा स्विच स्टेटमेंट कहीं। यह मुझे लग रहा था कि मैं बस चीजों को इधर-उधर कर रहा हूं, लेकिन अभी भी बदबू आ रही है।
Enums के DON'Ts को खोजना आसान है, लेकिन DOs, इतना आसान नहीं है, और अगर लोग अपनी विशेषज्ञता, पेशेवरों और विपक्षों को साझा कर सकते हैं, तो मैं इसकी सराहना करूंगा।
दूसरा विचार
कुछ निर्णय और कार्य इन पर आधारित होते हैं TickType
और मैं एनम / स्विच स्टेटमेंट को खत्म करने का तरीका नहीं सोच सकता। मैं जिस साफ-सुथरे समाधान के बारे में सोच सकता हूं, वह कारखाने का उपयोग कर रहा है और उसके आधार पर क्रियान्वयन लौटाता है TickType
। तब भी मेरे पास एक स्विच स्टेटमेंट होगा जो एक इंटरफ़ेस के कार्यान्वयन को वापस करता है।
नीचे सूचीबद्ध नमूना वर्गों में से एक है, जहां मुझे संदेह है कि मैं एक एनम गलत का उपयोग कर सकता हूं:
public class ExecutionSimulator
{
Dictionary<TickType, double> LastReceived;
void ProcessTick(TickType tickType, double value)
{
//Store Last Received TickType value
LastReceived[tickType] = value;
//Perform Order matching only on specific TickTypes
switch(tickType)
{
case BidPrice:
case BidSize:
MatchSellOrders();
break;
case AskPrice:
case AskSize:
MatchBuyOrders();
break;
}
}
}
enums as switch statements might be a code smell ...