दृश्य मॉडल में व्यावसायिक वस्तुओं का उपयोग करना


11

पुन: प्रयोज्य व्यावसायिक वस्तुओं का उपयोग करते समय, दृश्य मॉडल बनाते समय सबसे अच्छा अभ्यास क्या माना जाता है?

हम एक ऐसी वस्तु का उपयोग करते हैं जिसे हम Builderअपने दृश्य मॉडल बनाने के लिए कहते हैं। विचारों की प्रत्येक तार्किक इकाई (आदेश, उपयोगकर्ता आदि) के लिए एक बिल्डर, जहां प्रत्येक इकाई में कई अलग-अलग दृश्य मॉडल हो सकते हैं (आदेश में सारांश, आदेश लाइनें आदि शामिल हैं)।

व्यू मॉडल बनाने के लिए एक बिल्डर एक या अधिक मानक व्यावसायिक वस्तुओं के माध्यम से डेटा खींच सकता है।

जब दृश्य मॉडल में व्यावसायिक वस्तुओं / मॉडल का उपयोग करने की बात आती है, तो इसे बेहतर अभ्यास क्या माना जाता है?

दृष्टिकोण १

दृश्य मॉडल में व्यावसायिक वस्तुओं के उपयोग की अनुमति दें?

//Business object in some library
public class Order
{
    public int OrderNum;
    public int NumOrderLines;
    //...
}

//Order builder in website
public class OrderBuilder
{
    public OrderSummary BuildSummaryForOrder(int OrderNum)
    {
        Some.Business.Logic.Order obOrder = Some.Business.Logic.GetOrder(OrderNum);
        //Any exception handling, additional logic, or whatever

        OrderSummary obModel = new OrderSummary();
        obModel.Order = obOrder;

        return obModel;
    }
}

//View model
public class OrderSummary
{
    public Some.Business.Logic.Order Order;
    //Other methods for additional logic based on the order
    //and other properties
}

दृष्टिकोण २

व्यावसायिक वस्तुओं से केवल आवश्यक डेटा लें

//Business object in some library
public class Order
{
    public int OrderNum;
    public int NumOrderLines;
    //...
}

//Order builder in website
public class OrderBuilder
{
    public OrderSummary BuildSummaryForOrder(int OrderNum)
    {
        Some.Business.Logic.Order obOrder = Some.Business.Logic.GetOrder(OrderNum);
        //Any exception handling, additional logic, or whatever

        OrderSummary obModel = new OrderSummary()
        {
            OrderNum = obOrder.OrderNum,
            NumOrderLnes = obOrder.NumOrderLines,
        }

        return obModel;
    }
}

//View model
public class OrderSummary
{
    public int OrderNum;
    public int NumOrderLines
    //Other methods for additional logic based on the order
    //and other properties
}

मैं दोनों को लाभ और कमियां देख सकता हूं, लेकिन मुझे आश्चर्य है कि क्या कोई स्वीकृत तरीका है? दृष्टिकोण 1 में, मॉडल के आसपास कोड का कोई दोहराव नहीं है, लेकिन यह व्यावसायिक तर्क पर निर्भरता बनाता है। दृष्टिकोण 2 में, आप केवल दृश्य के लिए आवश्यक डेटा लेते हैं, लेकिन आप मॉडल के चारों ओर कोड डुप्लिकेट करते हैं।

जवाबों:


12

विकल्प 1 डोमेन मॉडल और दृश्य के बीच एक तंग-युग्मन बनाता है। यह गर्भनिरोधक समस्या को हल करने के लिए डिज़ाइन किए गए दृश्य मॉडल को नियंत्रित करता है।

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

मैं हमेशा दृष्टिकोण की वकालत करूंगा 2. अक्सर ऐसा होता है कि मॉडल मॉडल ऑब्जेक्ट्स के समान दिखने वाले मॉडल भी समान दिख सकते हैं, लेकिन जैसा कि मैंने उल्लेख किया है कि उनके बदलाव के अलग-अलग कारण हैं।


क्या मैं यह सोचने में सही हूं कि "बदलने का कारण" से आपका मतलब एक रखरखाव अर्थ में परिवर्तन है, न कि अद्यतन करने में परिवर्तन (जैसे ui घटना) अर्थ?
एंडी हंट

@AndyBursh हां, यह सही है - इस लेख को देखें , विशेष रूप से लाइन "रॉबर्ट सी। मार्टिन बदलने के लिए एक कारण के रूप में एक जिम्मेदारी को परिभाषित करता है, और निष्कर्ष निकालता है कि एक वर्ग या मॉड्यूल में एक होना चाहिए, और केवल एक, बदलने का कारण।"
मैटवेवी

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

यदि आपके पास VM में डोमेन ऑब्जेक्ट नहीं हो सकते हैं, तो आप ऑर्डर के एक सरणी की तरह कुछ और अधिक जटिल का प्रतिनिधित्व कैसे करेंगे?
जेफ

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

2

विकल्प 1 बेहतर है क्योंकि यह कोड के दोहराव से बचा जाता है। बस।

यदि डोमेन मॉडल महत्वपूर्ण रूप से बदलता है, तो यह लगभग निश्चित है कि दृश्य को वैसे भी बदलना होगा। विकल्प 2 के साथ, फिर आपको दृश्य मॉडल और बिल्डर के साथ-साथ दृश्य को भी बदलना होगा। मुख्यता के लिए इस तरह की चीज पूर्ण जहर है। YAGNI।

एक अलग दृश्य मॉडल रखने की बात यह है कि केवल उस दृश्य के लिए सार्थक राज्य रखना है (जैसे वर्तमान में कौन सा टैब चुना गया है) व्यवसाय मॉडल से अलग है। लेकिन व्यवसाय डेटा को डुप्लिकेट के बजाय पुन: उपयोग किया जाना चाहिए।


YAGNI - अधिकांश सॉफ़्टवेयर डिज़ाइन समस्याओं को सुलझाने का गुप्त हत्यारा।
मार्टिन ब्लेयर

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

"यदि डोमेन मॉडल में महत्वपूर्ण परिवर्तन होता है, तो यह लगभग निश्चित है कि दृश्य को वैसे भी बदलना होगा।" - माना। लेकिन जब आपके पास डोमेन में एक छोटा सा बदलाव हो, तो क्या होगा? विकल्प एक के साथ, डोमेन में हर छोटे परिवर्तन (यहां तक ​​कि सिर्फ एक संपत्ति का नाम बदलने के लिए) को देखने के लिए इसी परिवर्तन की आवश्यकता होती है। यह भी स्थिरता के लिए पूर्ण जहर है।
मैटडिवी 17

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

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

2

सिद्धांत और मंत्र कभी-कभी मार्गदर्शक डिजाइन के लिए मूल्यवान होते हैं ... लेकिन यहां मेरा व्यावहारिक जवाब है:

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

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

आदर्श रूप से आपके दृश्य मॉडल को लगभग पूरी तरह से पूर्व स्वरूपित तारों से बना होना चाहिए। इसके बारे में सोचें ... आप अपने व्यू मॉडल में डेटटाइम या दशमलव भी नहीं चाहते हैं क्योंकि तब आप सी #, जावास्क्रिप्ट, ऑब्जेक्टिव-सी, आदि में लॉजिक फॉर्मेटिंग तर्क कर रहे हैं।


2
मुझे डोमेन मॉडल को क्रमबद्ध करने में कोई समस्या नहीं है। और एक मॉडल में तार के लिए सब कुछ परिवर्तित करना? गंभीरता से?
माइकल बोर्गवर्ड 15

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

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

1
@MichaelBorgwardt ऐसा लगता है जैसे आपको एनीमिक डोमेन मॉडल के साथ काम करने की आदत है, जहां इकाइयाँ बहुत कम या बिना किसी व्यवहार के प्रॉपर्टी बैग से अधिक हैं। उस स्थिति में हां, एक डीटीओ / व्यू-मॉडल मूल रूप से एक डुप्लिकेट होगा। हालाँकि यदि आपके पास जटिल रिश्तों के साथ एक समृद्ध डोमेन मॉडल है, तो डीटीओ / व्यू-मॉडल की एक परत आवश्यक हो जाती है, और वे डोमेन संस्थाओं के समान नहीं होंगे।
मैटवेवी

@MattDavey: ऐसा लगता है कि आपके द्वारा काम करने के लिए उपयोग किए जाने वाले डोमेन मॉडल न केवल समृद्ध हैं, बल्कि सत्यानाशी kleptocrats हैं। मुझे एनीमिक मॉडल पसंद नहीं है, लेकिन वे अभी भी मॉडल हैं, और उनके व्यवहार को डोमेन का प्रतिनिधित्व करने तक सीमित होना चाहिए। एकल जिम्मेदारी सिद्धांत और वह सब ...
माइकल Borgwardt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.