कुछ OO डिजाइन सलाह के लिए देख रहे हैं


12

मैं एक ऐसा ऐप विकसित कर रहा हूं जिसका उपयोग औद्योगिक वातावरण में वाल्व खोलने और बंद करने के लिए किया जाएगा, और इस तरह से कुछ सरल सोच रहा था: -

public static void ValveController
{
    public static void OpenValve(string valveName)
    {
        // Implementation to open the valve
    }

    public static void CloseValve(string valveName)
    {
        // Implementation to close the valve
    }
}

(कार्यान्वयन वाल्व को नियंत्रित करने के लिए सीरियल पोर्ट पर डेटा के कुछ बाइट्स लिखेगा - वाल्व नाम से व्युत्पन्न "पता", और वाल्व को खोलने या बंद करने के लिए या तो "1" या "0"।

एक अन्य देव ने पूछा कि क्या हमें प्रत्येक भौतिक वाल्व के लिए एक अलग वर्ग बनाना चाहिए, जिसमें से दर्जनों हैं। मैं मानता हूं कि इसके PlasmaValve.Open()बजाय कोड लिखना अच्छा होगा ValveController.OpenValve("plasma"), लेकिन क्या यह ओवरकिल है?

इसके अलावा, मैं सोच रहा था कि भविष्य में काल्पनिक आवश्यकताओं की एक जोड़ी के साथ डिजाइन से कैसे निपटना सबसे अच्छा है: -

  1. हमें एक नए प्रकार के वाल्व का समर्थन करने के लिए कहा जाता है, जिसमें विभिन्न मानों को खोलने और बंद करने की आवश्यकता होती है (0 और 1 नहीं)।
  2. हमें एक वाल्व का समर्थन करने के लिए कहा जाता है जिसे 0-100 से किसी भी स्थिति में सेट किया जा सकता है, बजाय "खुले" या "बंद" के।

आम तौर पर मैं इस तरह की चीज के लिए विरासत का उपयोग करता हूं, लेकिन मैंने हाल ही में "उत्तराधिकार पर रचना" के आसपास अपना सिर प्राप्त करना शुरू कर दिया है और आश्चर्य है कि क्या रचना का उपयोग करने के लिए एक चालाक समाधान होना चाहिए था?


2
मैं एक सामान्य वाल्व वर्ग बनाऊंगा जिसमें विशिष्ट वाल्व के लिए एक पहचानकर्ता है (स्ट्रिंग नहीं, शायद एक एनम) और OpenValve / CloseValve विधियों के अंदर नियंत्रण प्रवाह के लिए आवश्यक कोई भी जानकारी। वैकल्पिक रूप से आप वाल्व वर्ग को अमूर्त बना सकते हैं और हर एक के लिए अलग-अलग कार्यान्वयन कर सकते हैं, जहां खुले / बंद वाल्व सिर्फ दिए गए वाल्व वर्ग के अंदर तर्क को इस घटना के लिए कहते हैं कि विभिन्न वाल्वों में अलग-अलग उद्घाटन / समापन तंत्र हैं। सामान्य तंत्र को आधार वर्ग में परिभाषित किया जाएगा।
जिमी होफा

2
काल्पनिक भविष्य की आवश्यकताओं के बारे में चिंता न करें। YAGNI।
15:15

3
@pdr YAGNI एक डबल धार वाला ब्लेड है, मैं मानता हूं कि यह सामान्य रूप से चलने लायक है, लेकिन चरम पर ले जाया जा सकता है भविष्य में स्थिरता या पठनीयता में मदद करने के लिए कुछ भी कर सकता है YAGNI का उल्लंघन कर रहा है, इस वजह से मुझे लगता है कि YAGNI का दायरा भी अस्पष्ट है अनेक। उस ने कहा, बहुत से लोग पहचानते हैं कि कहां YAGNI का उपयोग करना है और कहां टॉस करना है क्योंकि भविष्य के लिए लेखांकन आपको गंभीर दर्द से बचाएगा। मुझे लगता है कि लोगों को सावधान रहना चाहिए कि लोग YAGNI का अनुसरण करें, जब आपको नहीं पता कि वे उस स्पेक्ट्रम पर कहां उतरेंगे।
जिमी होफा

2
मनुष्य, 'रचना से अधिक अकर्मण्यता' पर हावी है। मैं एक वाल्व एब्स्ट्रैक्ट क्लास / इंटरफ़ेस बनाऊंगा और फिर उन्हें प्लाज़्मावल्वे में उप-वर्गीकृत करूंगा। और फिर मैं यह सुनिश्चित करूंगा कि मेरा वॉल्वकंट्रोलर वाल्व (एस) के साथ काम करेगा, न कि किस उपवर्ग के बारे में परवाह करने के बारे में।
MrFox

2
@ शसलिक: बिलकुल। मैंने उन लोगों द्वारा स्पेगेटी नामक उत्कृष्ट कोड भी देखा है जो ठोस सिद्धांतों को नहीं समझते हैं। हम इस पर हमेशा के लिए जा सकते हैं। मेरा कहना है कि मैंने स्थापित सिद्धांतों (कई वर्षों के अनुभव के जन्म) को खारिज करने के कारण अधिक समस्याएं देखी हैं जो मैंने अति-पालन के कारण देखी हैं। लेकिन मैं मानता हूं कि दोनों चरम खतरनाक हैं।
पीडीआर

जवाबों:


12

यदि वाल्व ऑब्जेक्ट का प्रत्येक उदाहरण इस वाल्वकंट्रोलर के समान कोड चलाएगा, तो ऐसा लगता है कि एकल वर्ग के कई उदाहरणों को जाने का सही तरीका होगा। इस मामले में बस वाल्व ऑब्जेक्ट के कंस्ट्रक्टर में किस वाल्व को नियंत्रित करता है (और कैसे) को कॉन्फ़िगर करें।

हालाँकि यदि प्रत्येक वाल्व नियंत्रण को चलाने के लिए अलग कोड की आवश्यकता होती है, और वर्तमान वाल्वकंट्रोलर एक विशाल स्विच स्टेटमेंट चला रहा है जो वाल्व के प्रकार के आधार पर अलग-अलग चीजें करता है, तो आपने बहुरूपता को खराब तरीके से फिर से लागू किया है। उस मामले में इसे एक सामान्य आधार (यदि यह समझ में आता है) के साथ कई वर्गों के लिए फिर से लिखना और एकल जिम्मेदारी सिद्धांत अपने डिजाइन गाइड होने दें।


1
कोड गंध के रूप में टाइप-आधारित स्विच स्टेटमेंट का उल्लेख करने के लिए +1। मैं अक्सर स्विच बयान जहां डेवलपर का दावा है वह सिर्फ KISS पीछा कर रहा था की इन प्रकार देखते हैं। कैसे डिजाइन सिद्धांतों को विकृत किया जा सकता है, इसका सटीक उदाहरण है
जिमी हॉफ

2
कई उदाहरणों में एक क्रम में वाल्व को लिंक करना आसान हो सकता है, जिससे आप अपने कोड में एक निर्देशित ग्राफ के रूप में वास्तविक संयंत्र पाइपिंग को मॉडल कर सकते हैं। तब आप कक्षाओं में व्यावसायिक तर्क भी जोड़ सकते हैं, जब आपको दबाव वाले एक वाल्व की तरह कुछ करने की आवश्यकता होती है, जब दबाव निर्माण से बचने के लिए एक और एक बंद हो जाता है, या सभी डाउनस्ट्रीम वाल्व बंद हो जाते हैं, तो आपको "पानी का हथौड़ा" प्रभाव नहीं मिलता है। जब वाल्व फिर से खोला जाता है।
TMN

1

मेरा प्रमुख पकड़ वाल्व की पहचान करने वाले पैरामीटर के लिए तार का उपयोग कर रहा है।

कम से कम एक Valveवर्ग बनाएं, जिसमें getAddressअंतर्निहित कार्यान्वयन की जरूरत के रूप में एक है और उन को पास करें ValveControllerऔर यह सुनिश्चित करें कि आप कोई नहीं बना सकते हैं वाल्व। इस तरह से आपको ओपन और क्लोज मेथड में से प्रत्येक में गलत स्ट्रिंग्स को हैंडल नहीं करना पड़ेगा।

चाहे आप खुले और पास में कॉल करने वाली सुविधा विधियाँ बनाते ValveControllerहैं, लेकिन आप ईमानदार हैं, मैं सभी संचार को सीरियल पोर्ट (एन्कोडिंग सहित) एक ही कक्षा में रखूँगा जो अन्य वर्ग जरूरत पड़ने पर कॉल करेंगे। इसका मतलब यह है कि जब आपको एक नए नियंत्रक को स्थानांतरित करने की आवश्यकता होती है, तो आपको केवल एक वर्ग को संशोधित करने की आवश्यकता होती है।

यदि आप परीक्षण करना पसंद करते हैं, ValveControllerतो आपको एक सिंगलटन भी बनाना चाहिए ताकि आप इसे मॉक कर सकें (या ऑपरेटरों के लिए एक प्रशिक्षण मशीन बना सकें)।


मैंने पहले कभी किसी को परीक्षण के लिए एक सिंगलटन की सिफारिश करते नहीं देखा है - आमतौर पर यह दूसरे तरीके से जाता है।
काज़ार्क

ईमानदारी से सिंगलटन स्टैटिक्स से बचने के लिए अधिक है और इसलिए संचार को सिंक्रनाइज़ किया जा सकता है
शाफ़्ट सनकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.