2012-06-05 20 views
6

मुझे एहसास है कि यह शायद का उत्तर नहीं दे सकता है, लेकिन मैं इस बात की तलाश कर रहा हूं कि निजी सदस्यों का सीधे वर्ग या कक्षा के अंदर सार्वजनिक एक्सेसर्स का उपयोग करना है या नहीं। ,निजी सदस्यों या सार्वजनिक एक्सेसर्स का उपयोग करने के तरीके

public class Matrix { 

    // Private Members 
    private int[][] e; 
    private int numRows; 
    private int numCols; 

    // Accessors 
    public int rows(){ return this.numRows; } 
    public int cols(){ return this.numCols; } 

    // Class Methods 
    // ... 
    public void printDimensions() 
    { 
     // [A] Using private members 
     System.out.format("Matrix[%d*%d]\n", this.numRows, this.numCols); 


     // [B] Using accessors 
     System.out.format("Matrix[%d*%d]\n", this.rows(), this.cols()); 
    } 

printDimensions() समारोह में एक ही जानकारी प्राप्त करने के दो तरीके दिखाता है [एक] निजी सदस्यों का उपयोग कर:

उदाहरण के लिए, निम्नलिखित कोड (जावा में है, लेकिन यह सी में बहुत समान लगेगा ++) पर विचार (this.numRows, this.numCols) या [बी] एक्सेसर्स के माध्यम से (this.rows(), this.cols())।

एक तरफ, आप एक्सेसर्स का उपयोग करना पसंद कर सकते हैं क्योंकि कोई रास्ता नहीं है कि आप अनजाने में निजी सदस्य चर के मूल्य को बदल सकते हैं। दूसरी तरफ, आप निजी सदस्यों को उम्मीद में सीधे उम्मीद कर सकते हैं कि यह अनावश्यक फ़ंक्शन कॉल को हटा देगा।

मुझे लगता है कि मेरा प्रश्न है, या तो डी-फैक्टो मानक या पसंदीदा है?

+0

कोड जावा है, सी ++ नहीं, टैग को हटा रहा है। किसी भी दर पर, प्रश्न शायद जावा और सी ++ से अधिक * भाषा-अज्ञेय * है ... –

+1

यह एक धार्मिक हो जाता है। मुझे नहीं लगता कि एक मानक है। हालांकि, जब भी संभव हो, मैं इसे 'छोड़ दूंगा'। –

+0

मैं मानता हूं कि यह भाषा-अज्ञेयवादी प्रतीत होता है, यही कारण है कि मैंने मूल रूप से सी ++ को शामिल किया, क्योंकि जावा को प्रश्न के दायरे को सीमित नहीं किया गया था। – jedwards

उत्तर

6

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

मुझे इसके बारे में दृढ़ता से महसूस नहीं होता है, हालांकि, और अगर मैंने सोचा कि मेरे पास एक अच्छा कारण है तो मैं इसे "नियम" तोड़ दूंगा।

+0

एक और उदाहरण यह है कि यदि आप कक्षा धागे को सुरक्षित बनाते हैं और 'पंक्तियों' को एक्सेस करने की आवश्यकता होती है एक निश्चित तरीके से (उदाहरण के लिए एक लॉक आयोजित)। – assylias

+0

@assylias, यदि आप लॉक के अंदर से एक से अधिक चर का उपयोग करना चाहते हैं तो इससे मदद नहीं मिलेगी। – finnw

1

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

2

आईएमएचओ, एक्सेसर्स प्रति से एक्सेसर्स की बजाय संरचना और डेटा प्रबंधन का विषय हैं। कभी-कभी, आपको इसे वापस करने से पहले कुछ डेटा प्रीप्रोसेस करना होगा। इस उदाहरण के बारे में सोचो:

public class Foo { 

    private List<Bar> bars = null; 

    //Methods and stuff 

    public List<Bar> getBars() { 
     if(bars == null) 
      bars = SomeClass.loadBars(); 
      // You can also use 
      // setBars(SomeClass.loadBars()); 
     return bars; 
    } 

} 

इस मामले में, अपने गेटर केवल अपने क्षेत्र लपेटकर नहीं है, लेकिन एक initialized क्षेत्र लौटने जब भी आप यह आह्वान। कक्षा के अंदर एक्सेसर्स का उपयोग करना वही लाभ देता है जो बाहरी लोगों के लिए, आप स्वयं को किसी फ़ील्ड के विशेष विवरण से अलग करते हैं और आप इसे संसाधित करने के बाद प्राप्त कर सकते हैं।

दूसरी तरफ, यदि आपका क्षेत्र सीधे लौटाया गया है (कहें, एक स्ट्रिंग) इससे कोई फर्क नहीं पड़ता कि आप प्राप्त करते हैं या आप नहीं करते हैं, लेकिन हो सकता है कि आप एक मानक का सम्मान करने के लिए उपयोग करना चाहें तुम्हारा कोड।

अंत में, यह सभी कोडिंग शैली के लिए उबलता है।

संबंधित मुद्दे