क्या स्थिर विधियों के साथ स्थिर कक्षाएं SOLID मानी जाती हैं?


27

ठोस शामिल Liskov प्रतिस्थापन princicple जो धारणा है कि "एक कार्यक्रम में वस्तुओं है कि कार्यक्रम की शुद्धता को बदले बिना उनके उपप्रकार के उदाहरण के साथ बदली होना चाहिए" है।

चूंकि स्टैटिक विधियों के साथ स्टैटिक क्लास ( Mathक्लास की तरह थोड़ा ) में इंस्टेंस नहीं होते हैं, क्या मेरा सिस्टम SOLID माना जाता है, अगर मेरे पास स्टैटिक क्लासेस हैं?


मुझे लगता है कि यह सवाल बहुत अच्छा है। आइए देखें कि समुदाय को क्या पेशकश करनी है।
सईद नेमाटी

1
एक गणित वर्ग में राज्य शामिल नहीं है। तो आप वास्तव में कभी भी इस प्रकार की वस्तुओं को पास नहीं कर रहे हैं। इसलिए मुझे यकीन नहीं है कि यह कैसे प्रासंगिक है।
मार्टिन यॉर्क

मुझे नहीं लगता कि वास्तव में स्टैटिक क्लासेस को शुद्ध सोलिड कहा जा सकता है (कुछ पहले से बताए गए कारणों में से कुछ के लिए ज्यादा) लेकिन मैं उन्हें डीआरवाई सिद्धांत के लिए एक महान वकील और उपकरण मानूंगा।
dreza

2
ऐसा कैसे? मेरे अनुभव से, स्थैतिक वर्गों के अति प्रयोग से लोगों को हर समय आधे कोड के साथ खुद को दोहराते हुए स्थायी रूप से एक वैश्विक स्थैतिक ईश्वर वस्तु में हेरफेर होता है।
back2dos

1
मुझे लगता है कि मैं कॉमन कोड प्रदान करने के लिए उपयोगिता वर्गों के संदर्भ में अधिक सोच रहा हूं। मैं मानता हूं कि वे आसानी से और अक्सर गलत उपयोग किए जाते हैं, लेकिन फिर भी सोचते हैं कि उपयोगी कोड प्रदान कर सकते हैं एक साथ साझा कोड जहां राज्य एक मुद्दा नहीं है
dreza

जवाबों:


27

एलएसपी एक वर्ग के उदाहरण को एक विधि में पारित करने के लिए लागू होता है, विधि उस उदाहरण के साथ कुछ सामान करती है, और अक्सर कुछ प्रकार के परिणाम उत्पन्न करती है। यह स्थिर वर्गों के लिए मायने नहीं रखता क्योंकि C # में आप एक स्थिर वर्ग का उदाहरण नहीं बना सकते हैं।

इससे भी महत्वपूर्ण बात यह है कि स्थिर वर्गों को सील कर दिया जाता है और इसलिए उन्हें विरासत में नहीं मिला जा सकता है। यह आपके प्रश्न को C # जाता है।

आप कह सकते हैं कि स्थैतिक कक्षाएं हमेशा एलएसपी-अनुरूप होती हैं क्योंकि आप कभी भी उस सिद्धांत का उल्लंघन करने वाले उपवर्ग का उत्पादन नहीं कर सकते हैं। आप यह भी कह सकते हैं कि स्थिर वर्ग कभी भी उसी कारण से एलएसपी-अनुरूप नहीं होते हैं।


जावा में, स्थिर कक्षाएं थोड़ी भिन्न होती हैं। आप एक शीर्ष-स्तरीय वर्ग को "स्थिर" के रूप में चिह्नित नहीं कर सकते हैं, इसलिए यदि आप C # के स्थिर वर्ग के समान एक उपयोगिता वर्ग बनाना चाहते हैं, तो आपको इसे finalअपने निर्माता के रूप में घोषित करना होगा और इसे छिपाना होगा। एक बार जब आप ऐसा कर लेते हैं, हालांकि, वे C # के समान व्यवहार करते हैं - तो आप उन्हें तुरंत नहीं कर सकते या उन्हें उप-वर्ग नहीं कर सकते। आप एक आंतरिक वर्ग के रूप में घोषित कर सकते हैं static, लेकिन इसका मतलब यह नहीं है कि यह सी # में करता है: यह बस एक नेस्टेड शीर्ष-स्तरीय वर्ग को दर्शाता है ।

VB.NET इस मामले में ठीक उसी तरह से व्यवहार करता है, जैसा कि मैं जानता हूं।


आपने उल्लेख नहीं किया कि क्या आप अन्य सिद्धांतों में रुचि रखते हैं, लेकिन मैं उन्हें पूर्णता के लिए वैसे भी शामिल करने जा रहा हूं।

S निगलना जिम्मेदारी सिद्धांत : एक स्थिर वर्ग आसानी से इस सिद्धांत का पालन करता है।
O पेन / बंद सिद्धांत : चूंकि स्थिर कक्षाएं सील की जाती हैं, वे कभी भी इस सिद्धांत का पालन नहीं कर सकते हैं।
एल iskov प्रतिस्थापन सिद्धांत : ऊपर के रूप में।
मैं अलग-थलग अलगाव सिद्धांत : एक एकल वर्ग के लिए लागू नहीं होता है, लेकिन एक बड़े स्थिर वर्ग को छोटे में विभाजित करता है, और अधिक विशिष्ट इस सिद्धांत का पालन करने की दिशा में एक कदम हो सकता है।
डी एपेंडेंसी उलटा सिद्धांत : स्थिर कक्षाएं इंटरफेस को लागू नहीं कर सकती हैं, इसलिए इसका उपयोग करने वाला कोई भी वर्ग उस समय जो भी कार्यान्वयन मौजूद है, उस पर हमेशा निर्भर करेगा। स्टेटिक वर्ग इस सिद्धांत का उल्लंघन करते हैं।

चूंकि स्थिर वर्ग सभी 5 मानदंडों को पूरा नहीं करते हैं, इसलिए वे SOLID नहीं हैं।


क्योंकि SOLID होने का मतलब है कि हमें सभी 5 मानदंडों को पूरा करना होगा, इसका मतलब यह नहीं है कि वे SOLID नहीं हैं?
पचेरियर

1
@Pacerier हाँ, लेकिन किसी को हर समय एक वर्ग को ठोस बनाने की कोशिश नहीं करनी चाहिए, अगर इसकी आवश्यकता नहीं है; यह वर्ग के संदर्भ पर निर्भर करता है। यदि यह एक उपयोगिता वर्ग या कुछ है, तो यह ठीक है कि "सोलिड" नहीं होना चाहिए, लेकिन अगर यह एक वास्तविक डोमेन वर्ग है जिसका विशिष्ट डोमेन उपयोग है ...
वेन मोलिना

4

मैं इस तरह के वर्ग को ऑब्जेक्ट-ओरिएंटेड के रूप में वर्गीकृत नहीं करूँगा और इसलिए मैं कहूंगा कि यह ऑब्जेक्ट-ओरिएंटेड डिज़ाइन के प्रिंसिपलों से नहीं मिल सकता (और कोशिश नहीं करनी चाहिए)।

ये कक्षाएं जावा और C # जैसी भाषाओं में एक वर्ग के बाहर कोड प्रदान करने में असमर्थता का एक हल मात्र हैं। यदि वे हो सकते हैं, तो उन्हें स्टैंडअलोन कार्यों के रूप में परिभाषित किया जाना चाहिए क्योंकि वे ऑब्जेक्ट-ओरिएंटेशन से कोई लाभ प्राप्त नहीं करते हैं।


मैं कक्षा के बाहर अकेले काम करने से असहमत हूँ। एक सामान्य नाम के तहत समूह से संबंधित कार्यों (स्थिर या नहीं) की सरल क्षमता पठनीयता के लिए उपयोगी है। गणितीय कार्य बिल को पूरी तरह से फिट करते हैं।
जॉजो

2
@jojo सहमत हुए। कक्षाओं के बाहर परिभाषित कार्यों का समर्थन करने वाली भाषाएं भी इन कार्यों जैसे तार्किक नाम C ++ में तार्किक समूहन का समर्थन करती हैं।
ज्ञान उर्फ ​​गैरी ब्यून

2

यह ध्यान देने योग्य है, क्योंकि आपने कोई भाषा निर्दिष्ट नहीं की है, कि C ++ में आप उन कक्षाओं को पास कर सकते हैं जिनमें केवल स्थिर सदस्य होते हैं और टेम्पलेट के माध्यम से उन सदस्यों तक पहुँच प्राप्त करते हैं, और इसलिए केवल स्थैतिक सदस्यों के साथ वर्ग के लिए विकल्प देना संभव है, और यकीनन, तरीके फॉर्म को "इंटरफ़ेस" कहा जाता है।


vb.net / c # / java
पचेरियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.