जब गेटर्स एंड सेटर्स जायज़ हैं


175

गेट और सेटर की अक्सर ओओ के उचित नहीं होने के कारण आलोचना की जाती है। दूसरी ओर अधिकांश OO कोड मैंने देखा है कि व्यापक गेटर्स और सेटर हैं।

जब गेटर्स और सेटर जायज़ होते हैं? क्या आप उनका उपयोग करने से बचने की कोशिश करते हैं? क्या वे सामान्य रूप से अत्यधिक उपयोग किए जाते हैं?

यदि आपकी पसंदीदा भाषा में गुण हैं (मेरा काम करता है) तो इस प्रश्न के लिए ऐसी चीजों को भी गेटर्स और सेटर माना जाता है। वे एक OO कार्यप्रणाली के नजरिए से समान हैं। उनके पास सिर्फ अच्छे सिंटैक्स हैं।

गेट्टर / सेटर क्रिटिसिज्म के स्रोत (कुछ ने उन्हें बेहतर दृश्यता देने के लिए टिप्पणियों से लिया):

आलोचना को सरलता से कहने के लिए: गेटर्स एंड सेटर्स आपको ऑब्जेक्ट के बाहर से ऑब्जेक्ट की आंतरिक स्थिति में हेरफेर करने की अनुमति देते हैं। यह इनकैप्सुलेशन का उल्लंघन करता है। केवल वस्तु को ही अपनी आंतरिक स्थिति की परवाह करनी चाहिए।

और कोड का एक उदाहरण प्रक्रियात्मक संस्करण।

struct Fridge
{
    int cheese;
}

void go_shopping(Fridge fridge)
{
     fridge.cheese += 5;
}

कोड का म्यूटेटर संस्करण:

class Fridge
{
     int cheese;

     void set_cheese(int _cheese) { cheese = _cheese; }
     int get_cheese() { return cheese; }
 }

void go_shopping(Fridge fridge)
{
     fridge.set_cheese(fridge.get_cheese() + 5);        
}

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

इस सवाल पर पहले स्टैक ओवरफ्लो पर चर्चा की गई है:


21
Getters and setters are often criticized as being not proper OO- प्रशस्ति पत्र, कृपया।
रॉबर्ट हार्वे


45
@Job, क्यों क्योंकि यह कोड है? अगर यह गंभीरता से लिया जाए तो यह एक अच्छा सवाल है और पवित्र युद्ध की पुनरावृत्ति है।
पीटर टर्नर

2
@Winston Ewert: "... सवाल यह है कि क्या आपको कक्षा के अंदर डेटा तक पहुंच होनी चाहिए।" इसीलिए आप पब्लिक मेंबर वेरिएबल की जगह गेटर्स और सेटर्स का इस्तेमाल करते हैं।
जियोर्जियो

2
@Inston Ewert: मैं यह नहीं देखता कि गेटर्स / सेटरों की अनुपस्थिति इस समस्या को कैसे हल करेगी: डेटा के हर टुकड़े तक पहुंचने का एक तरीका होना चाहिए अन्यथा यह बेकार है; यह तय करना एक अच्छा डिज़ाइन का कार्य है कि डेटा का कौन सा भाग कोड के किस हिस्से तक पहुँच योग्य है। यदि कोई एक बुरा डिज़ाइनर है, तो वह गेटर्स के साथ या बिना बस जाएगा। बस मेरे 2 सेंट।
जियोर्जियो

जवाबों:


162

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

एनकैप्सुलेशन की बात यह नहीं है कि आपको ऑब्जेक्ट के बाहर से ऑब्जेक्ट की स्थिति को जानने या बदलने में सक्षम नहीं होना चाहिए, लेकिन यह करने के लिए आपके पास एक उचित नीति होनी चाहिए ।

  • कुछ डेटा सदस्य ऑब्जेक्ट के लिए पूरी तरह से आंतरिक हो सकते हैं, और इसमें न तो गेटर्स होना चाहिए और न ही बसना चाहिए।

  • कुछ डेटा सदस्यों को केवल-पढ़ा जाना चाहिए, इसलिए उन्हें गेटर्स की आवश्यकता हो सकती है लेकिन बसने वालों की नहीं।

  • कुछ डेटा सदस्यों को एक दूसरे के अनुरूप रखने की आवश्यकता हो सकती है। ऐसे मामले में आप प्रत्येक के लिए एक सेटर प्रदान नहीं करेंगे, लेकिन एक ही समय में उन्हें सेट करने के लिए एक एकल विधि, ताकि आप स्थिरता के लिए मूल्यों की जांच कर सकें।

  • कुछ डेटा सदस्यों को केवल एक निश्चित तरीके से बदलने की आवश्यकता हो सकती है, जैसे कि एक निश्चित राशि द्वारा बढ़ा या घटाया गया। इस मामले में, आप एक सेटर के बजाय एक increment()और / या decrement()विधि प्रदान करेंगे ।

  • फिर भी अन्य लोगों को वास्तव में पढ़ने-लिखने की आवश्यकता हो सकती है, और इसमें एक गेट्टर और एक सेटर दोनों होंगे।

के एक उदाहरण पर विचार करें class Person। मान लीजिए कि किसी व्यक्ति का नाम, सामाजिक सुरक्षा संख्या और आयु है। मान लीजिए कि हम लोगों को कभी भी अपना नाम या सामाजिक सुरक्षा संख्या बदलने की अनुमति नहीं देते हैं। हालांकि, व्यक्ति की उम्र हर साल 1 बढ़ाई जानी चाहिए। इस स्थिति में, आप एक निर्माता प्रदान करेंगे जो नाम और SSN को दिए गए मानों को इनिशियलाइज़ करेगा, और जो 0. की उम्र को इनिशियलाइज़ करेगा। आप एक विधि भी प्रदान incrementAge()करेंगे, जिससे आयु में 1. वृद्धि होगी। आप यह भी प्रदान करेंगे। तीनों के लिए गेटर्स। इस मामले में किसी भी निपटान की आवश्यकता नहीं है।

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

अब मान लीजिए कि एक व्यक्ति का वेतन भी है। और लोग अपनी इच्छानुसार नौकरियों को बदल सकते हैं, जिसका अर्थ है कि उनका वेतन भी बदल जाएगा। इस स्थिति को मॉडल करने के लिए हमारे पास कोई और तरीका नहीं है बल्कि एक setSalary()विधि प्रदान करने के लिए है ! वसीयत में बदला जाने वाला वेतन इस मामले में पूरी तरह से उचित नीति है।

वैसे, अपने उदाहरण में, मैं कक्षा देना होगा और तरीकों के बजाय और । तब आप अभी भी encapsulation होगा।FridgeputCheese()takeCheese()get_cheese()set_cheese()


public class Fridge {
  private List objects;
  private Date warranty;

  /** How the warranty is stored internally is a detail. */
  public Fridge( Date warranty ) {
    // The Fridge can set its internal warranty, but it is not re-exposed.
    setWarranty( warranty );
  }

  /** Doesn't expose how the fridge knows it is empty. */
  public boolean isEmpty() {
    return getObjects().isEmpty();
  }

  /** When the fridge has no more room... */
  public boolean isFull() {
  }

  /** Answers whether the given object will fit. */
  public boolean canStore( Object o ) {
    boolean result = false;

    // Clients may not ask how much room remains in the fridge.
    if( o instanceof PhysicalObject ) {
      PhysicalObject po = (PhysicalObject)o;

      // How the fridge determines its remaining usable volume is a detail.
      // How a physical object determines whether it fits within a specified
      // volume is also a detail.
      result = po.isEnclosedBy( getUsableVolume() );
    }

     return result;
  }

  /** Doesn't expose how the fridge knows its warranty has expired. */
  public boolean isPastWarranty() {
    return getWarranty().before( new Date() );
  }

  /** Doesn't expose how objects are stored in the fridge. */
  public synchronized void store( Object o ) {
    validateExpiration( o );

    // Can the object fit?
    if( canStore( o ) ) {
      getObjects().add( o );
    }
    else {
      throw FridgeFullException( o );
    }
  }

  /** Doesn't expose how objects are removed from the fridge. */
  public synchronized void remove( Object o ) {
    if( !getObjects().contains( o ) ) {
      throw new ObjectNotFoundException( o );
    }

    getObjects().remove( o );

    validateExpiration( o );
  }

  /** Lazily initialized list, an implementation detail. */
  private synchronized List getObjects() {
    if( this.list == null ) { this.list = new List(); }
    return this.list;
  }

  /** How object expiration is determined is also a detail. */
  private void validateExpiration( Object o ) {
    // Objects can answer whether they have gone past a given
    // expiration date. How each object "knows" it has expired
    // is a detail. The Fridge might use a scanner and
    // items might have embedded RFID chips. It's a detail hidden
    // by proper encapsulation.
    if( o implements Expires && ((Expires)o).expiresBefore( today ) ) {
      throw new ExpiredObjectException( o );
    }
  }

  /** This creates a copy of the warranty for immutability purposes. */
  private void setWarranty( Date warranty ) {
    assert warranty != null;
    this.warranty = new Date( warranty.getTime() )
  }
}

4
कृपया मेरे फ्रिज के उदाहरण को भी गंभीरता से न लें। :) एक असली फ्रिज को एक कंटेनर ऑब्जेक्ट होना चाहिए, मुझे यह जानने की उम्मीद है कि वस्तुओं को बिना किसी चिंता के कैसे रखा जा सकता है। IE यह एक ArrayList की तरह होगा। जैसा कि यह एक फ्रिज बनाता है, मान लें कि इसे संग्रहीत करने पर वस्तुओं को डिस्क में क्रमांकित किया जाता है ताकि वे सिस्टम विफलता से बच सकें। ठीक। मेरे फ्रिज उदाहरण को गंभीरता से लेते हुए।
विंस्टन इर्वर्ट

6
लेकिन क्या फ्रिज को समाप्ति की तारीखों का पता नहीं होना चाहिए, ताकि यह आपको बता सके कि पनीर खराब हो गया है और इसे बाहर फेंक दिया जाना चाहिए? :) ठीक है, हमें इसे रोकना होगा! :)
दिमा

10
फ्रिज लॉजिक की एक दिलचस्प चर्चा आपको यहाँ मिल रही है ...
मेसन व्हीलर

35
हाहा, मैं उसके लिए विज्ञापन देखना चाहता हूं: "यह एक बिलकुल नई किस्म का फ्रिज है: यह कुछ फेंकने की कोशिश करने पर आपके ऊपर चीजें फेंकता है! ऐसा नहीं है! इस तरह आप केवल एक बार कोशिश करेंगे! आपको चिंता होगी।" फ्रिज भराई, और फ्रिज अवैध व्यवहार के बारे में चिंता करते हैं! "
गैबलिन

42
उदाहरण में यह सब गलत है। कोई आयु क्षेत्र नहीं होना चाहिए और न ही एक सेट () विधि होनी चाहिए। किसी समय की तुलना में आयु व्यक्ति की जन्मतिथि का कार्य है। प्रतीत होता है कि मामूली बात है, यह वास्तव में वस्तुओं और अन्य खराब डिजाइनों की पूर्ण उत्परिवर्तन की आधुनिक प्रथा के साथ गलत है, जैसा कि निजी क्षेत्रों के लिए निर्धारित / निर्धारित विधियों द्वारा ध्यान से देखा जाता है कि वास्तव में क्या है, क्या क्षेत्र है, क्या वस्तु है इसके व्यवहारों के बारे में पता होना चाहिए और वास्तव में कौन से राज्य परिवर्तन मान्य हैं (कौन से सेटएक्स तरीके पूरी तरह से नष्ट हो जाते हैं)।
डेरेल टेग

41

जावा में गेटर्स और सेटर्स का मूल कारण बहुत सरल है:

  • आप केवल तरीकों को निर्दिष्ट कर सकते हैं , न कि फ़ील्ड्स, एक इंटरफ़ेस में।

इसलिए, यदि आप किसी फ़ील्ड को इंटरफ़ेस के पार जाने देना चाहते हैं, तो आपको एक रीडर और एक लेखक विधि की आवश्यकता होगी। इन्हें परंपरागत रूप से फ़ील्ड x के लिए गेटएक्स और सेटएक्स कहा जाता है।


44
वह एक भाषा सीमा है। असली सवाल यह है कि क्या हमें अन्य वस्तुओं को उस राज्य में हेरफेर करने की अनुमति देनी चाहिए।
विंस्टन इर्वर्ट

3
@Peter टर्नर, स्पष्ट रूप से कुछ भी नहीं है एक भाषा है जिसमें गुण शामिल इंटरफेस होने से रोकता है। कवर के तहत जिसे अच्छी तरह से गेटटर / सेटर के रूप में लागू किया जा सकता है, लेकिन गुणों के लिए इंटरफ़ेस परिभाषाओं के लिए समर्थन जोड़ना काफी आसान होगा।
विंस्टन एवर्ट

2
@ आइंस्टीन, आपको अंततः कक्षाओं को एक दूसरे के बीच सूचनाओं को पारित करने की अनुमति देने की आवश्यकता होगी, वास्तव में काम करने के लिए। इसके बजाय आप क्या सुझाव देंगे?

6
एक वस्तु को एक उच्च स्तरीय इंटरफ़ेस प्रदान करना है जो उसे जन्म देता है। गेटर्स और सेटर्स निम्न स्तर का इंटरफ़ेस होते हैं। उदाहरण के लिए, मान लीजिए कि आपके पास एक वर्ग है जो एक बाइनरी ट्री को लागू करता है। ट्री को नेविगेट करने के लिए आपके पास GetLeft (), GetRight (), GetValue (), और GetKey () जैसे कार्य हो सकते हैं। लेकिन यह पूरी तरह से गलत तरीका है। आपके बाइनरी ट्री क्लास में फाइंड, इंसर्ट, डिलीट जैसे ऑपरेशंस देने चाहिए।
विंस्टन इर्वर्ट 14

6
एक और उदाहरण लेने के लिए, टेट्रिस टुकड़े पर विचार करें। टेट्रिस पीस में कुछ आंतरिक स्थिति होती है जैसे ब्लॉक_टाइप, रोटेशन, स्थिति। आपके पास GetBlockType (), GetRotation (), GetPosition () जैसे गेटर्स हो सकते हैं। लेकिन तुम सच में नहीं करना चाहिए। आपके पास क्या होना चाहिए एक GetSquares () पद्धति है जो इस टुकड़े के कब्जे वाले सभी वर्गों की एक सूची देता है। आपके पास SetPosition () या SetRotation () जैसे सामान भी नहीं होने चाहिए। इसके बजाय, आपके पास MoveLeft (), MoveRight (), Rotate (), Fall () जैसे ऑपरेशन होने चाहिए।
विंस्टन एवर्ट ने

20

से http://www.adam-bien.com/roller/abien/entry/encapsulation_violation_with_getters_and

जावा शैली:

connection.setUser("dukie");
connection.setPwd("duke");
connection.initialize();

OO-शैली:

connection.connect("dukie","duke");

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

आपका सवाल यह है कि एक गेटटर / सेटर कब उचित है? शायद जब एक मोड परिवर्तन की आवश्यकता होती है, या आपको कुछ जानकारी के लिए किसी वस्तु से पूछताछ करने की आवश्यकता होती है।

myObject.GetStatus();
myObject.SomeCapabilitySwitch = true;

इसके बारे में सोचने पर, जब मैंने पहली बार C # में कोडिंग शुरू की, तो मैंने ऊपर बताई जावबाइन्स शैली में बहुत सारे कोड लिखे। लेकिन जैसा कि मैंने भाषा में अनुभव प्राप्त किया है, मैंने निर्माणकर्ता में सदस्यों की अधिक सेटिंग करना शुरू कर दिया है, और उन तरीकों का उपयोग कर रहा है जो उपरोक्त ओओओ शैली की तरह दिखते हैं।


6
"सभी तर्क को मापदंडों के रूप में क्यों दिया जाता है" ओओ-शैली क्यों है?

5
जबकि आपकी "OO- शैली" 2 या 3 विकल्पों के लिए ठीक है, मैं एक बार जब आप उस से ऊपर आता हूं तो मैं JavaBean शैली पसंद करूंगा। मापदंडों के हर संभव संयोजन के लिए 20 अतिभारित तरीके होने से बस भयानक लगता है
TheLQ

1
@ TheLQ: C # 4.0 कंस्ट्रक्टर और विधि कॉल में वैकल्पिक और नामित मापदंडों की अनुमति देकर इसे आसान बनाता है।
रॉबर्ट हार्वे

7
@ TheLQ धाराप्रवाह वाक्य रचना के साथ बिल्डर क्या है, उदाहरण के लिए अमरूद के MapMaker देखें
Maaartinus 16

5
@ Thorbjørn रावन एंडरसन, मैं कहूंगा कि "सभी तर्क को मापदंडों के रूप में दें" "JavaBean सेटर को कॉल करें" की तुलना में बेहतर OO- शैली है क्योंकि एक सेटर का अर्थ है कि एक अंतर्निहित विशेषता सेट की जा रही है, जो परिभाषा के अनुसार आंतरिक विवरण खो देता है। उदाहरण में कनेक्ट (..) विधि का उपयोग करना ऐसी कोई धारणा नहीं बनाता है; हो सकता है कि आप उपयोगकर्ता और पासवर्ड विशेषताएँ सेट करते हों, हो सकता है कि आप न करें। यह महत्वपूर्ण है कि आप सही OO अवधारणा पर ध्यान केंद्रित करें: "कनेक्ट" संदेश।
एंड्रेस एफ।

13

जब गेटर्स और सेटर जायज़ होते हैं?

जब व्यवहार "मिलता है" और "सेट" वास्तव में आपके मॉडल में व्यवहार से मेल खाता है, जो व्यावहारिक रूप से कभी नहीं होता है

प्रत्येक अन्य उपयोग केवल एक धोखा है क्योंकि व्यवसाय डोमेन का व्यवहार स्पष्ट नहीं है।

संपादित करें

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

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

वास्तविकता यह है कि यह अत्यधिक संभावना नहीं है कि आपके डोमेन स्थान में किसी भी सिस्टम में गेटर्स और सेटर हैं। आप उस पुरुष या महिला तक नहीं जा सकते हैं जो पेरोल के लिए ज़िम्मेदार है और बस "इस वेतन को एक्स पर सेट करें" या "मुझे यह वेतन प्राप्त करें " कहें । इस तरह का व्यवहार बस मौजूद नहीं है

यदि आप इसे अपने कोड में डाल रहे हैं तो आप अपने डोमेन के मॉडल से मिलान करने के लिए अपने सिस्टम को डिज़ाइन नहीं कर रहे हैं। हां जो इंटरफेस और एनकैप्सुलेशन को तोड़ता है, लेकिन वह बात नहीं है। मुद्दा यह है कि आप कुछ ऐसा कर रहे हैं जो मौजूद नहीं है।

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

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


इससे पहले किए गए 17 से अधिक बिंदुओं पर कुछ भी स्पष्ट रूप से नहीं दिया गया है और समझा जाता है
gnat

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

आपको क्या लगता है कि पेरोल के लिए इंटरफ़ेस क्या है अगर यह set/getवेतन नहीं है ?
विंस्टन एवर्ट

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

3
या इसे दूसरे तरीके से कहें, तो set_salary (new_salary, कर्मचारी_id) और अधिकृत_salary_update (कर्मचारी_कंट्रेक्ट, ऑथराइज़िंग_मैन) के बीच काफी अंतर है। प्रक्रिया को आंतरिक व्यापार प्रक्रिया को मॉडल करना चाहिए
कॉर्मैक मुल्हल

11

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

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


6
एक गेटटर और सेटर का मतलब है कि विशेषता, फ़ील्ड नहीं, इंटरफ़ेस का हिस्सा है। मान लें कि getBirthDate () और SetBirthDate () "yyyy / mm / dd" लेते हैं, लेकिन संग्रहित फ़ील्ड 01/01/1000 के बाद के दिनों की संख्या है। आप इसे 01/01/0001 में बदल सकते हैं और गेट्टर और सेटर इंटरफ़ेस को समान रखेंगे। विशेष रूप से क्योंकि 'पब्लिक' का अर्थ है सार्वजनिक रूप से ट्रैशबल, चर कभी सार्वजनिक नहीं होना चाहिए; हमेशा आने वाले मूल्य को मान्य करने के लिए एक सेटर का उपयोग करें, किसी भी संबंधित फ़ील्ड को अपडेट करें, आवश्यकतानुसार परिवर्तित करें, आंतरिक भंडारण परिवर्तन होने पर एक गेटर का उपयोग करने का प्रयास करें।
एंडी कैनफील्ड

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

3

क्या क्षेत्र प्रत्यक्ष रूप से या विधि के माध्यम से प्राप्य है, वास्तव में महत्वपूर्ण नहीं है।

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

और ठोस भाषाओं में (जैसे जावा) कारण हैं कि हमें उन तरीकों (इंटरफेस) की आवश्यकता क्यों है। और विधि का दूसरा कारण संगतता (स्रोत और बाइनरी) है। इसलिए उन्हें जोड़ना आसान है तो सोचें कि क्या सार्वजनिक क्षेत्र पर्याप्त होगा।

btw। मुझे सार्वजनिक अंतिम क्षेत्रों के साथ सरल अपरिवर्तनीय मूल्य धारण वर्गों का उपयोग करना पसंद है।


यह बहुत ही एकमात्र ऐसी चीज है जिसे टाला जाना चाहिए। फ़ील्ड से प्रॉपर्टी / गेटटर / सेटर पर जाना अधिकांश भाषाओं में एक परिवर्तन है।
मृदोसु

2

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


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

0

मेरा दृष्टिकोण यह है -

जब मुझे बाद में डेटा के साथ छेड़छाड़ की उम्मीद होती है, तो एक गेटटर / सेटर उचित होता है। इसके अलावा, यदि परिवर्तन हो रहा है, तो मैं अक्सर डेटा को गेटटर / सेटर में धकेल देता हूं।

यदि यह एक POD संरचना है, तो मैं उपलब्ध स्लॉट्स को छोड़ देता हूं।

अधिक सार स्तर पर, सवाल "डेटा का प्रबंधन कौन करता है", और यह परियोजना पर निर्भर करता है।


0

यदि गेटर्स और सेटर का उपयोग करना जटिल लगता है, तो समस्या भाषा हो सकती है, न कि अवधारणा।

यहाँ रूबी में लिखे गए दूसरे उदाहरण से कोड है :

class Fridge
  attr_accessor :cheese
end

def go_shopping fridge
  fridge.cheese += 5
end

ध्यान दें कि यह जावा में पहले उदाहरण की तरह दिखता है ? जब गेटर्स और सेटर को प्रथम श्रेणी के नागरिकों के रूप में माना जाता है, तो वे उपयोग करने के लिए एक घर का काम नहीं करते हैं, और जोड़ा लचीलापन कभी-कभी एक वास्तविक वरदान हो सकता है - उदाहरण के लिए, हम एक नए फ्रिज पर पनीर के लिए एक डिफ़ॉल्ट मान वापस करने का फैसला कर सकते हैं:

class Fridge
  attr_accessor :cheese

  def cheese
    @cheese || 0
  end
end

बेशक ऐसे कई चर होंगे जिन्हें सार्वजनिक रूप से बिल्कुल उजागर नहीं किया जाना चाहिए। आंतरिक चर को उजागर करने से अनावश्यक रूप से आपका कोड खराब हो जाएगा, लेकिन आप शायद ही इसे दोष दे सकते हैं।


जो खूबसूरती से कहा गया है। बिल्डर फ़ंक्शंस जोड़े गए क्योंकि हम धीरे-धीरे नुस्खा बनाते समय अपरिवर्तनीय वस्तुओं को बनाना चाहते हैं: शायद अगर आप कृत्रिम स्वीटनर जोड़ते हैं, तो आपको चीनी जोड़ने की आवश्यकता नहीं है। नामित मापदंडों का उपयोग करना, और यहां तक ​​कि ओवरलोडिंग के साथ, यह बहुत कठिन एक विधि है जो सभी कर रही है। और फिर बेशक जावा में मापदंडों का नाम नहीं है, इसलिए एक और कारण लोग बिल्डर पैटर्न का उपयोग कर रहे हैं।
योयो

0

एक Sizeवर्ग पर विचार करें जो चौड़ाई और ऊँचाई को अलग करता है। मैं कंस्ट्रक्टर का उपयोग करके बसने को समाप्त कर सकता हूं लेकिन यह कैसे मुझे आयत बनाने में मदद करता है Size? चौड़ाई और ऊंचाई वर्ग के लिए आंतरिक डेटा नहीं हैं; वे साझा किए गए डेटा हैं जो आकार के उपभोक्ताओं के लिए उपलब्ध होने चाहिए।

वस्तुओं में व्यवहार और अवस्था - या विशेषताएँ होती हैं। यदि कोई उजागर स्थिति नहीं है, तो केवल व्यवहार सार्वजनिक हैं।

राज्य के बिना, आप वस्तुओं के संग्रह को कैसे सॉर्ट करेंगे? आप किसी वस्तु के विशिष्ट उदाहरण की खोज कैसे करेंगे? यदि आप केवल कंस्ट्रक्टर का उपयोग करते हैं, तो तब क्या होता है जब आपके ऑब्जेक्ट में विशेषताओं की एक लंबी सूची होती है?

बिना सत्यापन के किसी भी विधि पैरामीटर का कभी भी सेवन नहीं किया जाना चाहिए। इसलिए यह लिखना आलस्य है:

setMyField(int myField){
    this.myField = myField;
}

यदि आप इसे इस तरह लिखते हैं तो आप सत्यापन के लिए सेटर का उपयोग करने के लिए कम से कम तैयार हैं; यह एक सार्वजनिक क्षेत्र से बेहतर है - लेकिन सिर्फ मुश्किल से। लेकिन कम से कम आपके पास एक सुसंगत सार्वजनिक इंटरफ़ेस है जिसे आप वापस आ सकते हैं और अपने ग्राहकों के कोड को तोड़ने के बिना सत्यापन नियमों में डाल सकते हैं।

गेटर्स, सेटर्स, प्रॉपर्टीज, म्यूटेटर, उन्हें कॉल करें जो आप करेंगे, लेकिन वे आवश्यक हैं।


लेकिन कम से कम आपके पास एक सुसंगत सार्वजनिक इंटरफ़ेस है जिसे आप वापस आ सकते हैं और अपने ग्राहकों के कोड को तोड़ने के बिना सत्यापन नियमों में डाल सकते हैं। यह सच नहीं है। सत्यापन नियमों को जोड़ना सड़क के नीचे बहुत अच्छी तरह से "आपके ग्राहकों के कोड को तोड़ सकता है"। intउदाहरण के लिए, एक उदाहरण चर लें , और कल्पना करें कि आप एक मान्य नियम जोड़ने का निर्णय लेते हैं जो केवल अप्रतिष्ठित मूल्यों को स्वीकार करता है। समस्या यह है कि आपके ग्राहक का कोड पहले से ही इसे नकारात्मक मान पर सेट करने की संभावना पर भरोसा कर सकता है ...
jub0bs

0

यदि गेटर्स और सेटर्स इनकैप्सुलेशन और सच्चे ओओ का उल्लंघन करते हैं, तो मैं गंभीरता से परेशानी में हूं।

मैंने हमेशा महसूस किया कि एक वस्तु जो भी सबसे अच्छी तरह से समझ में आता है कि आपको यह करने की आवश्यकता है।

मैंने अभी हाल ही में जावा में Mazes उत्पन्न करने वाले एक प्रोग्राम को लिखना समाप्त कर दिया है, और मेरे पास "भूलभुलैया वर्ग" का प्रतिनिधित्व करने वाला वर्ग है। मेरे पास इस वर्ग का डेटा है जो निर्देशांक, दीवारों और बुलियन आदि का प्रतिनिधित्व करता है।

मेरे पास इस डेटा को बदलने / हेरफेर / एक्सेस करने का कोई तरीका है! बिना गेटर्स और सेटर किए मैं क्या करूं? जावा संपत्तियों का उपयोग नहीं करता है और मेरे सभी डेटा को जो इस वर्ग के लिए स्थानीय है जनता के लिए निर्धारित है DEFINITELY एन्कैप्सुलेशन और OO का उल्लंघन है।


6
यहाँ सवाल है: यदि आपने उन सभी क्षेत्रों को सार्वजनिक कर दिया है, और गेटर्स का उपयोग करना बंद कर दिया है और आपका कोड अलग कैसे होगा?
विंस्टन एवरर्ट

सिद्धांत रूप में, इसकी नहीं। उस बिंदु पर भी क्लास क्यों करें? किसी भी चीज के साथ एक ही तर्क दिया जा सकता था। लेकिन मेरे नीचे की पोस्ट ने इसे और अधिक सुरुचिपूर्ण ढंग से कहा है। (गेटर्स और सेटर किसी वस्तु को सुरक्षित रूप से मान देने या उस वस्तु से मान प्राप्त करने का एक तरीका है।) पोस्ट आगे
बढ़ती है

3
मैं बताता हूं: वह पोस्टर अंततः मेरे साथ सहमत था और उस प्रभाव का एक और उत्तर पोस्ट किया था। अनिवार्य रूप से, गेटर्स और सेटर का उपयोग करना डेटा को सीधे हेरफेर करने के समान है। आप ऐसा करके वास्तव में OOness प्राप्त नहीं करते हैं। OO होने के लिए आपको डेटा को उच्च स्तरीय इंटरफ़ेस प्रदान करना चाहिए।
विंस्टन एवर्ट

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

2
कुछ मामलों में, गेटर्स एंड सेटर्स सबसे अच्छा तरीका है। कभी-कभी वे सबसे अच्छा इंटरफ़ेस हैं जो आप प्रदान कर सकते हैं। हालांकि, कई मामलों में वे नहीं हैं। कई मामलों में, आप कार्यान्वयन विवरण को अन्य वर्गों में लीक कर रहे हैं।
विंस्टन एवरर्ट

-1

सबसे पहले मोटे तौर पर दो तरह की वस्तुएं हैं जिन पर मैं टिप्पणी करूंगा, मूल्य और सेवा प्रकार।

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

मूल्य प्रकार भी अपरिवर्तनीय होना चाहिए, ओहर हाथ में ऐसे समय होते हैं जब यह व्यावहारिक नहीं होता है जैसे कि ओआरएम, या कुछ अन्य मैपिंग जैसे कि विजेट से वस्तु तक। अन्य सभी प्रकार के मूल्य जो सिस्टम के चारों ओर एक परत या भाग से दूसरे में जाते हैं, अपरिवर्तनीय होना चाहिए और इसमें बसने वाला नहीं होना चाहिए।


मैं एक तीसरे प्रकार का सुझाव देता हूं: एक परस्पर कंटेनर, जिसका उद्देश्य एक या एक से अधिक मूल्यों को धारण करना है; कई मामलों में, एक कंटेनर से तर्क या मान्यता के तरीके के बारे में बहुत अधिक उम्मीद नहीं की जानी चाहिए। कोड जिसे छह धनात्मक पूर्णांक की गणना करने के लिए विधि की आवश्यकता होती है, छः पूर्णांकों के लिए एक कंटेनर पास कर सकता है इस विधि में जो परिणाम को संग्रहीत करेगा। संख्याओं को सुनिश्चित करने के लिए ज़िम्मेदारी सकारात्मक है आमतौर पर या तो कॉलर या तथाकथित विधि के साथ झूठ होना चाहिए, कंटेनर के साथ नहीं।
सुपरकैट

-1

एक गेट्टर / सेटर किसी अन्य सार्वजनिक विधि की तरह ही उचित है। औचित्य मुख्य रूप से है क्योंकि हम बाहरी दुनिया को एक इंटरफ़ेस प्रदान करना चाहते हैं जो परिभाषित करता है कि हमारी कक्षा अन्य वर्गों के साथ कैसे बातचीत करती है। हम मुख्य रूप से ऐसा करते हैं क्योंकि हम अलग-अलग संस्थाओं के बीच युग्मन को कम करना चाहते हैं। कपलिंग कम करना कई कारणों से एक अच्छी बात है:

  • मैं अपने वर्तमान कोड से समान क्लास इंटरफ़ेस का उपयोग कर सकता हूं, हालांकि इस बीच उस क्लास ने नए तरीके जोड़े (लेकिन पुराने इंटरफ़ेस को संरक्षित किया)
  • उपभोक्ताओं को प्रभावित किए बिना किसी वर्ग के आंतरिक प्रतिनिधित्व को बदल सकते हैं
  • बग की संभावना कम करें: यदि आप अपने आंतरिक डेटा को निजी बनाते हैं, तो आप यह जान सकते हैं कि बाहरी कोड आपके आंतरिक डेटा के साथ गड़बड़ नहीं करेगा

-1

हां, गेटर्स एंड सेटर ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में एक एंटी-पैटर्न है और इसका उपयोग कभी नहीं किया जाना चाहिए : http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html । संक्षेप में, वे ऑब्जेक्ट-ओरिएंटेड प्रतिमान में फिट नहीं होते हैं क्योंकि वे आपको डेटा संरचना जैसी ऑब्जेक्ट का इलाज करने के लिए प्रोत्साहित करते हैं। जो एक बड़ी गलत धारणा है।


2
ऐसा लगता है कि बनाए गए कुछ बिंदुओं पर पर्याप्त रूप से कुछ नहीं दिया गया है और पूर्व 18 उत्तरों में समझाया गया है
gnat

4
यह भी कभी नहीं कहने के लिए थोड़ा मजबूत है ।
विंस्टन एवर्ट

-4

मुझे उम्मीद है कि आपके प्रोग्रामिंग भाषा ऑटो को विकसित करने वाली कंपनी द्वारा विकसित IDE "ऑब्जेक्ट ओरिएंटेशन के सिद्धांतों" का उल्लंघन नहीं करता है।

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

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

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


4
और क्या वास्तव में मैंने बहुत सारे कोड को सेटफू () और getFoo () के साथ जोड़कर हासिल किया है जो मैं चर के साथ सौदा करता हूं?
विंस्टन एवर्ट

7
यहाँ बात है, मुझे नहीं लगता कि आप इनकैप्सुलेशन प्राप्त करते हैं। आप अभी भी ऑब्जेक्ट की स्थिति को अन्य स्थानों से जोड़ रहे हैं। आप बस इसे और अधिक मौखिक रूप से कर रहे हैं। इनकैप्सुलेशन प्राप्त करने के लिए, आपको उस मूल्य के मालिक वर्ग में मूल्यों के हेरफेर को केंद्रीयकृत करना होगा। OO कपड़ों में कुछ और सिर्फ प्रक्रियात्मक कोड है। (इसके साथ जरूरी कुछ भी गलत नहीं है, लेकिन यह वही है)।
विंस्टन एवर्ट

2
एनकैप्सुलेशन का लाभ यह है कि विशेष मूल्यों से संबंधित सभी तर्क एक ही स्थान पर (अधिक या कम) हैं। मैं गेटर्स और सेटर के साथ नहीं मिलता। इसलिए, मुझे नहीं लगता कि मुझे उनके लिए बहुत लाभ मिलता है।
विंस्टन एवर्ट ने

1
हालाँकि, मैं इस बात से सहमत हूँ कि मेरे पास गेटर्स और सेटर्स के साथ कोड है और फिर पब्लिक एक्सेस के माध्यम से डेटा को स्वतंत्र रूप से हेरफेर करता है। इस तरह मैं कम से कम आने वाले डेटा के सत्यापन को संलग्न कर सकता हूं।
विंस्टन इर्वर्ट

3
मैं निश्चित रूप से वाचालता का प्रशंसक नहीं हूं। लेकिन मेरी आपत्ति वास्तव में ऐसे लोग हैं जो अपने चर को निजी बनाते हैं और फिर गेटर्स को बुलाते हैं और उन पर स्वतंत्र रूप से बहुत अधिक अंतर के साथ समाप्त होते हैं। यदि आप अपनी कक्षा के भीतर गेटर्स / सेटर का उपयोग करना चाहते हैं तो यह ठीक है। सवाल यह है कि क्यों? प्राथमिक लाभ जो मुझे पता है कि आप त्रुटियों को पकड़ने के लिए डेटा पर कुछ सत्यापन कर सकते हैं। यह तब कम मददगार होता है जब डेटा में हेरफेर करने वाले सभी कोड एक ही स्थान पर हों। लेकिन यह अभी भी मददगार हो सकता है। आदर्श रूप से, आपके पास एक भाषा है जो गुणों का समर्थन करती है और क्रिया-कलाप से बच सकती है।
विंस्टन एर्वर्ट

-4

मुझे लगा कि हमारे यहाँ और भी सामान्य उत्तर होंगे?

गेटर्स और सेटर सामान्य रूप से अत्यंत ओओपी हैं (किसी को भी कुछ भी कहना गलत है, सरल है)।

यद्यपि आपको इंजीनियर से अधिक नहीं याद रखने की आवश्यकता है, कभी भी एक ऐसा गटर या सेटर न बनाएं जिसकी आवश्यकता नहीं है। कोई भी जानकारी जिसे आप किसी अन्य वर्ग द्वारा उपयोग नहीं करने जा रहे हैं, उसके लिए आपके पास कोई गेट्टर या सेटर नहीं होना चाहिए।

हालाँकि, आप खेतों को सार्वजनिक क्यों नहीं करते हैं और इसके बजाय गेटर्स और सेटर ज्यादातर हैं:

  • खेतों का उपयोग करके उचित परीक्षण करना संभव नहीं है। उस संबंध में गेटर्स / सेटर बहुत बेहतर हैं।

  • एक वास्तविक समय प्रोग्रामिंग सेटिंग में फ़ील्ड्स को ठीक से उपयोग करना असंभव है। सिंक्रोनाइज्ड गेटर्स / सेटर्स जाने का रास्ता है।

  • इंटरफ़ेस विषय (पहले से ही समझाया तो मैं नहीं करूँगा)।

  • सिस्टम का पुन: उपयोग करते समय इसका उपयोग करना आसान है।

  • यह जानना बहुत कठिन है कि आप अपनी कक्षा का उपयोग किस कक्षा में कर रहे हैं और यदि आप गेट्टर / सेटर की तुलना में फ़ील्ड बदलते हैं तो क्या टूटेगा।

केवल उसी समय के लिए जब आप एक सरकारी क्षेत्र का उपयोग एक गटर / सेटर के बजाय करते हैं, जब आप एक आधिकारिक प्रोजेक्ट नहीं बनाते हैं, बल्कि केवल मज़े के लिए करते हैं और गेट्टर / सेटर के साथ परेशान नहीं कर सकते।


2
परीक्षण के लिए +1। चौंक गए कि पहले किसी ने इसका जिक्र नहीं किया। गुणों की एक और उपयोगी विशेषता उन्हें डिबगिंग कर रही है। (कोड में एक ब्रेकपॉइंट सम्मिलित करने के लिए बहुत आसान है। खेतों के लिए हार्डवेयर / मेमोरी ब्रेकप्वाइंट की आवश्यकता है)।
मार्क एच

9
गेटर्स और सेटरों पर आपत्ति यह है कि वे अक्सर भावना और इरादे की अनदेखी करते हुए ओओपी कानून के पत्र का पालन करने के लिए उपयोग किए जाते हैं। OOP का कहना है कि आपको अन्य वस्तुओं को अपने इंटर्ल्स के साथ मिलाने की अनुमति नहीं देनी चाहिए। यदि आप गेटर्स और सेटर्स को परिभाषित करते हैं जो आपको वैसे भी करते हैं, तो आप OOP का उल्लंघन करते हैं।
विंस्टन एवर्ट

6
मैं इस बात से सहमत हूँ कि साधारण सार्वजनिक क्षेत्रों में गेटर्स और सेटरर्स के कई लाभ हैं। हालांकि, मैं स्पष्ट नहीं हूं कि परीक्षण उनके साथ कैसे बेहतर है। क्या आप समझाएँगे?
विंस्टन इर्वर्ट

4
@ टिप्पणी: मैं आपके उत्तर से सहमत नहीं हूँ। आपको दो विकल्प प्रस्तुत करने लगते हैं: या तो गेटर्स / सेटर का उपयोग करना या खेतों को सार्वजनिक करना। लेकिन एक तीसरा विकल्प है: न तो गेटर्स / सेटर का उपयोग करना और न ही खेतों को उजागर करना! आपको आंतरिक क्षेत्र की स्थिति के लिए परीक्षण करने की आवश्यकता क्यों होगी? क्या आपको अपने ऑब्जेक्ट का सार्वजनिक API परीक्षण नहीं करना चाहिए?
एन्ड्रेस एफ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.