डेटा वर्गों को एक कोड गंध क्यों माना जाता है?


18

यह लेख दावा करता है कि एक डेटा वर्ग एक "कोड गंध" है। कारण:

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

किसी वस्तु के लिए केवल डेटा सम्‍मिलित करना गलत क्‍यों है? यदि कक्षा की मुख्य जिम्मेदारी डेटा का प्रतिनिधित्व करना है, तो डेटा को संचालित करने वाले तरीकों को एकल जिम्मेदारी सिद्धांत को तोड़ना नहीं होगा ?


1
यह भाषा सुविधाओं पर दृढ़ता से निर्भर करने वाला है। उदाहरण के लिए, पायथन में, "फ़ील्ड" और इसके एक्सेसर्स के बीच कोई अंतर नहीं है, जब तक कि आप पायथन में जावा लिखने के लिए अपने रास्ते से बाहर नहीं जाते हैं
jscs

1
मुझे लगता है कि केवल कुछ डेटा होने से प्रति वर्ग कोड गंध नहीं होती है, लेकिन यदि अधिकांश कक्षाएं ऐसी होती हैं, तो हम "एनीमिक डोमेन"
एंटीपैटर्न एन .wikipedia.org/

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

आप स्टैकओवरफ्लो पर इस उत्तर को पढ़ना चाह सकते हैं जो कि यहाँ के शीर्ष मतदान उत्तर की तुलना में बहुत अधिक विभेदित है जो समृद्ध डोमेन मॉडल की हीनता को दर्शाता है और इसे एक सिद्ध तथ्य की तरह प्रस्तुत करता है। stackoverflow.com/questions/23314330/…
मैक्लोविन

जवाबों:


31

शुद्ध डेटा ऑब्जेक्ट होने में कुछ भी गलत नहीं है। टुकड़ा के लेखक काफी स्पष्ट रूप से नहीं जानते कि वह किस बारे में बात कर रहा है।

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

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


1
बस यह जोड़ना चाहता था कि शुद्ध डेटा ऑब्जेक्ट्स रिश्तों, सत्यापन, पहुंच / नियंत्रण को नियंत्रित करने के लिए अमूल्य हो सकते हैं।
एड्रियन

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

7
यदि फ़ंक्शन उस डेटा प्रकार का तर्क लेता है, तो यह पहले से ही डेटा के साथ युग्मित है।
रेमकोगर्लिच

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

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

7

शुद्ध डेटा ऑब्जेक्ट होने में कुछ भी गलत नहीं है। लेखक के पास एक राय है जो मुझे सॉफ्टवेयर डेवलपर्स द्वारा साझा नहीं की गई है।

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

बहुत सारे उपकरण / चौखटे द्वारा उपयोग किए जाने वाले जावा बीन्स का छेद विचार उन बीजों नामक डेटा वर्गों पर आधारित होता है जिनमें केवल फ़ील्ड और संबंधित गेटर्स और सेटर होते हैं। विकिपीडिया JavaBeans

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


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

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

4

मार्टिन फॉलर द्वारा एक अच्छा तर्क क्यों:

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

https://martinfowler.com/bliki/TellDontAsk.html


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

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

2
@DavidArno आप निश्चित रूप से एक स्थिर विधि के लिए एक पैरामीटर के रूप में पारित कर सकते हैं baz, लेकिन ऐसा करने के लिए, आपको सबसे पहले इसके लिए ऑब्जेक्ट पूछना होगा। शायद एक प्रोग्रामिंग प्रतिमान में जहां विधियां प्राथमिक थीं (जैसे, कहो, कार्यात्मक प्रोग्रामिंग) यह समझ में आता है, लेकिन एक OO वातावरण में, यह बिल्कुल नहीं है, क्योंकि ऑब्जेक्ट प्राथमिक हैं और इसमें कार्य करने के लिए डेटा और फ़ंक्शन दोनों शामिल होने चाहिए। आपका दावा है कि ऑब्जेक्ट से विधि को हटाने से इनकैप्सुलेशन में वृद्धि हुई है, यह भी बिल्कुल पीछे की ओर है , जहां तक ​​मैं बता सकता हूं, क्योंकि इसका मतलब है कि अब आप bazऑब्जेक्ट के बाहर दिखाई दे रहे हैं।
11:48 बजे मार्नेन लाईबो-कोसर

1
@ MarnenLaibow-Koser, मैं "OO करने का दावा" नहीं करता। मैं कोड लिखता हूं और मैं ऐसा करने के लिए अच्छी तकनीकों का उपयोग करता हूं। चाहे वो तकनीक कार्यात्मक प्रतिमान से आती हो, या OO प्रतिमान, या जो देता है-एक-बहुत बड़ा प्रतिमान मेरे लिए कोई हित नहीं है। एक प्रतिमान चुनना और यथासंभव पूरी तरह से चिपकना शुद्ध हठधर्मिता है। यह बुरा है। यह हास्यास्पद है। यह आपको प्रभावित करता है और अवर कोड में परिणाम देता है। यह मत करो।
डेविड अर्नो

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

2

आपको यह समझने की आवश्यकता है कि दो प्रकार की वस्तुएँ हैं:

  • ऐसी वस्तुएँ जिनका व्यवहार होता है । इन्हें अपने अधिकांश डेटा सदस्यों को सार्वजनिक एक्सेस देने से बचना चाहिए। मैं केवल बहुत कम एक्सेसरी विधियों को इन के लिए परिभाषित करने की उम्मीद करता हूं।

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

    मेरे द्वारा लिखे गए अधिकांश वर्ग इस श्रेणी में हैं।

  • ऑब्जेक्ट जो वास्तव में सिर्फ डेटा हैं । इन्हें अपने सभी सदस्यों को सार्वजनिक घोषित करना चाहिए (या उनके लिए एक्सेसर्स का पूरा सेट प्रदान करना चाहिए)।

    एक उदाहरण एक वर्ग होगा Point2D। इसमें कोई अपरिवर्तनीय है कि जरूरतों को इस वर्ग के सदस्य के लिए सुनिश्चित किया जाना चाहिए है, तथा उपयोगकर्ता के माध्यम से डेटा का उपयोग करने में सक्षम होना चाहिए myPoint.xऔर myPoint.y

    व्यक्तिगत रूप से, मैं ऐसी कक्षाओं का उपयोग नहीं करता हूं, लेकिन मुझे लगता है कि कोड का कोई बड़ा टुकड़ा नहीं है जो मैंने लिखा है कि ऐसी कक्षा का उपयोग कहीं नहीं करता है।

ऑब्जेक्ट ओरिएंटेशन के साथ प्रवीण बनने से यह एहसास होता है कि यह अंतर मौजूद है, और इन दो श्रेणियों में से एक में 'क्लास फंक्शन को वर्गीकृत करना सीखना है।


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



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