2010-05-25 14 views
5

के बाद कक्षा में गुणों का उपयोग करके के बारे में एक सवाल है।संपत्ति और Encapsulation

मैं सार्वजनिक संपत्तियों के बजाय सार्वजनिक रूप से सदस्य चर उजागर की उपयोग किया गया है। बहुमत सलाह देते हैं कि यह दृष्टिकोण encapsulation में मदद करता है। हालांकि, मैं इसे संपत्ति बनाकर encapsulation लाभ नहीं समझता।

कई लोगों गुणों का उपयोग करके की असली वजह पता donot। वे इसे कोडिंग मानक के हिस्से के रूप में करते हैं।

कोई स्पष्ट रूप से व्याख्या कर सकते हैं कि कैसे एक संपत्ति सार्वजनिक सदस्य चर की तुलना में बेहतर है और यह कैसे कैप्सूलीकरण को बेहतर बनाता है?

उत्तर

6

Encapsulation परिवर्तन से फोन कर कक्षाएं इंसुलेटिंग द्वारा मदद करता है।

आइए कल्पना करें कि आपके पास एक साधारण श्रेणी है जो एक कार इंजन मॉडल करती है (कारण सभी ओओ उदाहरणों में एक कार समानता शामिल होनी चाहिए :))। आप इस तरह एक साधारण क्षेत्र हो सकता है:

private bool engineRunning; 

सीधे शब्दों में इस क्षेत्र को सार्वजनिक करना या कोई IsEngineRunning() गेटर उपलब्ध कराने के किसी भी अलग हो प्रतीत नहीं होता है।

अब आप अपने वर्ग और अधिक परिष्कृत कर लगता है, तो आप उस क्षेत्र को हटा दें और साथ इसे बदलना चाहते:

private bool ignitionOn; 
private bool starterWasActivated; 

अब अगर आप पुराने engineRunning क्षेत्र तुम जाओ और उन्हें बदलने के लिए तक पहुँचने वर्गों के बहुत सारे है सभी (बुरे समय)।

यदि इसके बजाय आप के साथ शुरू किया था:

public bool IsEngineRunning() 
{ 
    return this.engineRunning; 
} 

अब आप इसे करने के लिए बदल सकता है:

public bool IsEngineRunning() 
{ 
    return ignitionOn && starterWasActivated; 
} 

और वर्ग के इंटरफ़ेस एक ही (अच्छा समय) बनी हुई है।

+0

मैं बाहर बात करने के लिए है कि इस बदलाव का संकेत नहीं करता कि ग्राहकों परिवर्तित किया जाना चाहिए चाहते हैं। यह केवल तात्पर्य है कि आपको इंजन की तरह संपत्ति को उसी तरह और उसी अर्थशास्त्र के साथ पहले ही प्रकट करना होगा। केवल अंतर यह है कि इग्निशन और स्टार्टर गुणों के प्रत्येक अपडेट को इंजनरिंग संपत्ति को भी अपडेट करना होगा। अधिक बार पढ़ने/अपडेट करने के आधार पर सकारात्मक या नकारात्मक प्रदर्शन प्रभाव हो सकता है। –

1

कुछ विचार:

  • आपके पास कॉल वर्गों को प्रभावित किए बिना अपने डेटा के आंतरिक प्रतिनिधित्व बदल सकते हैं।

    उदा। (पहले)

    public boolean isActive() { 
        return this.is_active; 
    } 
    

    (के बाद)

    public boolean isActive() { 
        return this.is_active && this.approved && this.beforeDeadline; 
    } 
    

    यह खासकर तब महत्वपूर्ण अपने कोड (अर्थात अपने कोड 3 तीय-पक्ष है) दूसरों के द्वारा प्रयोग किया जाता है है। एक निश्चित डिग्री के लिए आपके इंटरफेस/एपीआई स्थिर रहना है। छोटे बदलावों का उपयोग करने वाले अन्य कोड के कोड को प्रभावित नहीं करना चाहिए।

  • आप अधिक जटिल परिचालन कर सकते हैं। एक चर is_active पर विचार करें। शायद इस चर के मान को बदलने से ऑब्जेक्ट के अन्य गुण भी प्रभावित होते हैं। यदि आप किसी विधि में पहुंच को समाहित करते हैं, तो आप इस विधि के अंदर इसका ख्याल रख सकते हैं और कॉलर को परवाह नहीं है।

    उदा।

    public void setActive(boolean active) { 
        this.is_active = active; 
        this.startTimeout(); 
        this.updateOtherInformation(); 
    } 
    

    इसलिए यह क्रियाओं की एक निश्चित श्रृंखला को लागू करता है। आप इस तथ्य पर भरोसा नहीं करते हैं कि कॉलर इस क्रिया को सही तरीके से निष्पादित करता है। आपका ऑब्जेक्ट हमेशा सही स्थिति में होगा।

2

मैं इसे छोटा कर दूंगा। गुण = लचीलापन

गुण सदस्यों को बताया कि आप हर समय या कि एक वर्ग में धारण करने के लिए नहीं करना चाहते हैं बनाने के लिए उपयोगी होते मौजूदा सदस्यों एकत्रित/कार्य कर रहे हैं।

ईजी। उम्र जन्मतिथि के आधार पर उत्पादन किया जा सकता है, canSwim hasLimbs & & से उत्पन्न किया जा सकता गुण के रूप में

उजागर सदस्यों तैरता जब अप्रत्याशित बदलाव के साथ काम कर सहायक हो सकता है [किया किसी को भी कभी सभी ग्राहक के अनुरोध का अनुमान है?] एक साथ प्रणालियों में मौजूदा डेटाबेस

ईजी। आश्वस्त है जब उपयोगकर्ता 18yr से अधिक है और प्रदर्शन के लिए कैश किया गया है। ग्राहक यूएस में सेवा चलाने के लिए चाहता है और यदि झूठी बात की जाती है तो आप झूठी वापसी कर सकते हैं और केवल कैश सही होने पर उम्र की जांच कर सकते हैं

4

सदस्य चर के बजाए गुणों का खुलासा करना बेहतर है, क्योंकि इससे आपको सभी प्रकार के काम करने में मदद मिलेगी सदस्य चर के मूल्य को सेट या प्राप्त करते समय जांचना।

यू एक सदस्य चर मान लीजिए:

private int id; 

और यदि आप किसी सार्वजनिक संपत्ति है:

public int ID 
{ 
    get 
    { 
     // do something before returning 
    } 
    set 
    { 
     // do some checking here may be limits or other kind of checking 
    } 
}