खैर, मुझे लगता है कि यह अच्छे और अच्छे के बीच के अंतर को उबालता है ।
जबकि ज्यादातर मामलों में आप अन्य पैटर्न (रणनीति या शायद फ्लाईवेट) को लागू करके स्थिरांक के उपयोग से बच सकते हैं, एक अवधारणा का प्रतिनिधित्व करने के लिए आधा दर्जन अन्य वर्गों की आवश्यकता नहीं है। मुझे लगता है कि यह किस चीज को उबालता है, यह है कि अन्य स्थिरांक की कितनी संभावना है। दूसरे शब्दों में, क्या इंटरफ़ेस पर स्थिरांक द्वारा प्रदान किए गए ENUM का विस्तार करने की आवश्यकता है। यदि आप इसे विस्तारित करने की आवश्यकता का पूर्वाभास कर सकते हैं, तो अधिक औपचारिक पैटर्न के साथ जाएं। यदि नहीं, तो यह पर्याप्त हो सकता है (यह काफी अच्छा होगा, और इसलिए लिखने और परीक्षण करने के लिए कम कोड हो सकता है)। यहाँ एक अच्छा पर्याप्त और एक बुरा उपयोग का एक उदाहरण है:
खराब:
interface User {
const TYPE_ADMINISTRATOR = 1;
const TYPE_USER = 2;
const TYPE_GUEST = 3;
}
काफी है:
interface HTTPRequest_1_1 {
const TYPE_CONNECT = 'connect';
const TYPE_DELETE = 'delete';
const TYPE_GET = 'get';
const TYPE_HEAD = 'head';
const TYPE_OPTIONS = 'options';
const TYPE_POST = 'post';
const TYPE_PUT = 'put';
public function getType();
}
अब, मैंने उन उदाहरणों को चुना है जो सरल है। User
इंटरफ़ेस उपयोगकर्ता प्रकार का एक enum को परिभाषित किया गया है। यह समय के साथ विस्तारित होने की बहुत संभावना है और किसी अन्य पैटर्न द्वारा बेहतर अनुकूल होगा। लेकिन HTTPRequest_1_1
एक सभ्य उपयोग-मामला है, क्योंकि एनएफसी RFC2616 द्वारा परिभाषित किया गया है और वर्ग के जीवनकाल के लिए नहीं बदलेगा।
सामान्य तौर पर, मैं एक वैश्विक समस्या होने के रूप में स्थिरांक और वर्ग के साथ समस्या को नहीं देखता हूं । मैं इसे एक निर्भरता समस्या के रूप में देखता हूं। यह एक संकीर्ण भेद है, लेकिन एक निश्चित है। मैं वैश्विक समस्याओं को वैश्विक चर के रूप में देखता हूं जो लागू नहीं होते हैं, और जैसे कि एक नरम वैश्विक निर्भरता पैदा करते हैं। लेकिन एक हार्ड-कोडेड क्लास एक लागू निर्भरता बनाता है, और जैसे कि एक कठिन वैश्विक निर्भरता बनाता है। तो दोनों निर्भरताएं हैं। लेकिन मैं इसे लागू नहीं होने के कारण वैश्विक रूप से बहुत बुरा मानता हूं ... यही कारण है कि मैं एक ही बैनर के तहत वैश्विक निर्भरता के साथ वर्ग निर्भरता को लुप्त करना पसंद नहीं करता ...
यदि आप लिखते हैं MyClass::FOO
, तो आप कार्यान्वयन के विवरण के लिए कठिन-कोडित हैं MyClass
। यह एक हार्ड-युग्मन बनाता है, जो आपके कोड को कम लचीला बनाता है, और इस तरह से बचा जाना चाहिए। हालाँकि, इस प्रकार के युग्मन की अनुमति देने के लिए इंटरफेस मौजूद हैं। इसलिए MyInterface::FOO
किसी भी ठोस युग्मन का परिचय नहीं है। इसके साथ ही मैंने कहा कि मैं इसमें निरंतरता जोड़ने के लिए केवल एक अंतरफलक नहीं पेश करूंगा।
इसलिए यदि आप इंटरफेस का उपयोग कर रहे हैं, और आप बहुत आश्वस्त हैं कि आपको (या उस मामले के लिए किसी और को) अतिरिक्त मूल्यों की आवश्यकता नहीं होगी, तो मैं वास्तव में इंटरफ़ेस स्थिरांक के साथ एक बड़ा मुद्दा नहीं देखता ... सबसे अच्छा डिज़ाइन में कोई स्थिरांक या सशर्त या मैजिक-नंबर या मैजिक-स्ट्रिंग्स या हार्ड-कोडेड कुछ भी शामिल नहीं होगा। हालाँकि, यह अतिरिक्त समय को विकास में जोड़ता है, क्योंकि आपको उपयोगों पर विचार करना चाहिए। मेरा विचार है कि ज्यादातर बार यह एक महान ठोस डिजाइन बनाने के लिए अतिरिक्त समय लेने के लिए बिल्कुल लायक है। लेकिन ऐसे समय होते हैं जब वास्तव में पर्याप्त अच्छा स्वीकार्य होता है (और अंतर को समझने के लिए एक अनुभवी डेवलपर लेता है), और उन मामलों में यह ठीक है।
फिर, उस पर सिर्फ मेरा विचार है ...