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