हमें इकाई वस्तुओं की आवश्यकता क्यों है? [बन्द है]


139

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

मुझे यकीन नहीं है कि इकाई वस्तुओं का अस्तित्व होना चाहिए।

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

मेरा वर्तमान डिजाइन दर्शन यह है:

  • सभी डेटाबेस का उपयोग संग्रहीत प्रक्रियाओं के माध्यम से पूरा किया जाना चाहिए।
  • जब भी आपको डेटा की आवश्यकता होती है, एक संग्रहीत प्रक्रिया को कॉल करें और एक SqlDataReader या पंक्तियों को एक DataTable में पुन: व्यवस्थित करें

(नोट: मैंने जावा ईई के साथ एंटरप्राइज़ एप्लिकेशन भी बनाए हैं, जावा लोग कृपया मेरे .NET उदाहरणों के लिए बराबर विकल्प दें)

मैं OO विरोधी नहीं हूं। मैं अलग-अलग उद्देश्यों के लिए बहुत सारी कक्षाएं लिखता हूं, सिर्फ संस्थाओं के लिए नहीं। मैं यह स्वीकार करूंगा कि मेरे द्वारा लिखी जाने वाली कक्षाओं का एक बड़ा हिस्सा स्थिर सहायक वर्ग है।

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

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

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

इस सरल उदाहरण पर विचार करें: आपको अपने आवेदन में एक निश्चित पृष्ठ के बारे में एक समर्थन कॉल प्राप्त होता है जो सही तरीके से काम नहीं कर रहा है, हो सकता है कि फ़ील्ड में से एक को लगातार ऐसा नहीं किया जा रहा हो जैसा होना चाहिए। मेरे मॉडल के साथ, डेवलपर को समस्या खोजने के लिए असाइन किया गया है जो वास्तव में 3 फाइलें खोलता है । एक ASPX, एक ASPX.CS और एक SQL फ़ाइल संग्रहीत कार्यविधि के साथ। समस्या, जो संग्रहीत कार्यविधि कॉल के लिए अनुपलब्ध पैरामीटर हो सकती है, को हल करने में मिनट लगते हैं। लेकिन किसी भी इकाई मॉडल के साथ, आप हमेशा डिबगर को आग लगा देंगे, कोड के माध्यम से कदम रखना शुरू कर देंगे, और आप विज़ुअल स्टूडियो में 15-20 फाइलें खोल सकते हैं। जब तक आप स्टैक के नीचे की ओर कदम बढ़ाते हैं, तब तक आप भूल गए कि आपने कहाँ शुरू किया था। हम एक समय में केवल इतनी सारी चीजें अपने सिर में रख सकते हैं। किसी भी अनावश्यक परतों को जोड़े बिना सॉफ्टवेयर अविश्वसनीय रूप से जटिल है।

विकास की जटिलता और समस्या निवारण मेरी पकड़ का सिर्फ एक पक्ष है।

अब बात करते हैं स्केलेबिलिटी की।

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

यदि आप लोगों को एब्सट्रैक्शन के साथ भौतिक डेटा स्टोर से बहुत दूर जाने देते हैं, तो वे एक एप्लिकेशन के साथ कहर पैदा करेंगे, जिसे स्केल करने की आवश्यकता है।

मैं जोएल नहीं हूं। मुझे विश्वास हो सकता है कि अगर मैं गलत हूं, और शायद मैं हूं, क्योंकि लिनक से Sql, ADO.NET EF, हाइबरनेट, जावा ईई, आदि की ओर इतना मजबूत धक्का है, कृपया अपनी प्रतिक्रियाओं के माध्यम से सोचें, अगर मुझे याद आ रही है। वास्तव में जानना चाहता हूं कि यह क्या है, और मुझे अपनी सोच क्यों बदलनी चाहिए।

[संपादित करें]

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

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

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

किसी ऐसे व्यक्ति से पूछें जो लंबे समय से उद्योग में है और उसने लंबे समय तक अनुप्रयोगों के साथ काम किया है: डेटाबेस पर रहते हुए कितने अनुप्रयोग और यूआई परतें आईं और चली गईं? डेटा को प्राप्त करने के लिए SQL उत्पन्न करने वाली 4 या 5 अलग-अलग दृढ़ता वाली परतें होने पर डेटाबेस को ट्यून और रीफैक्टर करना कितना कठिन है? आप कुछ भी नहीं बदल सकते हैं! ORM या कोई भी कोड जो SQL उत्पन्न करता है वह आपके डेटाबेस को पत्थर में लॉक करता है ।


आपके प्रश्न को पढ़ने से, हम बहुत ही एक जैसे हैं, और मैंने वर्षों से ठीक उसी चीज़ के बारे में सोचा है (जब से 3 पार्टी इकाई रूपरेखाओं के बारे में सुना है, और अब माइक्रोसॉफ्ट के)
pearcewg

1
क्या आप कह रहे हैं कि व्यावसायिक तर्क सहायक वस्तुएं हैं, या संग्रहित procs में हैं? मैं पूछ रहा हूँ जितने लोगों को लगता है कि आप बाद में कह रहे हैं ... लेकिन मुझे लगता है कि आप जो कह रहे हैं, वह यह है कि आपके पास कोडित वस्तुओं में अभी भी व्यावसायिक तर्क है, आप डेटाबेस से सीधे डेटा प्राप्त कर रहे हैं और उस डेटा का उपयोग कर रहे हैं डेटा रखने के लिए विशेष ऑब्जेक्ट्स के लिए ORM या मैपिंग के बजाय। मैं उसी तरह महसूस करता हूं - लेकिन वर्तमान में ईएफ 4 का मूल्यांकन कर रहा हूं कि यह देखने लायक है कि क्या यह इसके लायक हो सकता है।
एलकेमिकल

"प्रर्वतक उपभोक्ता अक्सर वही होते हैं जो खराब हो जाते हैं।" - अनुभव वाला कोई व्यक्ति
यूयूआर गुम्मशान

मुझे 2500 से अधिक SPROCs के साथ एक प्रणाली विरासत में मिली है, जहां आवेदन को SPROCs को सक्रिय करने और उनके आउटपुट की समझ बनाने के साधन के रूप में देखा जाता है। प्रत्येक डेटा को पढ़ा और लिखा जाता है, इसका अपना SPROC होता है। नियंत्रण के कोई केंद्रीय बिंदु नहीं हैं। यह भयावह है और ग्रेनाइट के रूप में निंदनीय है। मैं डेटाबेस के अनुकूलन पर विचार करता हूं। 2500 SPROCS ने मुझे अपनी जगह पर रखा। सुव्यवस्थित डोमेन लेयर और री-यूजेबल डीएएल कोड वाली प्रणाली की तुलना में यह अ-कल्पनाशील है और यह एक बुरा सपना है। सरल कार्य में घंटे लगते हैं और आत्मा नष्ट हो रही है। SPROCs का उपयोग उच्च भार या विशेष तरीकों के लिए किया जाना चाहिए IMO
Trucker_jim

अपने "डिबगिंग" उदाहरण के बारे में: इकाई परीक्षणों के साथ, आपको बहुत जल्दी पता चल जाएगा कि चीजें कहां गलत हैं।
मारियोडीएस

जवाबों:


59

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

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


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

4
वस्तुओं के साथ जो कुछ भी किया जा सकता है, वह वस्तुओं के बिना भी किया जा सकता है। मुझे लगता है कि ओओ डिजाइन आमतौर पर "जटिल" कुछ भी करने के लिए गैर-ओओ तरीकों की तुलना में बहुत आसान है, लेकिन मैं समझता हूं कि यह सभी के लिए काम नहीं करता है।
क्रिस्टोफर जॉनसन

मैं सहमत हूं - "जब वस्तुओं का उपयोग करना है" का उत्तर इस बात पर निर्भर करता है कि वस्तुओं के गुणों को व्यावसायिक तर्क में कार्रवाई या परिवर्तन की आवश्यकता हो सकती है या नहीं। उदाहरण के लिए, उपयोगकर्ता या व्यक्ति के उदाहरणों में पासवर्ड और लॉगिन नाम हो सकता है -> आपकी कोड क्रियाएं उन लोगों के मान के अनुसार बदल जाती हैं। इसके विपरीत यदि आपके पास कोई उत्पाद होगा, तो आपने db से डेटासेट प्राप्त करने और केवल GUI का निर्माण करने के बजाय प्रदर्शन (और कुछ नहीं, कोई अन्य क्रिया नहीं) किया होगा।
यॉर्डन जॉर्जीव

5
एक संतुलन है। धर्म से बचें और काम करें।
जेफ़ डेविस

27

थ्योरी कहती है कि अत्यधिक सामंजस्यपूर्ण, शिथिल युग्मित कार्यान्वयन आगे का रास्ता है।

इसलिए मुझे लगता है कि आप उस दृष्टिकोण पर सवाल उठा रहे हैं, अर्थात् चिंता को अलग करना।

क्या मेरे aspx.cs फ़ाइल को डेटाबेस के साथ बातचीत करनी चाहिए, एक स्पार्क को कॉल करना चाहिए, और IDataReader को समझना चाहिए?

एक टीम के माहौल में, विशेष रूप से जहां आपके पास कम तकनीकी लोग हैं जो एप्लिकेशन के एस्पेक्स हिस्से से निपटते हैं, मुझे इन लोगों को इस सामान को "स्पर्श" करने में सक्षम होने की आवश्यकता नहीं है।

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

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

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

हालांकि दिलचस्प सोचा, हालांकि यह एस्पक्स में एसक्यूएल से एक कदम दूर लगता है, जो मेरे बुरे पुराने असंरचित एस्प दिनों से, मुझे भय से भर देता है।


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

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

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

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

25

एक कारण - अपने डोमेन मॉडल को अपने डेटाबेस मॉडल से अलग करना।

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


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

3
आप एक ही डेटा के दो अलग-अलग मॉडल क्यों रखना चाहेंगे?
सीन ओसेवा

3
क्योंकि कुछ उद्देश्यों के लिए, मॉडल की एक व्याख्या अधिक अनुकूल हो सकती है। कुछ तर्क पंक्तियों की तुलना में वस्तुओं पर बहुत बेहतर काम करते हैं।
राउटर लीवेंस

1
मुझे लगता है कि यह एक अच्छा विचार है जिसे खराब तरीके से लागू किया गया है।
जेफ डेविस

21

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

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

मैं रिपोर्टिंग के लिए स्पोक्स आरक्षित करता हूं क्योंकि एप्लिकेशन सामान्य डेटा एक्सेस की तुलना में थोड़ा नस्टियर प्राप्त करते हैं।

मैं उचित इकाई परीक्षण के साथ उस परिदृश्य पर जल्दी से सोचने की प्रवृत्ति रखता हूं जैसे कि एक स्तंभ का लगातार बने रहना एक समस्या नहीं है।


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

16

एरिक, तुम पर मर चुके हैं। किसी भी वास्तव में स्केलेबल / आसानी से बनाए रखा / मजबूत आवेदन के लिए एकमात्र वास्तविक उत्तर सभी कचरे के साथ तितर-बितर करना और मूल बातें करना है।

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

कोड की प्रत्येक पंक्ति को संदेह की नजर से देखा जाना चाहिए।


2
यकीन है, यह निश्चित रूप से अच्छी तरह से काम करता है जब आपको कर्मियों के टोटल एज्ड संसाधन मिलते हैं, लेकिन मुझे लगता है कि यदि आप एक आदमी टीम के बारे में सोचते हैं कि "नई" तकनीक बहुत मदद कर सकती है ..
कार्ल हॉर्गबर्ग

10

मैं आपके द्वारा प्रस्तावित एक उदाहरण के साथ जवाब देना चाहूंगा।

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

क्या (मेरी राय में) इकाइयाँ किसी परियोजना को लाती हैं:

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

परीक्षण क्षमता: आप अपने डेटाबेस को छूने के साथ अपने तर्क का परीक्षण कर सकते हैं। यह आपके परीक्षणों पर प्रदर्शन बढ़ाता है (आपको उन्हें अधिक बार चलाने की अनुमति देता है)।

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

अंत में मैं जोड़ना चाहूंगा कि अधिकांश ORM मैपर संग्रहीत प्रक्रियाओं का समर्थन करते हैं क्योंकि आप जो उपयोग कर रहे हैं।

चीयर्स।


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

1
@ एरिक जेड दाढ़ी: हाँ, लेकिन आप संग्रहीत प्रक्रियाओं के आसपास इकाई परीक्षण कैसे लिख सकते हैं जबकि संग्रहीत प्रक्रिया के भीतर केवल तर्क को अलग करते हैं? संग्रहीत प्रक्रियाओं को कसकर डेटाबेस पर जोड़ा जाता है, और हम में से अधिकांश ORM प्रकार पसंद नहीं करते हैं। संग्रहीत कार्यविधि के लिए एक इकाई परीक्षण लिखने के लिए आपको डेटाबेस में होने के लिए कुछ डेटा पर भरोसा करना होगा। और आप उस डेटा निर्भरता के बिना इस परीक्षण को बार-बार नहीं चला सकते। वह परीक्षण जो आप लिखेंगे, अब एक इकाई परीक्षण नहीं होगा, बल्कि यह एक एकीकरण परीक्षण होगा।
7wp

8

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

एक बात मैं आपको पूरी तरह से गारंटी दे सकता हूं कि यह मामले पर किसी के दृष्टिकोण को नहीं बदलेगा, जैसा कि अनगिनत अन्य ब्लॉगों, मंचों, पॉडकास्ट आदि पर इतनी बार साबित हुआ है।

किसी विवादित विषय के बारे में खुले तौर पर बहस और बहस करना निश्चित रूप से ठीक है, यह सिर्फ एक बार ऐसा किया गया है कि दोनों "पक्ष" असहमत हो गए हैं और बस लेखन सॉफ्टवेयर के साथ आगे बढ़ गए हैं।

यदि आप दोनों पक्षों पर कुछ और पढ़ना चाहते हैं, तो टेड के ब्लॉग पर लेख देखें, अयेन्दे रहीन, जिमी निल्सन, स्कॉट बेलवेयर, Alt.Net, स्टीफन फोर्ट, एरिक इवांस आदि।


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

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

वाह। +1 "कंप्यूटर विज्ञान के वियतनाम" लेख के लिंक के लिए जिसमें ओआरएम बनाम गैर ओआरएम के विषय का उत्कृष्ट परिचय है।
लैंबाकॉक

7

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


वाह, कोई और जो इस पर मेरे जैसा सोचता है ... मेरे ऐप लगभग हमेशा डेटा में हेरफेर के बारे में हैं, यही वे वास्तव में करते हैं।
एलकेमिकल

यह अब एक टिप्पणी के रूप में बेहतर होगा कि वे सुविधाएँ उपलब्ध हैं
केसबश

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

4

मुझे आपका प्रश्न वास्तव में दिलचस्प लगा।
आमतौर पर मुझे किसी एप्लिकेशन के व्यावसायिक तर्क को एनकोड करने के लिए ऑब्जेक्ट्स की आवश्यकता होती है। इस तर्क को डेटा लेयर में धकेलना वास्तव में जटिल और अपर्याप्त होगा।
इन संस्थाओं की वस्तुओं से बचने के लिए आप क्या करेंगे? आपके मन में क्या समाधान है?


यह टिप्पणी के रूप में बेहतर होगा
केसबश

4

एंटिटी ऑब्जेक्ट एप्लिकेशन लेयर पर कैश करने की सुविधा प्रदान कर सकते हैं। सौभाग्य एक डाटारिअर कैशिंग।


4

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

समृद्ध डोमेन मॉडल में मूल्य है। डोमेन ड्रिवेन डिज़ाइन क्या है। मेरा व्यक्तिगत रूप से मानना ​​है कि OO जटिलता पर विजय पाने का एक तरीका है। इसका मतलब केवल तकनीकी जटिलता (जैसे डेटा-एक्सेस, यूआई-बाइंडिंग, सुरक्षा ...) नहीं है, बल्कि व्यावसायिक क्षेत्र में भी जटिलता है !

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

आपकी संस्थाओं और आपकी तालिकाओं के बीच अंतर हैं। संस्थाओं को आपके मॉडल का प्रतिनिधित्व करना चाहिए, टेबल सिर्फ आपके मॉडल के डेटा-पहलू का प्रतिनिधित्व करते हैं!

यह सच है कि डेटा क्षुधा से अधिक समय रहता है, लेकिन पर विचार इस उद्धरण से डेविड Laribee : मॉडल हमेशा के लिए कर रहे हैं ... डेटा एक खुश पक्ष प्रभाव है।

इस विषय पर कुछ और लिंक:


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

4

वाकई दिलचस्प सवाल। ईमानदारी से मैं यह साबित नहीं कर सकता कि संस्थाएं अच्छी क्यों हैं। लेकिन मैं अपनी राय साझा कर सकता हूं कि मैं उन्हें क्यों पसंद करता हूं। कोड की तरह

void exportOrder(Order order, String fileName){...};

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

इस पद्धति का क्रियान्वयन ऑर्डर एब्सट्रैक्शन के आधार पर किया जाएगा, न कि यह डीबी में प्रस्तुत किए गए तरीके के आधार पर। ऐसे अधिकांश ऑपरेशन जो मैंने वास्तव में कार्यान्वित किए हैं, यह इस बात पर निर्भर नहीं करता है कि यह डेटा कैसे संग्रहीत किया जाता है। मैं समझता हूं कि कुछ कार्यों के लिए परावर्तन और मापनीय उद्देश्यों के लिए DB संरचना के साथ युग्मन की आवश्यकता होती है, बस मेरे अनुभव में उनमें से बहुत अधिक नहीं हैं। मेरे अनुभव में बहुत बार यह जानना पर्याप्त है कि व्यक्ति के पास .getFirstName () रिटर्निंग स्ट्रिंग, और .getAddress () एड्रेसिंग एड्रेस है, और एड्रेस में .getZipCode (), आदि है - और इस बात का ध्यान नहीं रखें कि उस डेटा को स्टोर करने के लिए कौन सी टेबल अनप्लग हैं। ।

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

स्केलेबिलिटी यहाँ दिलचस्प बिंदु है - अधिकांश वेबसाइटों को भारी स्केलेबिलिटी (जैसे facebook, livejournal, फ़्लिकर) की आवश्यकता होती है, DB-ascetic दृष्टिकोण का उपयोग करते हैं, जब DB को यथासंभव दुर्लभ और स्केलेबिलिटी मुद्दों को कोचिंग द्वारा हल किया जाता है, विशेष रूप से RAM उपयोग द्वारा। http://highscalability.com/ पर इसके कुछ रोचक लेख हैं।


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

4

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

मैं sprocs + datareaders को एक अच्छा ORM का विकल्प नहीं मानूंगा। संग्रहीत प्रक्रियाओं के साथ, आप अभी भी विवश हैं, और कसकर-युग्मित हैं, प्रक्रिया का प्रकार हस्ताक्षर, जो कॉलिंग कोड की तुलना में एक अलग प्रकार की प्रणाली का उपयोग करता है। संग्रहीत कार्यविधियाँ अतिरिक्त विकल्पों और स्कीमा परिवर्तनों को संशोधित करने के लिए विषय हो सकती हैं। मामले में संग्रहीत प्रक्रियाओं का एक विकल्प, जहां स्कीमा परिवर्तन के अधीन है, विचारों का उपयोग करने के लिए है - आप वस्तुओं को मानचित्रों में मैप कर सकते हैं और फिर उन्हें बदलने पर अंतर्निहित तालिकाओं को फिर से मैप कर सकते हैं।

अगर आपके अनुभव में मुख्य रूप से जावा EE और CSLA शामिल हैं, तो मैं ओआरएम पर आपके विरोध को समझ सकता हूं। आप लाइनक्यू टू एसक्यूएल पर एक नज़र डाल सकते हैं, जो एक बहुत ही हल्का ढांचा है और मुख्य रूप से डेटाबेस टेबल के साथ एक-से-एक मैपिंग है, लेकिन आमतौर पर उन्हें पूर्ण-विकसित व्यावसायिक वस्तुओं के लिए मामूली विस्तार की आवश्यकता होती है। LINQ to SQL भी इनपुट और आउटपुट ऑब्जेक्ट को संग्रहीत प्रक्रियाओं के पैरामाटर्स और परिणामों में मैप कर सकता है।

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

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


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

CRUD ऑपरेशनों के अलावा, Microsoft ORM आपको इकाई वर्गों पर ऐसे तरीके जोड़ने की सुविधा देता है जो सीधे किसी भी संग्रहित खरीद पर मैप करते हैं जिसे आप इसे फेंकना चाहते हैं (बशर्ते कि सभी इनपुट / आउटपुट प्रकार अनुपयोगी हों)।
मार्क सिडैड


3

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

लेकिन अगर कोई इकाई वस्तु नहीं हैं, तो उनके बारे में बात करने के लिए बहुत कुछ नहीं होगा।

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

यह समय बनाए रखता है जब इसे बनाए रखने की बात आती है।

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


3
बहुत से लोग डी-कपलिंग ला रहे हैं, और एक परत को दूसरे को प्रभावित किए बिना बदलने की अनुमति देते हैं। संग्रहीत कार्यविधि किसी भी ORM से बेहतर है! मैं डेटा मॉडल को मौलिक रूप से बदल सकता हूं, और जब तक प्रक्रियाएं समान डेटा लौटाती हैं, तब तक कुछ भी नहीं टूटता है।
एरिक जेड बीयर्ड

2
मेरी राय में संग्रहीत कार्यविधियाँ और एक इकाई मॉडल परस्पर अनन्य नहीं हैं। संग्रहीत कार्यविधियाँ आपके इकाई मॉडल को संग्रहीत करने के लिए एक तंत्र प्रदान कर सकती हैं। सवाल यह है: क्या आपके व्यावसायिक तर्क संस्थाओं के साथ काम करते हैं या संग्रहीत प्रक्रियाओं को सीधे एक्सेस करते हैं?
jbandi

3

आपको यह पोस्ट comp.object पर दिलचस्प लग सकती है।

मैं सहमत या असहमत होने का दावा नहीं कर रहा हूं लेकिन यह दिलचस्प है और (मुझे लगता है) इस विषय के लिए प्रासंगिक है।


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

3

एक प्रश्न: यदि आपके सभी व्यावसायिक तर्क डेटाबेस में फंस गए हैं, तो आप डिस्कनेक्ट किए गए एप्लिकेशन को कैसे संभालेंगे?

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

डेटाबेस में संग्रहीत कार्यविधियों में डोमेन लेयर रखने पर आपको एक ही प्रकार के एप्लिकेशन से चिपकना होता है, जिसे डेटाबेस के लिए स्थायी लाइन-ऑफ़-विज़न की आवश्यकता होती है।

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


2

@jdecuyper, एक अधिकतम जिसे मैं खुद से दोहराता हूं वह है "यदि आपका व्यवसाय तर्क आपके डेटाबेस में नहीं है, तो यह केवल एक सिफारिश है"। मुझे लगता है कि पॉल नेल्सन ने कहा कि उनकी एक किताब में। एप्लिकेशन लेयर्स और UI आते और जाते हैं, लेकिन डेटा आमतौर पर बहुत लंबे समय तक रहता है।

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


मैं मानता हूं, व्यावसायिक तर्क जो केवल एप्लिकेशन में है, अक्सर अन्य तरीकों से खाते में विफल रहता है, जिसमें डेटा दर्ज किया जा सकता है, हटाया जा सकता है, या बदला जा सकता है। यह आमतौर पर डेटा अखंडता समस्याओं का कारण बनता है।
एचएलजीईएम

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

2

मैं इसी बात के बारे में हाल ही में सोच रहा हूं; मैं कुछ समय के लिए CSLA का भारी उपयोगकर्ता था, और मुझे यह कहने की शुद्धता पसंद है कि "आपके सभी व्यावसायिक तर्क (या कम से कम जितना संभव हो उतना संभव है) व्यावसायिक संस्थाओं में निहित है"।

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

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

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

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


2

एरिक,

कोई भी आपको उस ढांचे / दृष्टिकोण को चुनने से रोक रहा है जो आप चाहते हैं। यदि आप "डेटा संचालित / संग्रहीत प्रक्रिया-संचालित" पथ पर जाने वाले हैं, तो हर तरह से, इसके लिए जाएं! खासकर यदि यह वास्तव में, वास्तव में आपके अनुप्रयोगों को ऑन-स्पेक और ऑन-टाइम वितरित करने में आपकी सहायता करता है।

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

कहा जा रहा है, यदि आप अपना आवेदन OOP में करते हैं तो समान नियम लागू होते हैं: सुसंगत हो। OOP के पालन सिद्धांतों, और कि इकाई बनाने शामिल है अपने डोमेन मॉडल का प्रतिनिधित्व करने के वस्तुओं।

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


मैं पूरे ऐप में स्थिरता के साथ सहमत हूं। ईमानदार होने के लिए, मैंने थोड़ी देर पहले अपने वर्तमान प्रोजेक्ट पर दिशाएं बदल दीं और मूल मॉडल के 100% को ठीक करने के लिए कभी नहीं मिला, जिससे यह भ्रमित हो गया। अच्छे निर्णय जल्दी किए जाते हैं।
एरिक जेड बीयर्ड

एरिक, सच में। मैं एक बार एक OOP zealot था (जिस तरह से इस धागे में अन्य प्रतीत होते हैं) लेकिन मुझे एक ऐसे व्यक्ति से मिला जो एक कंपनी का मालिक है जो डीबी-संचालित ऐप बेचने में अत्यधिक सफल है। जिसने मेरी दुनिया को हिला कर रख दिया। मैं अभी भी एक ओओपी / टीडीडी बफ़र हूं, लेकिन मैं अब डीबी-केंद्रित नहीं हूं।
जॉन लिमजप

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

2

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

लेकिन क्या होगा यदि आपके पास 100 टेबलों वाला एक डेटाबेस था, जो कि बेसिक CRUD ऑपरेशंस के लिए प्रत्येक टेबल के लिए 4 स्टोर्ड प्रोसीजर की बराबरी करता है, जो कि 400 स्टोर की गई प्रक्रियाएं हैं जिन्हें बनाए रखने की जरूरत है और दृढ़ता से टाइप नहीं किया जाता है इसलिए टाइपो के लिए अतिसंवेदनशील होते हैं और न ही यूनिट टेस्ट किए जा सकते हैं । क्या होता है जब आपको एक नया CTO मिलता है जो एक Open Source Evangelist है और SQL सर्वर से MyBql में RDBMS बदलना चाहता है?

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

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

सिर्फ मेरे 2 सेंट


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

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

लेकिन क्या यह उत्तर नहीं है ?: आपको जितना अधिक कोड लिखने की आवश्यकता है, उतनी ही बड़े पैमाने पर प्रोग्रामिंग समर्थन के लिए आपको सुविधाओं की आवश्यकता होगी: एन्कैप्सुलेशन, स्ट्रिंग टाइपिंग, रीफैक्टरिंग, परिष्कृत शैली और त्रुटि की जांच, आदि; जावा और .NET के पास इस क्षेत्र में सहायता का भंडार है, संग्रहीत कार्यविधि भाषाएँ नहीं हैं।
reinierpost

2

मैं OO और RDB के बीच की दूरी की समस्या को एक और कोण प्रदान करना चाहता हूं: इतिहास।

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

RDB सूचनाओं को तालिकाओं में रखने की एक बहुत पुरानी परंपरा से आता है, जिसे लेखांकन कहा जाता है। लेखांकन कागज पर किया गया था, फिर पंच कार्ड पर, फिर कंप्यूटर में। लेकिन लेखांकन पहले से ही वास्तविकता की कमी है। लेखांकन ने लोगों को अपनी प्रणाली का पालन करने के लिए इतने लंबे समय तक मजबूर किया है कि यह स्वीकृत वास्तविकता बन गई है। इसीलिए लेखांकन के लिए कंप्यूटर सॉफ्टवेयर बनाना अपेक्षाकृत आसान है, कंप्यूटर के आने से बहुत पहले, लेखांकन का अपना सूचना मॉडल रहा है।

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

मुझे लगता है कि ओओ तब साथ आया होगा जब लोगों ने पाया है कि वास्तविकता के अन्य पहलुओं को लेखांकन की तुलना में मॉडल करना कठिन है (जो पहले से ही एक मॉडल है)। OO एक बहुत ही सफल विचार बन गया है, लेकिन OO डेटा का बने रहना अपेक्षाकृत अविकसित है। RDB / लेखांकन में आसान जीत हुई है, लेकिन OO एक बहुत बड़ा क्षेत्र है (मूल रूप से सब कुछ जो लेखांकन नहीं है)।

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

Prevayler और db4o कुछ सुझाव हैं, मुझे यकीन है कि कुछ और भी हैं जिनके बारे में मैंने नहीं सुना है, लेकिन किसी को भी ऐसा नहीं लगता है कि हाइबरनेशन आधा प्रेस है।

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

OO और RDB के बीच की खाई को बंद करने के अपने रोजमर्रा के संघर्ष में मैं OO का अधिक से अधिक उपयोग करता हूं लेकिन विरासत को न्यूनतम रखने की कोशिश करता हूं। मैं अक्सर एसपी का उपयोग नहीं करता हूं। मैं केवल उन पहलुओं में उन्नत क्वेरी सामग्री का उपयोग करूंगा जो लेखांकन जैसी दिखती हैं।

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


मुझे नहीं लगता कि आपको उपयोगी मानने के लिए OO के लिए ORM की आवश्यकता है। मैं संग्रहित procs का उपयोग करता हूं और अपने कोड में बहुत सारे स्थिर सहायक वर्ग लिखता हूं, लेकिन उन कक्षाओं को विशाल .NET फ्रेमवर्क पर बनाया गया है, जो वस्तुओं का एक शानदार संग्रह है।
एरिक ज़ दा दाढ़

आपका तर्क समझ में आता है, लेकिन मुझे नहीं लगता कि आधार ध्वनि है। मैंने ऐसी किसी चीज के बारे में कभी नहीं सुना है जिसे आरडीबी के साथ मैप न किया जा सके।
जेफ डेविस

1

इस समय बहुत समय नहीं है, लेकिन बस मेरे सिर के ऊपर से ...

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

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

यहाँ कुछ चीजें हैं जिन्हें आपको ध्यान में रखना चाहिए (IMO) हालांकि:

  1. उत्पन्न SQL कोड खराब है (अपवादों का पालन करें)। क्षमा करें, मुझे पता है कि बहुत सारे लोग सोचते हैं कि यह एक बड़ा समय बचाने वाला है, लेकिन मैंने कभी ऐसा सिस्टम नहीं पाया है जो मैं लिख सकता था और इससे अधिक कुशल कोड उत्पन्न कर सकता था और अक्सर कोड सिर्फ सादा भयानक होता है। आप अक्सर SQL कोड का एक टन उत्पन्न करते हैं जो कभी भी उपयोग नहीं होता है। यहां अपवाद बहुत सरल पैटर्न है, जैसे शायद लुकअप टेबल। हालांकि बहुत सारे लोग इस पर चले जाते हैं।
  2. एंटिटी <> टेबल्स (या यहां तक ​​कि तार्किक डेटा मॉडल इकाइयां आवश्यक हैं)। एक डेटा मॉडल में अक्सर डेटा नियम होते हैं जिन्हें डेटाबेस के जितना संभव हो उतना करीब से लागू किया जाना चाहिए, जिसमें नियम शामिल हो सकते हैं कि कैसे तालिका पंक्तियां एक-दूसरे से मिलती-जुलती हैं या अन्य समान नियम जो कि घोषणात्मक आरआई के लिए बहुत जटिल हैं। इन्हें संग्रहीत प्रक्रियाओं में संभाला जाना चाहिए। यदि आपके सभी संग्रहीत कार्यविधियाँ सरल CRUD procs हैं, तो आप ऐसा नहीं कर सकते। उस के शीर्ष पर, CRUD मॉडल आमतौर पर प्रदर्शन समस्याएँ पैदा करता है क्योंकि यह पूरे नेटवर्क में डेटाबेस में दौर यात्राओं को कम नहीं करता है। यह अक्सर एक उद्यम आवेदन में सबसे बड़ी अड़चन है।

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

एक आवेदन से मेरा मतलब संगठन में एकल समूह द्वारा लिखित एकल आवेदन से है। जहां मैं अभी से सलाह ले रहा हूं, उनके पास एक कॉर्पोरेट डेटाबेस है जो उनके बीच सीमित संचार के साथ तीन अलग-अलग अनुप्रयोगों पर काम करने वाले कम से कम तीन अलग-अलग समूहों द्वारा पहुँचा जाता है।
टॉम एच

1

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

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


1

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

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

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

इसके अलावा, जबकि मैं मानता हूं कि संग्रहीत प्रक्रियाओं बनाम डोमेन लॉजिक के सवाल का कोई निश्चित जवाब नहीं है। मैं डोमेन लॉजिक कैंप में हूं (और मुझे लगता है कि वे समय के साथ जीत रहे हैं), क्योंकि मेरा मानना ​​है कि विस्तृत डोमेन लॉजिक की तुलना में विस्तृत संग्रहीत प्रक्रियाएं कठिन हैं। लेकिन यह एक पूरी अन्य बहस है


0

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

आप जो भी कर रहे हैं, वह OOP नहीं है। यह गलत नहीं है, यह सिर्फ OOP नहीं है, और यह हर समस्या का समाधान करने के लिए समझ में नहीं आता है।


डेटा हमेशा पहले आता है। इसका कारण आपके पास पहली जगह में कंप्यूटर प्रोग्राम है। इसलिए "डेटाबेस पहले" संभवतः डिजाइनिंग ऐप्स के लिए एकमात्र वैध दृष्टिकोण है।
gbjbaanb

0

दिलचस्प सवाल। कुछ विचार:

  1. यदि आपके सभी व्यावसायिक तर्क आपके डेटाबेस में थे, तो आप इकाई परीक्षण कैसे करेंगे?
  2. अपने डेटाबेस संरचना में परिवर्तन नहीं करेंगे, विशेष रूप से जो आपके ऐप में कई पृष्ठों को प्रभावित करते हैं, पूरे ऐप में बदलने के लिए एक बड़ी परेशानी होगी?

0

अच्छा प्रश्न!

एक दृष्टिकोण जो मुझे पसंद है, वह है इट्रेटर / जनरेटर ऑब्जेक्ट बनाना जो उन वस्तुओं के उदाहरणों को उत्सर्जित करता है जो एक विशिष्ट संदर्भ के लिए प्रासंगिक हैं। आमतौर पर यह ऑब्जेक्ट कुछ अंतर्निहित डेटाबेस एक्सेस सामान को लपेटता है, लेकिन मुझे यह जानने की आवश्यकता नहीं है कि इसका उपयोग करते समय।

उदाहरण के लिए,

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

मैंने पाया है कि जब मेरे पास काम करने के लिए एक बड़ा डेटासेट होता है, तो यह अच्छी तरह से काम करता है, और जब सही किया जाता है, तो यह मुझे छोटे, क्षणिक वस्तुएं देता है जो कि परीक्षण के लिए अपेक्षाकृत आसान होते हैं।

यह मूल रूप से डेटाबेस एक्सेस सामान पर एक पतली लिबास है, लेकिन जब भी मुझे ज़रूरत होती है तब यह मुझे इसे अमूर्त करने का लचीलापन देता है।


0

मेरे ऐप्स में ऑब्जेक्ट्स डेटाबेस से वन-टू-वन से संबंधित हैं, लेकिन मैं स्पार्क के बजाय लाइनक टू सकाल का उपयोग कर रहा हूं, इससे जटिल प्रश्नों को लिखना आसान हो जाता है, विशेष रूप से आस्थगित निष्पादन का उपयोग करके उन्हें बनाने में सक्षम होता है। जैसे Images.User.Ratings में r से। आदि जहाँ यह मुझे sql में कई जॉइन स्टेटमेंट्स को वर्कआउट करने की कोशिश करता है, और पेजिंग के लिए Skip & Take भी कोड को सरल करता है बजाय row_number & 'over' कोड को एम्बेड करने के।


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

0

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


मैं OO को "फुलाना" नहीं देखता। यह सिर्फ पिछले दशक में ऐसा है, MSFT, Sun, आदि ने 99% वस्तुओं को लिखा है जिनकी हमें कभी आवश्यकता होगी। सिर्फ इसलिए कि मैं ढांचे के शीर्ष पर बहुत सारी स्थिर कक्षाएं लिखता हूं, इसका मतलब यह नहीं है कि मैं ओओ का उपयोग नहीं कर रहा हूं।
एरिक जेड बियर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.