क्या अब भी हाथियों का एक ओओपी पर एनकैप्सुलेशन है?


97

एनकैप्सुलेशन मुझे बताता है कि सभी या लगभग सभी क्षेत्रों को निजी बनाएं और इन्हें गेटर्स / सेटर्स द्वारा उजागर करें। लेकिन अब इस तरह के रूप पुस्तकालयों लंबोक जो हमें एक छोटे से एनोटेशन द्वारा सभी निजी क्षेत्रों को बेनकाब करने के लिए अनुमति देते हैं दिखाई देते हैं @Data। यह सभी निजी क्षेत्रों के लिए निर्माण करने वाले, बसने और निर्माण करने वालों का निर्माण करेगा।

क्या कोई मुझे समझा सकता है कि सभी क्षेत्रों को निजी के रूप में छिपाने और उसके बाद कुछ अतिरिक्त तकनीक द्वारा सभी को उजागर करने का क्या मतलब है? हम केवल सार्वजनिक क्षेत्रों का उपयोग क्यों नहीं करते हैं? मुझे लगता है कि हम केवल शुरुआती बिंदु पर लौटने के लिए एक लंबा और कठिन रास्ता तय कर चुके हैं।

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

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


19
"It will create getters, setters and setting constructors for all private fields."- जिस तरह से आप इस उपकरण का वर्णन है, यह लग रहा है जैसे कि यह है कैप्सूलीकरण को बनाए रखने। (कम से कम एक ढीले, स्वचालित, कुछ एनीमिक-मॉडल अर्थ में।) तो वास्तव में समस्या क्या है?
डेविड

78
एनकैप्सुलेशन अपने सार्वजनिक अनुबंध (आमतौर पर, एक इंटरफ़ेस) के पीछे ऑब्जेक्ट के कार्यान्वयन इंटर्नल को छिपा रहा है। गेटर्स और सेटर इसके विपरीत कार्य करते हैं - वे ऑब्जेक्ट के इंटर्नल को उजागर करते हैं, इसलिए समस्या गेटर्स / सेटर्स में होती है, एनकैप्सुलेशन नहीं।

22
@VinceEmigh डेटा क्लासेस का कोई इनकैप्सुलेशन नहीं है । उनके उदाहरण बिल्कुल इस अर्थ में मूल्य हैं कि आदिम हैं
केल

10
JavaVeans का उपयोग करके @VinceEmigh OO नहीं है , यह प्रक्रियात्मक है । कि साहित्य उन्हें "वस्तु" कहता है, इतिहास की गलती है।
केलथ

28
मैंने वर्षों में इस पर बहुत विचार किया है; मुझे लगता है कि यह एक ऐसा मामला है जहां OOP का इरादा कार्यान्वयन से भिन्न था। स्मॉलटॉक का अध्ययन करने के बाद यह स्पष्ट है कि ओओपी के इनकैप्सुलेशन का उद्देश्य क्या था (अर्थात, प्रत्येक वर्ग एक स्वतंत्र कंप्यूटर की तरह, साझा प्रोटोकॉल के तरीकों के साथ), हालांकि अभी तक अज्ञात कारणों से, यह निश्चित रूप से इन बनाने के लिए लोकप्रियता में पकड़ा गया है गेटटर / सेटर ऑब्जेक्ट्स जो कोई वैचारिक एनकैप्सुलेशन प्रदान करते हैं (वे कुछ भी नहीं छिपाते हैं, कुछ भी नहीं प्रबंधित करते हैं, और डेटा के अलावा कोई जिम्मेदारी नहीं है), और फिर भी वे अभी भी गुणों का उपयोग करते हैं।
जूनियर

जवाबों:


82

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

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

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

संपादन

मैं चल रही चर्चाओं को देखने के बाद कई बातें जोड़ना चाहता हूं:

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

इसलिए अगर हम इस सवाल पर लौटते हैं कि हमें ऐसा क्यों करना चाहिए। इस सरल उदाहरण पर विचार करें:

public class Document {
    private String title;

    public String getTitle() {
        return title;
    }
}

public class SomeDocumentServiceOrHandler {

    public void printDocument(Document document) {
        System.out.println("Title is " + document.getTitle());
    }
}

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

public interface Printable {
    void print();
}

public final class PrintableDocument implements Printable {
    private final String title;

    public PrintableDocument(String title) {
        this.title = title;
    }

    @Override
    public void print() {
        System.out.println("Title is " + title);
    }
}

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


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
maple_shaft

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

एह, अभी भी आश्वस्त नहीं है। आपका उदाहरण ठीक है लेकिन कोडिंग की एक अलग शैली को निरूपित करें, न कि "सही सही" - जो मौजूद नहीं है। ध्यान रखें कि आजकल अधिकांश भाषाएं बहुपक्षीय हैं और शायद ही कभी शुद्ध OO कहां शुद्ध प्रक्रियात्मक हैं। अपने आप को "शुद्ध OO अवधारणाओं" के लिए इतनी कड़ी मेहनत करना। एक उदाहरण के रूप में - आप अपने उदाहरण पर DI का उपयोग नहीं कर सकते क्योंकि आपने मुद्रण तर्क को एक उपवर्ग में युग्मित किया था। मुद्रण एक दस्तावेज़ का हिस्सा नहीं होना चाहिए - एक PrintableDocument एक PrintService के लिए अपने प्रिंट करने योग्य भाग (एक गेट्टर के माध्यम से) को उजागर करेगा।
टी। सर

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

लब्बोलुआब यह है: गेटर्स एंड सेटर्स बुराई या ब्रेकिंग ओओपी नहीं हैं - जो लोग समझ नहीं पाते हैं कि उनका उपयोग कैसे किया जाए। आप उदाहरण के मामले में पूरी बात याद कर रहे लोगों का एक पाठ्यपुस्तक उदाहरण है कि DI कैसे काम करता है। उदाहरण जिसे आपने "सही" किया था, पहले से ही डीआई-सक्षम था, डिकॉप्ड किया गया था, आसानी से मजाक उड़ाया जा सकता है ... वास्तव में - पूरी तरह से याद रखें "इनहेरिटेंस पर प्राथमिकता दें" बात? OO स्तंभों में से एक? आपने जिस तरह से कोड को रीक्रिएट किया था, उसी तरह से आपने इसे खिड़की से फेंक दिया। यह किसी भी गंभीर कोड समीक्षा में उड़ान नहीं भरेगा।
टी। सर

76

क्या कोई मुझे समझा सकता है, सभी क्षेत्रों को निजी के रूप में छिपाने और उसके बाद कुछ अतिरिक्त प्रौद्योगिकी द्वारा उन सभी को उजागर करने का क्या मतलब है? हम केवल सार्वजनिक क्षेत्रों का उपयोग क्यों नहीं करते हैं?

भाव यह है कि आप ऐसा करने वाले नहीं हैं

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

है सिर्फ सभी क्षेत्रों getters और डिफ़ॉल्ट प्रति setters दे!

यह पूरी तरह से जावाबिन स्पेसिफिकेशन की भावना के खिलाफ है जो विडंबना है कि सार्वजनिक गेटर्स और सेटर की अवधारणा कहां से आती है।

लेकिन अगर आप कल्पना को देखते हैं, तो आप देखेंगे कि यह गेटर्स के निर्माण का इरादा रखता है और बहुत ही चयनात्मक होने के लिए बसता है, और यह "केवल पढ़ने के लिए" गुण (कोई सेटर) और "केवल लिखने के लिए" गुणों के बारे में बात करता है (नहीं गेटर)।

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

तो आप वहाँ हैं: एनकैप्सुलेशन का मतलब है कि आप केवल उस कार्यक्षमता को उजागर करते हैं जिसे आपको वास्तव में उजागर करने की आवश्यकता है। लेकिन अगर आप इस बारे में नहीं सोचते हैं कि आपको क्या उजागर करने की आवश्यकता है और सिर्फ विली-नीली कुछ वाक्यात्मक परिवर्तन का अनुसरण करके सब कुछ उजागर करता है, तो निश्चित रूप से यह वास्तव में एनकैप्सुलेशन नहीं है।


20
"[जी] एटर और सेटर जरूरी सरल उपयोग नहीं हैं" - मुझे लगता है कि यह एक महत्वपूर्ण बिंदु है। यदि आपका कोड नाम से फ़ील्ड एक्सेस कर रहा है, तो आप बाद में व्यवहार नहीं बदल सकते। यदि आप obj.get () का उपयोग कर रहे हैं, तो आप कर सकते हैं।
डैन एम्ब्रोगियो

4
@jrh: मैंने कभी नहीं सुना है कि इसे जावा में एक बुरा अभ्यास कहा जाता है, और यह बहुत आम है।
माइकल बोर्गवर्ड 14

2
@MichaelBorgwardt दिलचस्प; विषय से थोड़ा हटकर लेकिन मैंने हमेशा सोचा है कि Microsoft ने C # के लिए ऐसा करने की सिफारिश क्यों की। मुझे लगता है कि उन दिशानिर्देशों का यह अर्थ है कि C # में केवल एक ही चीज़ का इस्तेमाल किया जा सकता है, जो किसी अन्य मूल्य को आंतरिक रूप से उपयोग किए गए मान को परिवर्तित करने में परिवर्तित हो रहा है, एक तरह से जो विफल हो सकता है या एक अमान्य मूल्य हो सकता है (उदाहरण के लिए, एक स्थिती संपत्ति और एक स्थिति-गुण संपत्ति जहाँ यह स्वचालित रूप से मिमी में आंतरिक रूप से परिवर्तित होता है)? एक महान उदाहरण नहीं है, लेकिन यह सबसे अच्छा मैं इस समय के साथ आ सकता है।
jrh 15

2
@jr वह स्रोत गेटर्स के लिए ऐसा नहीं करने के लिए कहता है, जैसा कि बसने वालों का विरोध है।
कप्तान मैन

3
@ गंगनुस और आप वास्तव में देखते हैं कि कोई गेट्टर / सेटर के अंदर कुछ तर्क छिपा रहा है? हम इसके लिए इतने अभ्यस्त हैं कि getFieldName()हमारे लिए एक स्वचालित अनुबंध बन जाते हैं। हम उसके पीछे कुछ जटिल व्यवहार की उम्मीद नहीं करेंगे। ज्यादातर मामलों में यह सीधे एनकैप्सुलेशन का टूटना है।
इज़बासर टोलगेन

17

मुझे लगता है कि आपकी टिप्पणी से मामले की जड़ स्पष्ट हो गई है:

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

आपके पास समस्या यह है कि आप सक्रिय डेटाटोडेल के साथ दृढ़ता डेटामोडेल का मिश्रण कर रहे हैं ।

एक आवेदन में आम तौर पर कई डेटामॉडल होंगे:

  • डेटाबेस से बात करने के लिए एक डेटामॉडल,
  • कॉन्फ़िगरेशन फ़ाइल को पढ़ने के लिए एक datamodel,
  • किसी अन्य एप्लिकेशन से बात करने के लिए एक डेटामॉडल,
  • ...

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

सामान्य तौर पर, बाहर के साथ संचार के लिए उपयोग किए जाने वाले डेटामोडल्स को आंतरिक डेटामॉडल (व्यावसायिक ऑब्जेक्ट मॉडल, बीओएम) से पृथक और स्वतंत्र होना चाहिए , जिस पर गणना की जाती है:

  • स्वतंत्र : ताकि आप सभी ग्राहकों / सर्वरों को बदलने के बिना अपनी आवश्यकताओं के अनुसार BOM पर गुणों को जोड़ / हटा सकें, ...
  • पृथक : ताकि BOM पर सभी संगणनाएँ की जाती हैं, जहाँ अपरिवर्तनीय लोग रहते हैं, और जो एक सेवा से दूसरी सेवा में बदलते रहते हैं, या एक सेवा को अपग्रेड करते हैं, कोडबेस में रिपल का कारण नहीं बनता है।

इस परिदृश्य में, संचार परतों में उपयोग की जाने वाली वस्तुओं के लिए यह पूरी तरह से ठीक है कि सभी आइटम सार्वजनिक हों या गेटर्स / सेटर्स द्वारा उजागर किए जाएं। वे सादे वस्तुएं हैं जिनमें कोई अपरिवर्तनीय नहीं है।

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


3
मैं संचार वस्तुओं के लिए गेटर्स और सेटर नहीं बनाऊंगा। मैं सिर्फ खेतों को सार्वजनिक करूंगा। उपयोगी से अधिक कार्य क्यों बनाएं?
इबिबिस

3
@ मिनीबिस: मैं सामान्य रूप से सहमत हूं, हालांकि ओपी द्वारा ध्यान दिया गया है कि कुछ रूपरेखाओं के लिए गेटर्स / सेटर की आवश्यकता होती है, जिस स्थिति में आपको बस अनुपालन करना होगा। ध्यान दें कि ओपी एक पुस्तकालय का उपयोग कर रहा है जो उन्हें एकल विशेषता के अनुप्रयोग के साथ स्वचालित रूप से बनाता है, इसलिए यह उसके लिए बहुत कम काम है।
मैथ्यू एम।

1
@ गैंग्नस: यहां विचार यह है कि गेटर्स / सेटर सीमा (I / O) परत से अलग हो जाते हैं, जहां गंदा होना सामान्य है, लेकिन बाकी एप्लिकेशन (शुद्ध कोड) दूषित नहीं है और सुरुचिपूर्ण रहता है।
मैथ्यू एम।

2
@kubanczyk: आधिकारिक परिभाषा बिजनेस ऑब्जेक्ट मॉडल है जहाँ तक मुझे पता है। यह यहाँ से मेल खाता है जिसे मैंने "इनर डाटामोडेल" कहा है, जिस डेटाटोडेल को आप अपने आवेदन के "शुद्ध" कोर में तर्क को निष्पादित करते हैं।
मथिउ एम।

1
यह व्यावहारिक दृष्टिकोण है। हम एक संकर दुनिया में रहते हैं। अगर बाहरी पुस्तकालयों को पता चल सकता है कि BOM कंस्ट्रक्टर्स को क्या डेटा पास करना है, तो हमारे पास केवल BOMs होंगे।
एड्रियन इफोड

12

निम्नलिखित को धयान मे रखते हुए..

आपके पास Userएक संपत्ति वाला एक वर्ग है int age:

class User {
    int age;
}

आप इसे Userजन्म देना चाहते हैं, इसलिए जन्म की तारीख केवल एक उम्र के विपरीत है। एक गटर का उपयोग करना:

class User {
    private int age;

    public int getAge() {
        return age;
    }
}

हम int ageऔर अधिक जटिल के लिए क्षेत्र को स्वैप कर सकते हैं LocalDate dateOfBirth:

class User {
    private LocalDate dateOfBirth;

    public int getAge() {
        LocalDate now = LocalDate.now();
        int year = ...; // calculate using dateOfBirth and now
        return year;
    }

    // other behaviors can now make use of dateOfBirth
}

कोई अनुबंध उल्लंघन नहीं, कोई कोड टूटना नहीं .. अधिक जटिल व्यवहार की तैयारी में आंतरिक प्रतिनिधित्व को स्केल करने से ज्यादा कुछ नहीं।

क्षेत्र खुद ही ध्वस्त हो गया है।


अब, चिंताओं को दूर करने के लिए ।।

लोम्बोक का @Dataएनोटेशन कोटलिन के डेटा वर्गों के समान है ।

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

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

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

क्या आप निष्कर्ष निकालेंगे कि सेम के उपयोग के कारण उद्यम विकास खराब है? बिलकूल नही! आवश्यकताएं मानक विकास से भिन्न होती हैं। क्या सेम का दुरुपयोग किया जा सकता है? बेशक! वे हर समय दुर्व्यवहार कर रहे हैं!

लोम्बोक भी समर्थन करता है @Getterऔर @Setterस्वतंत्र रूप से - अपनी आवश्यकताओं के लिए कॉल का उपयोग करें।


2
यह @Dataएक प्रकार पर एनोटेशन को थप्पड़ मारने के लिए असंबंधित है , जो डिजाइन द्वारा सभी क्षेत्रों को
अनएकेप्सुलेट

1
नहीं, खेत छिपे नहीं हैं । क्योंकि कुछ भी हो सकता है औरsetAge(xyz)
Caleth

9
@ कैलेथ खेतों में छिपे हुए हैं। आप ऐसा कार्य कर रहे हैं जैसे कि बसने वालों के पास पूर्व और बाद की स्थिति नहीं हो सकती है, जो कि बसने वालों का उपयोग करने के लिए एक बहुत ही सामान्य उपयोग मामला है। आप ऐसा कार्य कर रहे हैं जैसे कि कोई फ़ील्ड == प्रॉपर्टी, जो कि सी # जैसी भाषाओं में भी, बस सच नहीं है, क्योंकि दोनों का समर्थन किया जाता है (जैसा कि सी # में)। फ़ील्ड को दूसरी कक्षा में ले जाया जा सकता है, इसे और अधिक जटिल प्रतिनिधित्व के लिए स्वैप किया जा सकता है ...
विंस एमिग

1
और जो मैं कह रहा हूं, वह महत्वपूर्ण नहीं है
Caleth

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

11

एनकैप्सुलेशन मुझे बताता है कि सभी या लगभग सभी क्षेत्रों को निजी बनाएं और इन्हें गेटर्स / सेटर्स द्वारा उजागर करें।

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

एनकैप्सुलेशन इसलिए सूचना छिपाने का एक विशेष मामला है, जिसमें प्रत्येक वस्तु अपने आंतरिक को छिपाती है और अपने आक्रमणकारियों को सक्रिय करती है।

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

क्या कोई मुझे समझा सकता है कि सभी क्षेत्रों को निजी के रूप में छिपाने और उसके बाद कुछ अतिरिक्त तकनीक द्वारा सभी को उजागर करने का क्या मतलब है? हम केवल सार्वजनिक क्षेत्रों का उपयोग क्यों नहीं करते हैं? मुझे लगता है कि हम केवल शुरुआती बिंदु पर लौटने के लिए एक लंबा और कठिन रास्ता तय कर चुके हैं।

आंशिक रूप से, यह एक ऐतिहासिक दुर्घटना के कारण है। स्ट्राइक एक यह है कि, जावा में, विधि इनवोकेशन एक्सप्रेशन और फील्ड एक्सेस एक्सप्रेशंस कॉल साइट पर वाक्यात्मक रूप से भिन्न होते हैं, अर्थात एक गेट्टर या सेटर कॉल द्वारा फ़ील्ड एक्सेस को प्रतिस्थापित करने से किसी क्लास का API टूट जाता है। इसलिए, यदि आपको एक एक्सेसर की आवश्यकता हो सकती है, तो आपको अभी एक लिखना होगा, या एपीआई को तोड़ने में सक्षम होना चाहिए। भाषा-स्तर की संपत्ति समर्थन की अनुपस्थिति अन्य आधुनिक भाषाओं के विपरीत है, सबसे विशेष रूप से C # और EcmaScript

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

इसने कहा, @Dataलोम्बोक जनरेटर्स / सेटर जनरेट करने से अधिक है: यह भी उत्पन्न करता है toString(), hashCode()और equals(Object), जो काफी मूल्यवान हो सकता है।

और क्या वास्तव में अब वास्तविक जीवन प्रोग्रामिंग में एनकैप्सुलेशन का कोई मतलब है?

एनकैप्सुलेशन अमूल्य या पूरी तरह से बेकार हो सकता है, यह ऑब्जेक्ट के एनकैप्सुलेट होने पर निर्भर करता है। आम तौर पर, वर्ग के भीतर तर्क जितना जटिल होगा, एनकैप्सुलेशन का लाभ उतना ही अधिक होगा।

प्रत्येक क्षेत्र के लिए स्वचालित रूप से उत्पन्न गेटर्स और सेटर आमतौर पर अत्यधिक उपयोग किए जाते हैं, लेकिन विरासत फ्रेमवर्क के साथ काम करने के लिए उपयोगी हो सकते हैं, या खेतों के लिए समर्थित नहीं होने वाले सामयिक ढांचे की सुविधा का उपयोग करने के लिए।

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

सारांश

गेटर्स / सेटर्स खराब इनकैप्सुलेशन प्रदान करते हैं।

जावा में गेटर्स / सेटर की व्यापकता गुणों के लिए भाषा स्तर के समर्थन की कमी से उपजी है, और इसके ऐतिहासिक घटक मॉडल में संदिग्ध डिजाइन विकल्प जो कई शिक्षण सामग्री और उनके द्वारा सिखाए गए प्रोग्रामर में निहित हो गए हैं।

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


1
अपने आक्रमणकारियों को लागू करता है? क्या यह अंग्रेजी है? क्या आप इसे किसी गैर-अंग्रेज को समझा सकते हैं, कृपया? बहुत जटिल नहीं है - यहाँ कुछ लोग अंग्रेजी अच्छी तरह से नहीं जानते हैं।
गंगनुस

मुझे आपका आधार पसंद है, मुझे आपके विचार (+1) पसंद हैं, लेकिन व्यावहारिक परिणाम नहीं। मैं बल्कि प्रतिबिंब द्वारा उनके लिए डेटा लोड करने के लिए निजी क्षेत्र और कुछ विशेष पुस्तकालय का उपयोग करूंगा। मुझे केवल यह समझ में नहीं आता कि आप अपना जवाब मेरे खिलाफ तर्क के रूप में क्यों दे रहे हैं?
गंगनुस

@Gangnus एक अपरिवर्तनीय तार्किक स्थिति है जो बदलती नहीं है (in- meaning not और -variant अर्थ भिन्न / बदलता है)। कई कार्यों में ऐसे नियम होते हैं, जिन्हें निष्पादित करने से पहले और बाद में सही होना चाहिए (जिन्हें पूर्व-स्थितियां और बाद की स्थिति कहा जाता है) और कोड में कोई त्रुटि है। उदाहरण के लिए किसी फ़ंक्शन के लिए यह आवश्यक हो सकता है कि उसका तर्क शून्य (एक पूर्व-स्थिति) न हो और अपवाद को फेंक सकता है यदि उसका तर्क शून्य है, क्योंकि उस मामले को कोड में त्रुटि होगी (अर्थात कंप्यूटर विज्ञान में बोलें, कोड ने तोड़ा है अपरिवर्तनीय)।
फराट

@ गैंगस: निश्चित रूप से नहीं जहां प्रतिबिंब इस चर्चा में प्रवेश करता है; लोम्बोक एक एनोटेशन प्रोसेसर है, अर्थात जावा कंपाइलर के लिए एक प्लगइन जो संकलन के दौरान अतिरिक्त कोड का उत्सर्जन करता है। लेकिन यकीन है, आप लोबोक का उपयोग कर सकते हैं। मैं सिर्फ यह कह रहा हूं कि कई मामलों में, सार्वजनिक क्षेत्र बस के रूप में अच्छी तरह से काम करते हैं, और स्थापित करने में आसान होते हैं (सभी संकलक एनोटेशन प्रोसेसर का स्वचालित रूप से पता लगाते हैं ...)।
मेरिटॉन

1
@ गैंग्नस: गणित और सीएस में आक्रमणकारी समान हैं, लेकिन सीएस में एक अतिरिक्त परिप्रेक्ष्य है: किसी वस्तु के परिप्रेक्ष्य से, आक्रमणकारियों को लागू और स्थापित किया जाना चाहिए। उस वस्तु के एक कॉलर के दृष्टिकोण से, आक्रमणकारी हमेशा सच होते हैं।
Meriton

7

मैंने खुद से यह सवाल पूछा है।

हालांकि यह पूरी तरह सच नहीं है। गेट बीन विनिर्देशन के कारण गेटर्स / सेटर आईएमओ की व्यापकता होती है, जिसके लिए इसकी आवश्यकता होती है; तो यह बहुत ओरिएंटेड प्रोग्रामिंग नहीं बल्कि बीन ओरिएंटेड प्रोग्रामिंग की एक विशेषता है, यदि आप करेंगे। दोनों के बीच का अंतर यह है कि वे अमूर्त परत में मौजूद हैं; बीन्स एक उच्चतर परत पर, एक सिस्टम इंटरफेस के अधिक हैं। वे OO ग्राउंडवर्क से अमूर्त होते हैं, या कम से कम - हमेशा की तरह, चीजों को बहुत दूर अक्सर संचालित किया जा रहा है।

मैं कहूंगा कि यह कुछ दुर्भाग्यपूर्ण है कि यह बीन चीज़ जो जावा प्रोग्रामिंग में सर्वव्यापी है, एक संगत जावा लैंग्वेज फीचर के अलावा नहीं है - मैं C # में प्रॉपर्टीज़ कॉन्सेप्ट की तरह कुछ सोच रहा हूं। जो लोग इसके बारे में नहीं जानते हैं, उनके लिए यह एक भाषा निर्माण है जो इस तरह दिखता है:

class MyClass {
    string MyProperty { get; set; }
}

वैसे भी, वास्तविक कार्यान्वयन की नॉटी-ग्रिट्टी अभी भी एनकैप्सुलेशन से बहुत लाभ उठाती है।


पायथन में एक समान विशेषता है, जिसमें गुणों में पारदर्शी गेटर्स / सेटर हो सकते हैं। मुझे यकीन है कि और भी भाषाएँ हैं, समान विशेषताएँ भी हैं।
JAB

1
"गेटर्स / सेटर्स IMO का प्रसार जावा बीन विनिर्देशन के कारण होता है, जिसके लिए इसकी आवश्यकता होती है" हाँ, आप सही हैं। और किसने कहा कि इसकी आवश्यकता होनी चाहिए? कारण, कृपया?
गंगनुस

2
सी # रास्ता बिलकुल उस लोम्बोक जैसा ही है। मुझे कोई वास्तविक अंतर दिखाई नहीं दे रहा है। अधिक व्यावहारिक सुविधा, लेकिन स्पष्ट रूप से गर्भाधान में बुरा।
गंगनुस

1
@ गैंगनिस विनिर्देश को इसकी आवश्यकता है। क्यों? एक ठोस उदाहरण के लिए मेरे जवाब की जाँच करें कि गेटर्स फ़ील्ड को उजागर करने के समान क्यों नहीं हैं - बिना गेट्टर के समान प्राप्त करने का प्रयास करें।
विंस एमिग

@VinceEmigh gangnUs, कृपया :-)। (गैंग-वॉकिंग, नेस - अखरोट)। और केवल उस जगह का उपयोग करने / सेट करने के बारे में क्या है जहां हमें विशेष रूप से इसकी आवश्यकता है, और अन्य मामलों में प्रतिबिंब द्वारा निजी क्षेत्रों में बड़े पैमाने पर लोड हो रहा है?
गंगनुस

6

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

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

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

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

यहाँ छवि विवरण दर्ज करें

उदाहरण बीन्स का उपयोग करना

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

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

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


2
सबसे ठोस और बुद्धिमान विचार। +1। लेकिन वर्गों के एक समूह को लिखने के लिए क्यों नहीं, जिनमें से हर एक व्यक्तिगत रूप से कुछ बाहरी संरचना से / के लिए निजी क्षेत्रों को लोड / बचाएगा? JSON, XML, अन्य ऑब्जेक्ट। यह पीओजेओ के साथ काम कर सकता है या हो सकता है, केवल खेतों के साथ, इसके लिए एक एनोटेशन द्वारा चिह्नित किया गया हो। अब मैं उस विकल्प के बारे में सोच रहा हूं।
गंगनुस

@Gangnus एक अनुमान के अनुसार क्योंकि इसका मतलब है कि बहुत सारे अतिरिक्त कोड लेखन। यदि प्रतिबिंब का उपयोग किया जाता है, तो क्रमबद्धता कोड के केवल एक गांठ को लिखना होगा और यह किसी भी वर्ग को अनुक्रमित कर सकता है जो विशिष्ट पैटर्न का अनुसरण करता है। C # [Serializable]इसका विशेषता और उसके रिश्तेदारों के माध्यम से समर्थन करता है । 101 विशिष्ट क्रमांकन विधियाँ / कक्षाएं क्यों लिखें जब आप केवल एक प्रतिबिंब का उपयोग करके लिख सकते हैं?
12

@Pharap मुझे बहुत खेद है, लेकिन आपकी टिप्पणी मेरे लिए बहुत छोटी है। "लीवरेजिंग प्रतिबिंब?" और इतनी अलग-अलग चीजों को एक कक्षा में छिपाने का क्या मतलब है? क्या आप बता सकते हैं कि आपका क्या मतलब है?
गंगनुस

@ गैंगनुस का मतलब है प्रतिबिंब , कोड की अपनी संरचना का निरीक्षण करने की क्षमता। जावा (और अन्य भाषाओं) में आप उन सभी कार्यों की एक सूची प्राप्त कर सकते हैं, जिन्हें एक वर्ग उजागर करता है और फिर उन डेटा को कक्षा से निकालने के तरीके के रूप में उपयोग करता है जो इसे क्रमबद्ध करने के लिए आवश्यक हैं जैसे कि XML / JSON। प्रति-वर्ग आधार पर संरचनाओं को बचाने के लिए लगातार नए तरीकों को बनाने के बजाय एक बार का काम होगा कि प्रतिबिंब का उपयोग करना। यहाँ एक सरल जावा उदाहरण है
फराट

@ छपरा वही है जिसके बारे में मैं बात कर रहा था। लेकिन आप इसे "लीवरेजिंग" क्यों कहते हैं? और जो विकल्प मैंने पहली टिप्पणी में यहाँ बताया है वह रहता है - (अन) पैक्ड फ़ील्ड में विशेष एनोटेशन हैं या नहीं?
गंगनुस

5

बिना गेटर्स के हम कितना काम कर सकते हैं? क्या उन्हें पूरी तरह से निकालना संभव है? यह क्या समस्याएं पैदा करता है? क्या हम returnकीवर्ड पर प्रतिबंध लगा सकते हैं?

यह पता चला है कि यदि आप काम करने के इच्छुक हैं तो आप बहुत कुछ कर सकते हैं। तब कैसे जानकारी कभी इस पूरी तरह से समझाया वस्तु से बाहर निकलता है? एक सहयोगी के माध्यम से।

कोड बताने के बजाय आप सवाल पूछते हैं कि आप चीजों को करने के लिए चीजें बताते हैं। अगर वे चीजें भी वापस नहीं आती हैं तो आपको कुछ भी करने की जरूरत नहीं है। इसलिए जब आप returnइसके बजाय कुछ आउटपुट पोर्ट सहयोगी के लिए पहुंचने की कोशिश कर रहे हैं, तो जो भी करना बाकी है, वह करेंगे।

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

लाभ यह है कि अब आप इंटरफ़ेस के सामने अपनी बात कर रहे हैं। इसका मतलब आपको अमूर्तता का पूरा लाभ मिलता है।

यह आपको बहुरूपी प्रेषण भी देता है, क्योंकि जब आप जानते हैं कि आप क्या कह रहे हैं तो आपको यह जानने की जरूरत नहीं है कि आप वास्तव में क्या कह रहे हैं।

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

यह इस तरह लग सकता है:

यहां छवि विवरण दर्ज करें

class Interactor implements InputPort {
    OutputPort out;
    int y = 0;

    Interactor(OutputPort out){
        this.out = out;
    }

    void accumulate(int x) {
        y = y + x;
        out.showAsImage(y);
    }
}

यदि आप उस तरह कोड कर सकते हैं तो गेटर्स का उपयोग करना एक विकल्प है। आवश्यक बुराई नहीं है।


हां, ऐसे गेटर्स / सेटर्स में बहुत समझदारी है। लेकिन क्या आप समझते हैं कि यह किसी और चीज के बारे में है? :-) +1 वैसे भी।
गंगानुस

1
@Gangnus धन्यवाद। वहाँ चीजों का एक गुच्छा है जिसके बारे में आप बात कर सकते हैं। अगर आपको कम से कम नाम की परवाह है तो मैं उनमें जा सकता हूं।
कैंडिड_ऑरेंज

5

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

सार्वजनिक क्षेत्रों के बजाय गेटर्स और सेटर का उपयोग क्यों करें?

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

लेकिन अगर गेटटर / सेटर सिर्फ एक अंतर्निहित निजी क्षेत्र को दर्शाता है तो क्या यह उतना बुरा नहीं है?

नहीं! मुद्दा यह है कि एनकैप्सुलेशन आपको ग्राहकों को प्रभावित किए बिना कार्यान्वयन को बदलने की अनुमति देता है। एक क्षेत्र अभी भी मूल्य को संग्रहीत करने के लिए एक पूरी तरह से ठीक तरीका हो सकता है, जब तक कि ग्राहकों को जानने या देखभाल करने की आवश्यकता नहीं होती है।

लेकिन इनकैप्सुलेशन को तोड़ने वाले फ़ील्ड से गेट्स / सेटर को ऑटोजेनरेट नहीं कर रहा है?

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

लेकिन कुछ लोग कहते हैं कि गटर / सेटर हमेशा खराब होते हैं!

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


एनकैप्सुलेशन से हमें बहुरूपता और सुरक्षा की अनुमति मिलनी चाहिए। हो जाता है / सेट firs की अनुमति देते हैं, लेकिन दूसरे के खिलाफ दृढ़ता से हैं।
गंगनुस

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

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

2
@jrh: मुझे नहीं पता कि क्या कोई औपचारिक स्पष्टीकरण है जैसे कि, लेकिन C # में गुणों के लिए अंतर्निहित समर्थन (गेटर्स / सेटर एक अच्छे सिंटैक्स के साथ) और उन गुमनाम प्रकारों के लिए है जो केवल गुणों और बिना किसी व्यवहार के प्रकार हैं। इसलिए C # के डिजाइनरों ने मैसेजिंग रूपक और "बताओ, मत पूछो" सिद्धांत से जानबूझकर विचलन किया है। संस्करण 2.0 के बाद से C # का विकास पारंपरिक OO शुद्धता की तुलना में कार्यात्मक भाषाओं से अधिक प्रेरित है।
जैक्सबी

1
@ जेआरएच: मैं अब अनुमान लगा रहा हूं, लेकिन मुझे लगता है कि सी # कार्यात्मक भाषाओं से काफी प्रेरित है जहां डेटा और संचालन अधिक अलग हैं। वितरित आर्किटेक्चर में, परिप्रेक्ष्य भी संदेश-उन्मुख (RPC, SOAP) से डेटा-उन्मुख (REST) ​​में स्थानांतरित हो गया है। और डेटाबेस जो डेटा ("ब्लैक बॉक्स" ऑब्जेक्ट्स) को उजागर और संचालित करते हैं, प्रबल हो गए हैं। संक्षेप में, मुझे लगता है कि ब्लैक बॉक्स के बीच संदेशों से उजागर डेटा मॉडल पर ध्यान केंद्रित किया गया है
जैक्सबी

3

एनकैप्सुलेशन का एक उद्देश्य होता है, लेकिन इसका दुरुपयोग या दुरुपयोग भी किया जा सकता है।

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

दूसरी ओर, POD या सादे पुराने डेटा प्रकार, जैसे C / C ++ की एक संरचना जिसमें सभी क्षेत्र सार्वजनिक हैं, उपयोगी हो सकते हैं। लोनोक में @data एनोटेशन द्वारा उत्पन्न लोगों की तरह बेकार गेटर्स / सेटर करना "एनकैप्सुलेशन पैटर्न" रखने का एक तरीका है। जावा में "बेकार" गेटर्स / सेटर करने वाले कुछ कारणों में से एक यह है कि विधियां एक अनुबंध प्रदान करती हैं

जावा में, आपके पास इंटरफ़ेस में फ़ील्ड नहीं हो सकते हैं, इसलिए आप एक सामान्य संपत्ति निर्दिष्ट करने के लिए गेटर्स और सेटर का उपयोग करते हैं जो उस इंटरफ़ेस के सभी कार्यान्वयनकर्ताओं के पास है। कोटलिन या सी # जैसी अधिक हालिया भाषाओं में हम संपत्तियों की अवधारणा को उन क्षेत्रों के रूप में देखते हैं जिनके लिए आप एक सेटर और गटर की घोषणा कर सकते हैं। अंत में, बेकार गेटर्स / सेटर एक विरासत के अधिक होते हैं जो जावा के साथ रहना पड़ता है, जब तक कि ओरेकल इसके गुणों को जोड़ता नहीं है। उदाहरण के लिए, Kotlin, जो JetBrains द्वारा विकसित एक और JVM भाषा है, में डेटा वर्ग हैं जो मूल रूप से @data एनोटेशन लोम्बोक में करते हैं।

यहाँ भी कुछ उदाहरण हैं:

class DataClass 
{
    private int data;

    public int getData() { return data; }
    public void setData(int data) { this.data = data; } 
}

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

class DataClass implements IDataInterface
{
    private int data;

    @Override public int getData() { return data; }
    @Override public void setData(int data) { this.data = data; }
}

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

void doSomethingWithData(IDataInterface data) { data.setData(...); }

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

मान लीजिए कि आपके पास एक खिलाड़ी वर्ग है जो एनकैप्सुलेशन का उपयोग करता है और 1 इकाई द्वारा अपनी स्थिति को स्थानांतरित करना चाहता है। कोड इस तरह दिखेगा:

player.setPosX(player.getPosX() + 1);

इनकैप्सुलेशन के बिना यह इस तरह दिखेगा:

player.posX++;

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

इस मामले का तथ्य यह है कि इनकैप्सुलेशन कोड को कोड को अधिक बनाए रखने और उपयोग करने में आसान बनाने में मदद कर सकता है। इस वर्ग पर विचार करें:

class VerticalList implements ...
{
    private int posX;
    private int posY;
    ... //other members

    public void setPosition(int posX, int posY)
    {
        //change position and move all the objects in the list as well
    }
}

यदि इस उदाहरण में चर सार्वजनिक थे, तो इस एपीआई का एक उपभोक्ता भ्रमित होगा कि कब पॉसक्स और पॉसी का उपयोग करना है और कब सेटपोसिशन () का उपयोग करना है। उन विवरणों को छिपाकर आप सहज तरीके से अपने एपीआई का बेहतर उपयोग कर सकते हैं।

सिंटैक्स हालांकि कई भाषाओं में एक सीमा है। हालाँकि नई भाषाएँ ऐसे गुणों की पेशकश करती हैं जो हमें पबिसिस सदस्यों के अच्छे सिंटैक्स और एनकैप्सुलेशन के लाभ प्रदान करती हैं। यदि आप MSVC का उपयोग करते हैं, तो आपको C #, कोटलिन, C ++ में भी गुण मिलेंगे। यहाँ कोटलिन में एक उदाहरण है।

वर्टिकल वर्लिस्ट: ... {var posX: Int सेट (x) {फ़ील्ड = x; ...} var posY: इंट सेट (y) {फ़ील्ड = y; ...}}

यहां हमने जावा उदाहरण में एक ही चीज हासिल की है, लेकिन हम पॉक्सएक्स और पॉसी का उपयोग कर सकते हैं जैसे कि वे सार्वजनिक चर थे। जब मैं हालांकि उनके मूल्य को बदलने की कोशिश करता हूं, तो सेटर सेट () के शरीर को निष्पादित किया जाएगा।

उदाहरण के लिए कोटलिन में, यह जावा बीन के बराबर होगा जिसमें गेटर्स, सेटरर्स, हैशकोड, इक्वल्स और स्टॉल्स लागू होते हैं:

data class DataClass(var data: Int)

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

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


क्या आप इनकैप्सुलेशन के दुरुपयोग के बारे में एक उदाहरण यहां रख सकते हैं? यह दिलचस्प हो सकता है। आपका उदाहरण केवल एनकैप्सुलेशन की कमी के खिलाफ है।
गंगनुस

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

संपादन के लिए धन्यवाद। मुझे एक छोटा टाइपो मिला, हालांकि: "पब्लिक" के बजाय "पबिसिस"।
jrh

2

एनकैप्सुलेशन आपको लचीलापन देता है । संरचना और इंटरफ़ेस को अलग करके, यह आपको इंटरफ़ेस को बदले बिना संरचना को बदलने की अनुमति देता है।

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


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

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

: शब्द @Gangnus "इंटरफेस" सिर्फ जावा कीवर्ड के बाहर अर्थ है dictionary.com/browse/interface
glennsl

@jrh यह एक पूरी तरह से अलग मुद्दा है। आप कुछ संदर्भों में एनकैप्सुलेशन के खिलाफ बहस करने के लिए इसका उपयोग कर सकते हैं , लेकिन यह किसी भी तरह से इसके लिए तर्कों को अमान्य नहीं करता है।
ग्लेनस्ल

1
बिना मास / सेट के पुराने एनकैप्सुलेशन ने हमें न केवल बहुरूपता, बल्कि सुरक्षा भी दी। और सामूहिक अभ्यास / हमें बुरे अभ्यास की ओर सिखाता है।
गंगानुस

2

मैं एन्कैप्सुलेशन और क्लास डिज़ाइन की समस्या के स्थान का वर्णन करने का प्रयास करूंगा, और अंत में आपके प्रश्न का उत्तर दूंगा।

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

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

एक उपयोगकर्ता वर्ग पर विचार करें:

public class User {
  private String first = "";
  private String last = "";

  public String getFirstName() {
    return this.first;
  }
  public void setFirstName(String s) {
    this.first = s;
  }

  public String getLastName() {
    return this.last;
  }
  public void setLastName(String s) {
    this.last = s;
  }
}

यह सिंगल-थ्रेडेड संदर्भ में ठीक काम करता है। जो मॉडल बनाया जा रहा है वह एक व्यक्ति का नाम है, और यांत्रिकी उस नाम को कैसे संग्रहीत किया जाता है, यह बसने वालों द्वारा पूरी तरह से समझाया जा सकता है।

हालाँकि, कल्पना करें कि यह एक बहु-थ्रेडेड संदर्भ में प्रदान किया जाना चाहिए। मान लीजिए कि एक सूत्र समय-समय पर नाम पढ़ रहा है:

System.out.println(user.getFirstName() + " " + user.getLastName());

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

आप सेटर्स के अंदर लॉक जोड़कर इस समस्या को हल नहीं कर सकते, क्योंकि लॉक केवल पहले नाम या अंतिम नाम सेट करने की अवधि के लिए आयोजित किया जाता है। लॉकिंग के माध्यम से एकमात्र समाधान पूरे ऑब्जेक्ट के चारों ओर एक लॉक जोड़ना है, लेकिन कॉलिंग कोड के लॉक होने का प्रबंधन करना होगा (क्योंकि गतिरोध हो सकता है)।

जैसा कि यह पता चला है, लॉकिंग के माध्यम से कोई साफ समाधान नहीं है। स्वच्छ समाधान आंतरिक को फिर से अधिक मोटे बनाने के लिए इनकैप्सुलेट करना है:

public class UserName {
   public final String first;
   public final String last;
   public UserName(String first, String last) { ... }
}

public class User
   private UserName name;
   public UserName getName() { return this.name; }
   public setName(UserName n) { this.name = n; }
}

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

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

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


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

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

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

1

मैं एक उपयोग के मामले के बारे में सोच सकता हूं जहां यह समझ में आता है। आपके पास एक वर्ग हो सकता है जो मूल रूप से आप एक साधारण गेट्टर / सेटर एपीआई के माध्यम से एक्सेस करते हैं। आप बाद में इसे बढ़ाते हैं या संशोधित करते हैं ताकि यह समान फ़ील्ड का उपयोग न करे, लेकिन फिर भी समान API का समर्थन करता है

कुछ हद तक एक उदाहरण: एक बिंदु जो कार्टेशियन जोड़ी के साथ शुरू होता है p.x()और p.y()। आप बाद में एक नया कार्यान्वयन या उपवर्ग बनाते हैं जो ध्रुवीय निर्देशांक का उपयोग करता है, इसलिए आप कॉल भी कर सकते हैं p.r()और p.theta(), लेकिन आपका क्लाइंट कोड जो कॉल करता है p.x()और p.y()मान्य रहता है। वर्ग खुद को आंतरिक रूप से ध्रुवीय रूप से परिवर्तित करता है, y()जो अब है return r * sin(theta);। (इस उदाहरण में, केवल सेटिंग करना x()या y()उतना अर्थ नहीं है, लेकिन फिर भी संभव है।)

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


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

1
यदि आप उस विशिष्ट उदाहरण को पसंद नहीं करते हैं, तो निश्चित रूप से आप दूसरों के बारे में सोच सकते हैं जो वास्तव में कई समकक्ष प्रतिनिधित्व करते हैं, या एक नया प्रतिनिधित्व है जिसे एक पुराने से परिवर्तित किया जा सकता है।
डेविसोरल

हां, आप उन्हें प्रस्तुति के लिए बहुत उपयोग कर सकते हैं। UI में इसका व्यापक रूप से उपयोग किया जा सकता है। लेकिन क्या आप मुझे अपने सवाल का जवाब देने के लिए नहीं बना रहे हैं? :-)
गंगनुस

इस तरह से अधिक कुशल, है ना? :)
डेविस्लोर

0

क्या कोई मुझे समझा सकता है, सभी क्षेत्रों को निजी के रूप में छिपाने और उसके बाद कुछ अतिरिक्त प्रौद्योगिकी द्वारा उन सभी को उजागर करने का क्या मतलब है?

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

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

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

कभी-कभी डेटा को रेंज चेक, अखंडता चेक या सामान की आवश्यकता होती है। इन कार्यों को लिखने से हमें वह सब करने में मदद मिलती है। इस मामले में हमें लोम्बोक की आवश्यकता नहीं है या नहीं चाहिए, क्योंकि हम वह सब स्वयं कर रहे हैं।

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

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

क्या यह इसे स्पष्ट करता है?


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

0

मैं वास्तव में जावा डेवलपर नहीं हूं; लेकिन निम्नलिखित बहुत मंच अज्ञेय है।

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

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

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

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


जावा दुनिया में आपका स्वागत है। (सी #, भी)। * आह *। लेकिन आंतरिक प्रतिनिधित्व को छिपाने के लिए प्राप्त / सेट का उपयोग करने के लिए, सावधान रहें। यह केवल बाहरी प्रारूप के बारे में है, यह ठीक है। लेकिन अगर यह गणित के बारे में है, या, इससे भी बदतर, भौतिकी या अन्य वास्तविक चीज़ है, तो अलग-अलग आंतरिक प्रतिनिधित्व के अलग-अलग गुण हैं। करने के लिए मेरी टिप्पणी अर्थात softwareengineering.stackexchange.com/a/358662/44104
Gangnus

@ गैंग्नस: वह बिंदु उदाहरण सबसे दुर्भाग्यपूर्ण है। हमारे पास इनमें से कुछ थे, लेकिन गणना हमेशा सटीक थी।
जोशुआ

-1

गेटर्स और सेटर भविष्य में रिफैक्टरिंग से बचने के लिए एक "जस्ट इन केस" उपाय है, यदि आंतरिक संरचना या एक्सेस आवश्यकताएं विकास प्रक्रिया के दौरान बदल जाती हैं।

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

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

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

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


उन "आधुनिक" भाषाओं में, एपीआई एक फील्ड एक्सेस की तरह दिखता है,foo.bar लेकिन यह एक मेथड कॉल द्वारा नियंत्रित हो सकता है । आप दावा करते हैं कि यह API कॉल की तरह दिखने वाले "एंटीक" तरीके से बेहतर हैfoo.getBar() । हम इस बात से सहमत हैं कि सार्वजनिक क्षेत्र समस्याग्रस्त हैं, लेकिन मेरा दावा है कि "प्राचीन" विकल्प "आधुनिक" एक से बेहतर है, क्योंकि हमारा पूरा एपीआई सममित है (यह सभी विधि कॉल है)। "आधुनिक" दृष्टिकोण में, हमें यह तय करना होगा कि कौन सी चीजें गुण होनी चाहिए और कौन सी विधियां होनी चाहिए, जो सब कुछ ओवरक्लंप्लीकेट करता है (विशेषकर यदि हम प्रतिबिंब का उपयोग करते हैं!)।
वारबो

1
1. भौतिकी को छिपाना हमेशा इतना अच्छा नहीं होता है। मेरी टिप्पणी देखिए softwareengineering.stackexchange.com/a/358662/44104 पर । 2. मैं इस बारे में बात नहीं कर रहा हूं कि गेट्टर / सेटर का निर्माण कितना कठिन या सरल है। C # में बिल्कुल वही समस्या है जिसके बारे में हम बात कर रहे हैं। बड़े पैमाने पर जानकारी लोड करने के खराब समाधान के कारण अव्यवस्था की कमी। 3. हां, समाधान वाक्यविन्यास पर आधारित हो सकता है, लेकिन, कृपया, जैसा कि आप उल्लेख कर रहे हैं, कुछ अलग तरीकों से। वे बुरे हैं, हमारे यहाँ स्पष्टीकरण द्वारा भरा एक बड़ा पृष्ठ है। 4. समाधान वाक्यविन्यास पर आधारित नहीं होना चाहिए। यह जावा सीमा में किया जा सकता है।
गंगनुस

-1

क्या कोई मुझे समझा सकता है कि सभी क्षेत्रों को निजी के रूप में छिपाने और उसके बाद कुछ अतिरिक्त तकनीक द्वारा सभी को उजागर करने का क्या मतलब है? हम केवल सार्वजनिक क्षेत्रों का उपयोग क्यों नहीं करते हैं? मुझे लगता है कि हम केवल शुरुआती बिंदु पर लौटने के लिए एक लंबा और कठिन रास्ता तय कर चुके हैं।

हाँ, यह विरोधाभासी है। मैं पहली बार Visual Basic में गुणों में भाग गया। तब तक, अन्य भाषाओं में, मेरा अनुभव, खेतों के आसपास कोई संपत्ति रैपर नहीं थे। बस सार्वजनिक, निजी और संरक्षित क्षेत्र।

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

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

तो हमने / उन्होंने वास्तविक तरीकों का उपयोग क्यों नहीं किया? क्योंकि यह Visual Basic (और VBScript ) (oooh! Aaah!), जनता के लिए कोडिंग (!) था, और यह सब क्रोध था। और इस प्रकार एक मूर्ख लोकतंत्र अंततः हावी हो गया।


हां, UI के लिए गुणों में विशेष अर्थ है, वे सार्वजनिक और क्षेत्रों के सुंदर प्रतिनिधित्व हैं। अच्छी बात।
गंगनुस

"तो हमने / उन्होंने वास्तविक तरीकों का उपयोग क्यों नहीं किया?" तकनीकी रूप से उन्होंने .Net संस्करण में किया था। गुण प्राप्त और निर्धारित कार्यों के लिए वाक्य रचना चीनी हैं ।
फराप

"बेवकूफ" ? क्या आपका मतलब " idiosyncrasy " नहीं है?
पीटर मोर्टेंसन

मेरा मतलब बेवकूफ था
राडार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.