एनीमिक डोमेन मॉडल: पेशेवरों / विपक्ष


जवाबों:


39

गुण:

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

विपक्ष:

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

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

62
नहीं, क्या एनीमिक मॉडल एक विरोधी पैटर्न है, यह एक राय का विषय है। फाउलर (जिसका काम मैं सम्मान करता हूं और आमतौर पर अनुसरण करता हूं) का कहना है कि यह है। मैं असहमत हूं (ऐसा नहीं है कि मेरे शब्द का कोई वजन है), और ओओ खाइयों में कई भी असहमत हैं। शुद्ध OO मॉडलिंग आम तौर पर हर मामले में लागू नहीं होती है, जिसे पूरा उद्योग अनुभव से जानता है। इसके अलावा, एक एनीमिक मॉडल अभी भी OO मॉडलिंग दिशानिर्देशों का पालन कर सकता है। इसलिए विशिष्ट मामलों को देखना जहां एक लागू होता है, ओओ डिजाइन की किसी की समझ में नहीं आता है।
luis.espinal

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

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

2
@TerryWilcox खैर, मैं कोई कार्यात्मक विशेषज्ञ नहीं हूं, लेकिन कार्यात्मक प्रोग्रामिंग में डेटा संरचनाएं भी हैं। एनीमिक डोमेन मॉडल ऑब्जेक्ट का उपयोग डेटा के कंटेनरों के रूप में करता है, वे संरचना की तरह अधिक हैं। मेरा कहना है कि एडीएम के साथ, आप अधिक कार्यात्मक तरीके की ओर बढ़ सकते हैं, जहां आपके पास अपरिवर्तनीय डेटा है जो समय के साथ नए और नए राज्यों में बदल जाता है। मैं इसे उदाहरण के लिए स्काला में किया जा रहा हूँ, OOP का थोड़ा लाभ उठाने की कोशिश कर रहा हूँ और इसके लिए कुछ FP लगा सकता हूँ। थोड़ा सा वे इसे यहाँ समझाते हैं: स्लाइडशेयर
डिडिएर ए।

131

"एनीमिक डोमेन मॉडल" के पैटर्न के विरोधी होने के कारण, इतनी सारी प्रणालियाँ क्यों हैं जो इसे लागू करती हैं?

मुझे लगता है कि इसके कई कारण हैं

1. प्रणाली की जटिलता

अगर मैं लागू करना चाहता हूं तो एक सरल प्रणाली में (जो लगभग सभी उदाहरण और नमूना कोड जो आप इंटरनेट पर पाते हैं):

ऑर्डर करने के लिए उत्पाद जोड़ना

मैंने यह फ़ंक्शन ऑर्डर पर रखा

public void Order.AddOrderLine(Product product)
{
    OrderLines.Add(new OrderLine(product));
}

अच्छी और सुपर ऑब्जेक्ट ओरिएंटेड।

अब कहते हैं कि मुझे यह सुनिश्चित करने की आवश्यकता है कि उत्पाद को सूची में मौजूद है और यदि वह नहीं है तो अपवाद को फेंकने की आवश्यकता है।

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

public void OrderService.AddOrderLine(Order order, Product product)
{
    if (!InventoryService.Has(product)
       throw new AddProductException

    order.AddOrderLine(product);
}

मैं IInventoryService को Order.AddOrderLine पर भी पारित कर सकता हूं, जो एक और विकल्प है, लेकिन फिर भी यह ऑर्डर को InventoryService पर निर्भर करता है।

ऑर्डर.एडऑडरलाइन में अभी भी कुछ कार्यक्षमता है, लेकिन आमतौर पर यह ऑर्डर स्कोप तक सीमित है, जबकि मेरे अनुभव में ऑर्डर स्कोप से बहुत अधिक बिजनेस लॉजिक है।

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

2. OOP के डेवलपर का दृष्टिकोण

इंटरनेट पर बहुत सारे गर्म विचार-विमर्श हैं जिनके बारे में तर्क संस्थाओं पर जाना चाहिए।

कुछ इस तरह

आदेश दें

ऑर्डर को पता होना चाहिए कि खुद को कैसे बचाया जाए या नहीं? मान लीजिए कि हमारे पास इसके लिए रिपॉजिटरी हैं।

अब आदेश आदेश लाइनें जोड़ सकते हैं? अगर मैं सरल अंग्रेजी का उपयोग करके इसका अर्थ निकालने की कोशिश करता हूं, तो यह वास्तव में समझ में नहीं आता है। उपयोगकर्ता ऑर्डर करने के लिए उत्पाद जोड़ता है, तो क्या हमें User.AddOrderLineToOrder () करना चाहिए? जो ओवरकिल की तरह लगता है।

ऑर्डरस् सेवा के बारे में कैसे। AddOrderLine ()। अब यह थोड़े समझ में आता है!

OOP के बारे में मेरी समझ यह है कि इनकैप्सुलेशन के लिए आप उन कक्षाओं पर कार्य करते हैं जहाँ फ़ंक्शन को कक्षा की आंतरिक स्थिति तक पहुँचने की आवश्यकता होगी। अगर मुझे ऑर्डर.ऑर्डरलाइन संग्रह का उपयोग करने की आवश्यकता है, तो मैं ऑर्डर पर ऑर्डर.एडऑर्डररलाइन () डाल देता हूं। इस तरह वर्ग की आंतरिक स्थिति उजागर नहीं होती है।

3. आईओसी कंटेनर

IoC कंटेनर का उपयोग करने वाले सिस्टम आमतौर पर पूरी तरह से एनीमिक होते हैं।

इसका कारण यह है कि आप अपनी सेवाओं / रिपॉजिटरी का परीक्षण कर सकते हैं जिनमें इंटरफेस हैं, लेकिन डोमेन ऑब्जेक्ट्स (आसानी से) का परीक्षण नहीं कर सकते, जब तक कि आप उन सभी पर इंटरफेस नहीं डालते।

चूंकि "IoC" वर्तमान में आपकी सभी प्रोग्रामिंग समस्याओं के समाधान के रूप में प्रशंसित है, बहुत सारे लोग नेत्रहीन रूप से इसका पालन करते हैं और इस तरह से एनीमिक डोमेन मॉडल समाप्त होता है।

4. OOP कठिन है, प्रक्रियात्मक आसान है

मेरे पास इस पर एक " ज्ञान का अभिशाप " है, लेकिन मुझे पता चला है कि डीटीओ और सेवाओं वाले नए डेवलपर्स रिच डोमेन की तुलना में बहुत आसान हैं।

संभवतः ऐसा इसलिए है क्योंकि रिच डोमेन के साथ यह जानना अधिक कठिन है कि तर्क को किस वर्ग में रखा जाए। नई कक्षाएं कब बनाएं? कौन से पैटर्न का उपयोग करें? आदि..

स्टेटलेस सेवाओं के साथ आप इसे निकटतम नाम के साथ सेवा में थप्पड़ मारते हैं।


मुझे लगता है कि यह इस बात पर निर्भर करेगा कि यह कितना जटिल होगा। 1. यदि यह 1-2 निर्भरता के रूप में सरल है - मैं इसे ऑर्डर क्लास पर रखूंगा। 2. अगर मध्यम जटिलता - मैं ऑर्डरलाइन क्लास बनाएगा और ऑर्डर को संभालने के लिए ऑर्डरऑर्डरलाइन का उपयोग करेगा। -> ऑर्डरलाइन संचार के साथ-साथ संबंधित निर्भरताएं भी। 3. लेकिन उच्च जटिलता के मामले में - मैं ऑर्डर में किसी भी ऑर्डर मॉड्यूल को स्कॉप्ड लॉजिक रखते हुए, सबसे बाहरी निर्भरता के लिए अनुमति देने के लिए एप्लिकेशन सर्विस ऑर्डर सर्विस का उपयोग करूंगा।
एरिक पी

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

अच्छी तरह से कहा गया। ग्रेल्स के उपयोग से, मुझे यकीन नहीं है कि 3 ° एनीमिया की ओर जाता है। 1 ° के रूप में, वास्तव में, आप किसी भी गैर तुच्छ अनुप्रयोग में सेवा परत में बढ़ते तर्क को समाप्त करते हैं। लेकिन मैं अभी भी अपने आप को ग्रिल्स का उपयोग करते हुए एक डोमेन-केंद्रित दृष्टिकोण के साथ पाता हूं। यह वास्तव में इतना अच्छा नहीं है, क्योंकि आपका डोमेन तर्क के लिए आपकी पसंदीदा जगह है, लेकिन जरूरत पड़ने पर आप एक परत को हिलाते हैं।
Youri

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

2
DDD के बारे में बात यह है कि मैं Grok से संघर्ष कर रहा हूं, आपका पहला बिंदु है: "जब सिस्टम अधिक होता है, तो बस बुनियादी CRUD, यू आपके ऑर्डरस् के अधिकांश लॉजिक के साथ समाप्त हो जाएगा और ऑर्डर में बहुत कम होगा।" यह मेरे लिए समझ में आता है, लेकिन क्या डीडीडी का उद्देश्य उन प्रणालियों के लिए उपयोग नहीं किया जाता है जो इससे अधिक जटिल हैं?
डैन लिंग

20

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


16

"यह एक विरोधी पैटर्न है, इसलिए अन्य डेवलपर्स पूछेंगे कि क्या आप ऑब्जेक्ट ओरिएंटेड डिज़ाइन की अवधारणाओं को समझते हैं।"

"एनीमिक डोमेन मॉडल एक एंटी-पैटर्न है। एंटी-पैटर्न के पास कोई नियम नहीं है।"

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

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


2
... कौन से? मैं आपको या किसी को भी बरगलाने की कोशिश नहीं कर रहा हूं, लेकिन मैं वास्तव में उत्सुक हूं कि आप अभियोग पक्ष में हैं। विपक्ष का उल्लेख एक हजार बार किया गया है, लेकिन मैं अभी भी एडीएम के लचीले पेशेवरों की मांग कर रहा हूं (अलग-अलग पॉलीमिक वाक्यांशों से)।
21

6
... ऐसा लगता है जैसे कोई व्यक्ति इसके लिए बहुत कम प्रदर्शन के साथ शैतान का प्यार खेलने की कोशिश कर रहा है। the chances are it would still have some (though relatively little) upside.तो कुछ नाम कृपया! परिकल्पना के बजाय कम से कम एक!
स्लेज

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

1
मुझे लगता है कि यह लेख एडीएम को एक एंटीपैटर्न ब्लॉग
syclee

1
Antipatterns हमेशा समस्याएं पैदा करते हैं और हमने कई कुछ बड़े अनुप्रयोगों (10 डेवलपर्स के काम के 3 या 3 साल के विकास> 300KLOC) को पैटर्न का उपयोग करके उच्च गुणवत्ता वाले समाधानों के साथ भेज दिया है और बिना कुछ महसूस किए इसके साथ कुछ गलत था, इसलिए यह बुरा नहीं हो सकता है अगर यह आपको इसका उपयोग करते समय अच्छा कोड बनाने की अनुमति देता है।
इग्नासियो सोलर गार्सिया

13

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

मेरा सुझाव है कि कम से कम दो बल हैं जो इस तरह के डिजाइन का उत्पादन कर सकते हैं:

  1. डिजाइनर / प्रोग्रामर जो अभी भी सोचते हैं कि एक वस्तु-उन्मुख वातावरण में काम करने के लिए प्रक्रियात्मक रूप से आवश्यक है (या यह मानते हुए कि वे कर सकते हैं ...) एक नई प्रणाली का उत्पादन करने के लिए , और

  2. गैर-ओओ फैशन (भाषा की परवाह किए बिना) में डिज़ाइन की गई विरासत प्रणाली पर सेवा-जैसा "चेहरा" डालने का काम करने वाले डेवलपर्स ।

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

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


8

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

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

इसके विपरीत, ADM डेवलपर अपने लिए निम्न अपेक्षाएँ निर्धारित करेंगे, क्योंकि वे नई सुविधाओं के लिए अधिक कोड का पुन: उपयोग करने की अपेक्षा नहीं करेंगे। समय के साथ उनके पास कई विसंगतियों वाला एक सिस्टम होगा, लेकिन यह संभवतः अनपेक्षित रूप से नहीं टूटेगा। बाजार में उनका समय एक सफल आरडीएम की तुलना में लंबा होगा, लेकिन उनके हितधारकों को इस संभावना की संभावना नहीं है।


5

"एक गैर-ओओ फैशन (भाषा की परवाह किए बिना) में डिज़ाइन की गई विरासत प्रणाली पर" फेस "की तरह काम करने वाले डेवलपर्स।"

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


1
बिंगो। यह वह जगह है जहां बहुत से लोग नाव को याद करते हैं। ADM का एक उद्देश्य होता है। उनका दुरुपयोग एक विरोधी पैटर्न है, लेकिन वे खुद नहीं हैं।
luis.espinal

4

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

DDD के उदाहरणों में सर्विस क्लासेस, XyzUpdaters, singletons और IoC हैं।

मैं वास्तव में एक एनीमिक डोमेन मॉडल से भ्रमित हूं। मुझे उम्मीद है "जब मैं इसे देखूंगा तो मुझे पता चल जाएगा"। अभी के लिए मैं अच्छे डिजाइन के सकारात्मक उदाहरण के साथ संतुष्ट हूं।


1
मैंने बाद में एरिक इवान की पुस्तक खरीदी है और मैं इसकी अत्यधिक अनुशंसा करता हूं। यह एनीमिक डोमेन मॉडल के विपरीत के ठोस उदाहरण प्रदान करता है।
जैमी

4

एक एडीएम के साथ 'परिपक्व' प्रणाली के साथ काम करने और मुझे लगता है कि मैं इस सवाल पर कुछ, कम से कम, महत्वपूर्ण प्रतिक्रिया प्रदान कर सकता हूं।

1) एनकैप्सुलेशन की कमी

एडीएम के साथ एक लाइव सिस्टम में लिखने की संभावना है जैसे 'obj.x = 100; obj.save ', भले ही यह व्यावसायिक तर्क का उल्लंघन करता हो। इससे कई कीड़े हो जाते हैं जिनका सामना नहीं किया जाता है यदि ऑब्जेक्ट पर इनवेरिएंट्स को मॉडल किया गया था। यह इन बगों की गंभीरता और व्यापकता है जो मुझे लगता है कि एक एडीएम के लिए सबसे गंभीर नकारात्मक है।

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

2) कोड ब्लोट

मेरा अनुमान है कि ADM में उत्पादित कोड की मात्रा 5-10x है, जो OOP / RDM समाधान बनाता है। यह शायद 50% कोड पुनरावृत्ति, 30% बायलर प्लेट कोड और 20% होने वाली समस्याओं के समाधान या समाधान के लिए जिम्मेदार है जो एक आरडीएम की कमी से उत्पन्न होते हैं।

3) डोमेन की समस्याओं की खराब समझ

एक एडीएम और डोमेन की खराब समझ कुछ हद तक हाथ से जाती है। Naive समाधान उत्पन्न होते हैं, आवश्यकताओं को मौजूदा DM के साथ समर्थन करने की कठिनाई के कारण खराब माना जाता है, और ADM व्यवसाय के नवाचार के लिए एक महत्वपूर्ण अवरोध बन जाता है जिसे लंबे समय तक विकास और लचीलेपन की कमी दी जाती है।

4) रखरखाव की कठिनाई

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

5) ऑन-बोर्डिंग के साथ बढ़ी हुई कठिनाई

मुझे लगता है कि आरडीएम के लाभों में से एक अवधारणा का सामंजस्य है जो डोमेन की तेज समझ की अनुमति देता है। एक ADM अवधारणाओं के साथ खंडित और स्पष्टता की कमी हो सकती है, इसलिए नए डेवलपर्स के लिए अधिग्रहण करना कठिन है।

मुझे एक एडीएम के लिए एक RDM से अधिक होने के लिए परिचालन समर्थन लागत को शामिल करने के लिए भी लुभाया गया था लेकिन यह कई कारकों पर निर्भर करेगा।

जैसा कि अन्य लोगों ने बताया है, आरडीएम के लाभों के लिए डीडीडी (ग्रेग इवांस, विंस वॉन और स्कॉट मिलेट) को देखें।


1
क्या ग्रेग इवांस ग्रेग यंग और एरिक इवांस का गुप्त बच्चा है? मुझे नहीं पता था कि विंस वॉन डीडीडी किताबें लिख रहे थे, लेकिन हो सकता है कि वॉन वर्नोन ने भी अभिनय शुरू कर दिया हो :)
knittl

ओह डियर, लगता है मेरी याददाश्त जब मैंने ऊपर लिखी थी तो कुछ गड़बड़ हो गई थी। उस ओर इशारा करने के लिए धन्यवाद :)
श्री मोरफ़े

2

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


7
उस मामले में, मैं इसे rephrase। ^ ^ ^ शुद्ध रूप से वास्तविक सबूत एक सामान्य-लगने वाले प्रस्ताव का अनुमान लगाने के लिए उपयोग किया जाता है।
luis.espinal

जब हमें पर्याप्त प्रमाण मिलते हैं, तो हम एक पैटर्न प्राप्त करने में सक्षम हो सकते हैं। और यह पैटर्न अच्छी तरह से जाना जाता है और परिवर्तन प्रबंधन पर साहित्य में पर्याप्त रूप से वर्णित है।
स्टीफन एगरमॉन्ट

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

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

धन्यवाद, मैं पढ़ूंगा कि जब मुझे मौका मिलेगा (एक प्रशस्ति पत्र प्रदान करने के लिए +1)। क्या वह पुस्तक इसे एक प्रसिद्ध विरोधी पैटर्न के रूप में प्रस्तुत करती है? इसके अलावा, क्या यह दावा करता है / केवल सहसंबंध ही नहीं बल्कि कार्य-कारण भी है ? आप इसे अब "संभव" स्पष्टीकरण के रूप में दावा करते हैं । आपका मूल पाठ इसे एक निश्चितता के रूप में रखता है, विस्तार से अधिक बयानबाजी के साथ (यही कारण है कि मैंने इसे 'शुद्ध अटकलें' कहा है)। क्या आपका इरादा तब था , या बस एक संपादकीय दुर्घटना थी, जो जानता है, और मैं केवल इसे पढ़ने के समय पाठ में मौजूद है से अनुमान लगा सकता हूं।
luis.espinal

2

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

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

या इसे इस तरह से देखें: आपके पास आंतरिक क्रेडिट बैलेंस वाला एक उपयोगकर्ता हो सकता है, और हर बार जब User.addItemToOrder (आइटम) कहा जाता है, तो यह आइटम की कीमत प्राप्त करता है और इसे जोड़ने से पहले क्रेडिट की जांच करता है, आदि जो एक उचित OO लगता है। डिज़ाइन। मुझे यकीन नहीं है कि Service.addItemToUserOrder (उपयोगकर्ता, आइटम) के साथ प्रतिस्थापित करने से क्या खो गया है, लेकिन मुझे यकीन नहीं है कि क्या प्राप्त हुआ है, या तो। मुझे लगता है कि एक नुकसान कोड की अतिरिक्त परत होगी, साथ ही लेखन की क्लिंकर शैली और अंतर्निहित डोमेन मॉडल की लागू अज्ञानता होगी।


1

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

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

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

यदि आप एक संपूर्ण ऐप के लिए पेशेवरों और विपक्षों पर निर्णय लेने की कोशिश कर रहे हैं, तो मुझे लगता है कि पहले यह डिजाइन करना महत्वपूर्ण है कि हर कोई आपके दिए गए आवेदन के लिए कैसा दिख सकता है, इससे पहले कि आप कोड की एक भी पंक्ति लिखना शुरू कर दें। एक बार जब आप CRC'd या वायर-फ्रेम किए गए अपने आवेदन को दोनों शैलियों में ले लेंगे, तो एक कदम पीछे ले जाएं और निर्णय लें कि कौन सा अधिक समझ में आता है और एप्लिकेशन को बेहतर बनाता है।

आगे यह भी सोचिए कि किसको बनाए रखना आसान होगा ...


1

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


1

डोमेन-संचालित डिज़ाइन के बारे में एरिक इवांस की किताब को पढ़ने के बाद मैंने वास्तव में यह नहीं समझा कि यह अच्छे डोमेन मॉडल कक्षाओं को डिजाइन करने के लिए केवल सामरिक पैटर्न का एक गुच्छा नहीं है।

विषय के बारे में अधिक जानने के बाद और रणनीतिक पैटर्न का उपयोग करने के साथ-साथ अंत में मुझे यह समझ में आने लगा कि सबसे पहले यह उन व्यावसायिक समस्याओं की गहरी समझ पाने के बारे में है जिन्हें आप हल करने की कोशिश कर रहे हैं।

और उसके बाद ही आप यह तय कर सकते हैं कि सिस्टम के कौन से भाग सामरिक पैटर्न जैसे एग्रीगेट, एंटिटी , रिपॉजिटरी इत्यादि के साथ-साथ तथाकथित समृद्ध डोमेन मॉडल (जैसे एनीमिक के विपरीत ) लागू करने के लिए फिट होंगे । लेकिन इन पैटर्नों से लाभान्वित होने के लिए सिस्टम के उस हिस्से के लिए व्यावसायिक तर्क से संबंधित पर्याप्त जटिलता होनी चाहिए ।

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

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

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

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

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

तक कमजोर डोमेन मॉडल मैं कोड है जहाँ से मैं देख सकता हूँ जटिल व्यापार तर्क और व्यापार के नियम है कि विभिन्न घटकों जो बल्कि डेटा इन तर्क बदल रहा है के करीब होना चाहिए में फैले हुए हैं की एक बहुत कुछ है कि वहाँ का उल्लेख होगा।

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


0

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

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

मेरे विचार में दृष्टिकोण एक डीएम के लिए लक्ष्य होना चाहिए जो अधिक से अधिक बिज़ बीहैरव के रूप में हो जो व्यावहारिक हो, बाकी को स्पष्ट रूप से नामित क्षेत्रों में रखें (अर्थात सेवाओं में नहीं)


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

0

मेरी टीम व्यक्तिगत रूप से ADM को प्राथमिकता देती है। हमारे पास व्यावसायिक वस्तुओं का एक समूह है जो हमारे डोमेन के विशिष्ट भागों का प्रतिनिधित्व करता है। हम इन वस्तुओं को db पर सहेजने के लिए सेवाओं का उपयोग करते हैं। हमारी व्यावसायिक वस्तुओं में विधियाँ हैं, हालाँकि ये विधियाँ केवल आंतरिक स्थिति में हेरफेर करती हैं।

RDM पर ADM का उपयोग करने में हमारे लिए लाभ यह देखा जा सकता है कि हम वस्तुओं को db में कैसे बनाए रखते हैं। हमारे विरासत कोड सिस्टम पर काम करने वाले डेवलपर्स हमारी व्यावसायिक वस्तुओं (नई प्रणाली से) का उपयोग कर सकते हैं और इन वस्तुओं को डीबी पर जारी रखने के लिए अपनी वर्तमान डेटा एक्सेस परत का उपयोग जारी रख सकते हैं। आरडीएम का उपयोग हमारी विरासत प्रणाली के डेवलपर्स को रिपॉजिटरी ऑब्जेक्ट्स को हमारे व्यवसाय मॉडल में इंजेक्ट करने के लिए मजबूर करेगा ... जो कि उनके वर्तमान डेटा एक्सेस परत के अनुरूप नहीं होगा।


-15

एक कमजोर डोमेन मॉडल एक विरोधी पैटर्न है। एंटी-पैटर्न में कोई नियम नहीं है।


10
मैं असहमत हूं। अधिकांश एंटीपैटर्न में कोने के मामले हैं जिनमें वे अन्य विकल्पों की तुलना में बेहतर समाधान हैं।
बिल करविन

19
एंटी-पैटर्न में पेशेवरों हैं। इसलिए लोग उनका उपयोग करते हैं, भले ही वे आमतौर पर बुरे विचार हैं।
क्रिस्टोफर जॉनसन

6
यह कहना कि कुछ एक तथ्य के रूप में एक विरोधी प्रतिमान है, जब यह सिर्फ एक राय है (भले ही यह फाउलर कैलिबर की कुछ हो), यह जवाब देने का एक वैध रूप नहीं है।
luis.espinal

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