यदि आप फ़ील्ड नाम का उपयोग करते हैं, तो आपको encapsulation नहीं मिलता है। Encapsulation न केवल वर्गों के बीच, बल्कि एक वर्ग के भीतर लागू होता है।
यदि भविष्य के बिंदु पर, आप फ़ील्ड को फिर से परिभाषित करते हैं लेकिन एक्सेसर/सेटर फ़ंक्शन के हस्ताक्षर समान छोड़ देते हैं, न केवल बाहरी कक्षाएं जो आपकी कक्षा का उपयोग नहीं करती हैं, बल्कि आपकी खुद की कक्षा में आंतरिक दिनचर्या भी टूट नहीं जाएगी । इस कोड, शिथिल कोड के आधार पर कि अपाचे विकेट ढांचे में दिखाई देता है, उदाहरण के लिए
लें (हालांकि ढांचा इस समस्या को कष्ट नहीं होता है, मैं बस यह उपयोग कर रहा हूँ उदाहरण देकर स्पष्ट करना):
मान लीजिए कि यह थे चलो मूल वर्ग:
class RadioChoice {
private String prefix;
RadioChoice(String prefix) {
this.prefix = prefix ;
setPrefix(String prefix) {
this.prefix = prefix ;
}
}
यहाँ हम पहले से ही एक समस्या देख सकते हैं: एक ही आपरेशन this.prefix = prefix
टो स्थानों में होता है। यह बिल्कुल वही काम करने के लिए है, लेकिन चूंकि यह दो स्थानों पर होता है, इसलिए "एक ही चीज़" दो अलग-अलग चीजों में अलग हो सकती है। (इसे डेटाबेस सामान्यीकरण के लिए तुलना करें, एक अभ्यास जिसे ठीक से रोकने के लिए डिज़ाइन किया गया है।)
अब, अपाचे विकेट में वेब पृष्ठों को प्रस्तुत करने के तरीके में परिवर्तन रिकॉर्ड करने की अवधारणा है, ताकि उन परिवर्तनों को पूर्ववत किया जा सके। यह "पूर्ववत करें" ऑब्जेक्ट की एक सूची संग्रहीत करके करता है। एक RadioChoice के उपसर्ग उन चीजों है कि पूर्ववत किया जा सकता से एक है, और इसलिए 'उपसर्ग' सेटर परिवर्तन रिकॉर्ड करना होगा:
class RadioChoice {
private String prefix;
RadioChoice(String prefix) {
this.prefix = prefix ;
setPrefix(String prefix) {
// save the old prefix
this.getPage().addChange(new PrefixChange(this.prefix));
// set the new one
this.prefix = prefix ;
}
}
अब देखो क्या होता है: क्योंकि निर्माता उपसर्ग सीधे सेट, कोई परिवर्तन नहीं से सहेजा जाता है सीटीओआर अगर हमने सेटर का इस्तेमाल किया होता, तो सीटीआर रीफैक्टरिंग के बाद स्वचालित रूप से "सही काम करेगा"। इसके बजाय, हमें दोनों सेटर और सीटीओआर को दोबारा रिफैक्टर करना होगा।
बेशक
, हमारे कोड अभी भी इष्टतम से कम है, वास्तव में यह इस होना चाहिए:
setPrefix(String prefix) {
// save the old prefix
this.getPage().addChange(new PrefixChange(this.getPrefix()));
// set the new one
this.prefix = prefix ;
}
}
स्कॉट Meyers (इस पर लेख, जहां वह वकालत की कि की एक श्रृंखला था C++, जिसमें नि: शुल्क कार्य हैं) एक वर्ग का खुलासा करता है केवल आदिम कार्यों (आदिम कार्यों: कक्षाएं iteslf को छोड़कर संभव नहीं है) और यह कि सभी कार्यों को प्राथमिक कार्यों से बनाया जा सकता है, उन्हें नि: शुल्क कार्य किया जा सकता है। यह एक दुबला इंटरफेस, अधिक स्थिर इंटरफेस के लिए बनाता है।
उसी वैन में, इस सीमा तक कि आप कक्षा में कार्यों को केवल अपने आदिम इंटरफेस पर निर्भर कर सकते हैं, आपके पास अधिक लचीलापन है; विशेष रूप से, उन कार्यों को कक्षा से बाहर ले जाने के लिए उम्मीदवार हैं। आमतौर पर, सेटर्स और गेटर्स का उपयोग करके आप परिवर्तनों से प्रेरित होते हैं।
हां यह करता है, सी # का एक बड़ा लाभ। – Randolpho
हम उन लोगों के लिए क्या बात कर रहे हैं जो इन जवाबीनर चीज़ों को नहीं जानते हैं? –
आपको सम्मेलनों का पालन नहीं करना चाहिए क्योंकि "हर कोई उनका उपयोग करता है," विशेष रूप से यदि आप इसे स्वयं को उचित नहीं ठहरा सकते हैं। सम्मेलन का मतलब यह नहीं है कि यह एक अच्छा विचार है। सवाल करो! :) – JoshJordan