यदि एमवीसी "चिंताओं का पृथक्करण" है तो रेजर सिंटैक्स की शुरुआत क्यों की गई?


22

मेरा प्रश्न Microsoft द्वारा पेश किए गए MVC डिजाइन पैटर्न और रेजर सिंटैक्स से संबंधित है।

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

लेकिन रेजर सिंटेक्स हमें सीधे दृश्य में C # का उपयोग करने की अनुमति देता है ।

क्या यह चिंताओं का प्रतिच्छेदन नहीं है?


7
यह उल्लेखनीय है कि ASP.NET MVC वास्तव में MVC डिज़ाइन पैटर्न को लागू नहीं करता है। MVC यह निर्धारित करता है कि मॉडल को परिवर्तनों के लिए देखा गया है जो स्पष्ट रूप से ASP.NET MVC में नहीं है।
बेंजामिन Gruenbaum

11
अगर आप व्यूज के बारे में सोचते हैं तो इससे भी मदद मिल सकती है। दृश्य नहीं हैं क्लाइंट-साइड कोड। वे सर्वर-साइड टेम्प्लेट हैं जो संसाधित होने पर क्लाइंट-साइड HTML उत्पन्न करते हैं। और सर्वर-साइड कोड के रूप में, यह पूरी तरह से स्वीकार्य है कि वहां C # कोड है।
एरिक किंग

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

12
@ वाह, वाह, ठीक है। मेरे अनुभव में नहीं। निश्चित रूप से हमेशा नहीं, और (बेशक) प्रोग्रामर की ओर से कुछ पेशेवर जिम्मेदारी की आवश्यकता होती है। मैं उपकरण को दोष नहीं देता।
एरिक किंग

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

जवाबों:


66

आप चिंताओं को अलग करने के साथ रेजर सिंटैक्स का सामना कर रहे हैं।

चिंताओं का पृथक्करण आपको अपने कोड को कैसे तैयार करना है, इसके साथ करना है।

विचारों में C # का उपयोग करने में सक्षम होने के कारण इसे रोका नहीं जा सकता है। इसका इस तरह चिंताओं से अलग होने से कोई लेना- देना नहीं है।

निश्चित रूप से, आप चिंताओं को अलग करने का पालन नहीं करने के लिए अपने दृष्टिकोण में कोड को संरचना कर सकते हैं, लेकिन केवल प्रदर्शन उद्देश्यों के लिए उपयोग किए जाने वाले C # कोड के बारे में क्या? वह कहाँ रहेगा?


1
लेकिन C # सर्वर-साइड भाषा है?
जॉन स्ट्रोवस्की

6
@ जॉन - तो? यदि आपको प्रदर्शन (और प्रदर्शन का अर्थ ग्राहक पक्ष, हमेशा) के लिए तिथियों को प्रारूपित करने की आवश्यकता है, तो आप उन्हें कहाँ प्रारूपित करेंगे? आदर्श? नियंत्रक? न तो। आप देखने में ऐसा करेंगे।
ओकेड

16
@ जॉन - तो, ​​आपकी तिथि डीबी में संग्रहीत है, आप इसे अपने विचार के लिए मॉडल / नियंत्रक के माध्यम से पास करते हैं। आपको HTML में वहां की आवश्यकता है, इसलिए आप इसे सीएसएस के साथ सीधे प्रारूपण के बजाय इसे किसी तरह जेएस को प्रारूपित करने के लिए आउटपुट करेंगे? क्यूं कर? क्यों बेहतर है? या यों कहें कि चिंताओं के अलगाव के बारे में अधिक दृष्टिकोण कैसा है?
ऊद

25
@ NPSF3000 - एक भाषा "सर्वर साइड" या "क्लाइंट साइड" नहीं है। यह एक आर्किटेक्चरल पृथक्करण है - और संभवतः भाषा कार्यान्वयन में से एक (जावास्क्रिप्ट एक सर्वर साइड या क्लाइंट साइड भाषा है - नोड याद रखें)।
ऊद

14
@FreeAsInBeer - यह एक प्रकार का तर्क है जो क्लाइंट की ओर से है - फ्रांस में कोई व्यक्ति तारीखों (और मुद्रा / संख्याओं) को अमेरिका में किसी को अलग रूप में देखना चाहेगा। क्लाइंट को "पता" सबसे अच्छा होगा कि इन्हें कैसे प्रदर्शित किया जाना चाहिए। यह प्रस्तुति तर्क है, और जैसा कि दृश्य में है।
ओडेड

35

सीधे सवाल का जवाब देने के बजाय, मेरी प्रतिक्रिया सवाल में बनी धारणा पर सवाल उठाती है। अर्थात्, रेजर को MVC के लिए बनाया गया था, यह धारणा गलत है। मैं ASP.NET टीम में Microsoft पर काम करता हूँ और इसके बारे में पहले-पहले जानकारी रखता हूँ।

रेजर ने एमवीसी के लिए एक दृश्य इंजन के रूप में शुरुआत नहीं की। यह ASP.NET वेब पेज के लिए बनाया गया था , जो संभवत: दूर है जब तक आप स्पेक्ट्रम के कम से कम-अलग-चिंताओं-पक्ष की ओर जा सकते हैं। यह ASP.NET वेब फॉर्म / क्लासिक ASP के लिए एक आधुनिक विकल्प के रूप में बनाया गया था और निश्चित रूप से इसी तरह के कई अन्य सर्वर प्रोग्रामिंग चौखटे। रेज़र का विचार HTML (मार्कअप) और C # (कोड) के बीच लगभग सहज बदलाव करना था।

केवल बाद में टीम (जिसमें खुद को शामिल किया गया है) ने फैसला किया कि रेजर सिंटैक्स MVC के लिए एक दृश्य इंजन की खातिर बहुत कुछ समझ में आएगा, जो उसी टीम द्वारा लिखा जा रहा था।

जैसे कि रेजर ASP.NET MVC में चिंताओं के पृथक्करण की अवधारणा को सक्षम बनाता है, बाधित करता है, सुधारता है या बदल देता है, ओड का जवाब हाजिर है।


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

जिज्ञासा से बाहर, क्या कोई अन्य टेम्पलिंग इंजन एएसपी एमवीसी के लिए माना जाता था?
NWARD

2
@NWard उस समय ASP.NET MVC के लिए कई 3 पार्टी व्यू इंजन थे, लेकिन हमने उन्हें बहुत दृढ़ता से नहीं माना। हमने महसूस किया कि रेजर को समझना आसान था (HTML HTML है, C # C # है) और ASP.NET वेब पेज प्रोजेक्ट के साथ बेहतर तरीके से पकड़ लिया गया।
इलोन

1
@ एलेक्स ओह, मैं निश्चित रूप से रेजर के सभी के लिए क्रेडिट नहीं ले सकता, लेकिन मैं आपकी टिप्पणी की सराहना करता हूं!
इलोन

1
@ateri थोड़ी देर बाद यह उत्तर के शीर्ष पर बड़ी संख्या है।
मार्क हर्ड

9

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


ऐसा लगता है कि किए गए अंकों से अधिक कुछ भी प्रस्तुत नहीं करता है और पूर्व के उत्तर में समझाया गया है, विशेष रूप से यह एक
gnat

4
+1 संक्षिप्त और स्पष्ट तरीके से तैयार किया गया और पिछले उत्तरों की तुलना में स्पष्टीकरण के एक अलग फोकस के साथ।
एलेक्स

@gnat मैं सिर्फ यह स्पष्ट करना चाहता था कि उनका भ्रम कहां है और फिर जल्दी से समझाएं कि कैसे MVC डिजाइन पैटर्न पर चिंताओं के सिद्धांत का पृथक्करण लागू होता है। शायद मुझे "चिंताओं को अलग करने" के अर्थ पर अधिक समय बिताना चाहिए था?
whoisthemachine

0

मैं एक आदर्श के बारे में सोच सकता हूं Don't do it उदाहरण के ।

आओ हम कहते हैं कि हम एक ProductController है:

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.Where(x => x.Discontinued).ToList();
        return new ViewResult(products);
    }
}

रेजर के साथ हमारे पास एक विकल्प है

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.ToList();
        return new ViewResult(products);
    }
}

और हमारे विचार में:

@model IEnumerable<Product> 

@foreach (var item in Model.Where(x => x.Discontinued)) {
    ....
}

मुझे लगता है कि यह बहुत स्पष्ट है कि दूसरा समाधान सिर्फ इतना गलत लगता है। यदि आप ऐसा कुछ करते हैं, तो रेजर को दोष न दें - खुद को दोष दें।

और मत भूलो: विचारों में C # का उपयोग करने में सक्षम होना रेजर की विशेषता नहीं है, यह ASP.NET विचारों के साथ भी संभव था। रेजर के साथ यह थोड़ा आसान है।

यदि आप एक टेम्पलेट इंजन की खोज कर रहे हैं जो अधिक रेल है जैसे कि आपको सुपर साधारण दृश्य इंजन के साथ nancy.fx पर एक नज़र डालनी चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.