रिफ्लेक्टिंग पैरामीटर नाम: C # लैम्ब्डा एक्सप्रेशन या सिंटैक्स ब्राइटनेस का दुरुपयोग?


428

मैं MvcContrib ग्रिड घटक को देख रहा हूं और मैं रोमांचित हूं, फिर भी एक ही समय में ग्रिड सिंटैक्स में उपयोग किए गए सिंटैक्टिक ट्रिक द्वारा, इसे वापस कर दिया गया है :

.Attributes(style => "width:100%")

ऊपर दिया गया सिंटैक्स जेनरेट किए गए HTML की शैली विशेषता सेट करता है width:100%। अब अगर आप ध्यान दें, तो 'शैली' कहीं भी निर्दिष्ट नहीं है, अभिव्यक्ति में पैरामीटर के नाम से घटाया गया है! मुझे इसमें खुदाई करनी पड़ी और पाया कि 'जादू' कहाँ होता है:

Hash(params Func<object, TValue>[] hash)
{
    foreach (var func in hash)
    {
        Add(func.Method.GetParameters()[0].Name, func(null));
    }
}

तो वास्तव में, कोड विशेषता नाम-मूल्य जोड़े के शब्दकोश बनाने के लिए औपचारिक, संकलन समय, मापदंडों के नाम का उपयोग कर रहा है। परिणामी सिंटैक्स का निर्माण वास्तव में बहुत स्पष्ट है, लेकिन एक ही समय में बहुत खतरनाक है। लैम्ब्डा अभिव्यक्ति का सामान्य उपयोग साइड इफेक्ट के बिना उपयोग किए गए नामों के प्रतिस्थापन के लिए अनुमति देता है। मुझे एक पुस्तक में एक उदाहरण दिखाई देता है जो कहता है कि collection.ForEach(book => Fire.Burn(book))मुझे पता है कि मैं अपने कोड में लिख सकता हूं collection.ForEach(log => Fire.Burn(log))और इसका मतलब वही है । लेकिन MvcContrib ग्रिड सिंटैक्स के साथ यहाँ अचानक, मुझे ऐसा कोड मिल गया है जो सक्रिय रूप से दिखता है और मेरे चर के लिए चुने गए नामों के आधार पर निर्णय लेता है!

तो क्या यह # C / 3.5 / 4.0 समुदाय और लैंबडा एक्सप्रेशन प्रेमियों के साथ आम बात है? या एक बदमाश एक चाल चाल है मैं के बारे में चिंता नहीं करनी चाहिए?


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

190
मैंने सिर्फ एंडर्स (और बाकी डिजाइन टीम) से पूछा कि उन्होंने क्या सोचा। मान लीजिए कि परिवार के अनुकूल अखबार में परिणाम प्रिंट करने योग्य नहीं होंगे।
एरिक लिपर्ट

22
C # वर्तमान में मैप्स के लिए एक साफ, हल्का वाक्यविन्यास याद कर रहा है, विशेषकर फ़ंक्शंस में पास किए गए नक्शे। विभिन्न गतिशील भाषाओं (रूबी, पायथन, जावास्क्रिप्ट, कोल्ड फ्यूजन 9) के लिए एक साफ, हल्का वाक्यविन्यास है, कुछ को विस्तारित करने के लिए।
yfeldblum

28
ओह, मुझे लगता है कि यह सुखद है। नक्शे के लिए एक वाक्यविन्यास के रूप में, हाँ, यह बहुत अच्छा होगा यदि हम नया {{"करो", "एक हिरण"}, {"रे", "सुनहरा सूरज"} ...} कर सकते हैं और संकलक का पता लगा सकते हैं एक नक्शे का निर्माण, जैसा कि नया [] {1, 2,3} एक अंतर सरणी के निर्माण को प्रभावित करता है। हम इन चीजों पर विचार कर रहे हैं।
एरिक लिपपार्ट

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

जवाबों:


147

इससे खराब इंटरोप होता है। उदाहरण के लिए, इस C # - F # उदाहरण पर विचार करें

सी#:

public class Class1
{
    public static void Foo(Func<object, string> f)
    {
        Console.WriteLine(f.Method.GetParameters()[0].Name);
    }
}

एफ #:

Class1.Foo(fun yadda -> "hello")

परिणाम:

"आर्ग" मुद्रित है ("यद्दा" नहीं)।

नतीजतन, पुस्तकालय डिजाइनरों को या तो इन प्रकार की 'गालियों' से बचना चाहिए, या फिर कम से कम 'मानक' अधिभार प्रदान करना चाहिए (जैसे कि स्ट्रिंग नाम को एक अतिरिक्त पैरामीटर के रूप में लिया जाए) यदि वे चाहते हैं कि .नेट भाषाओं में अच्छा इंटरोप हो।


11
तुम नहीं। यह रणनीति केवल गैर-पोर्टेबल है। (यदि यह दूसरे तरीके के उदाहरण के रूप में मदद करता है, तो F # उन तरीकों को ओवरलोड करने में सक्षम हो सकता है जो केवल रिटर्न टाइप में भिन्न होते हैं (टाइप इनवेंशन ऐसा कर सकते हैं)। यह CLR में व्यक्त किया जा सकता है। लेकिन F # इसे अस्वीकार कर देता है, अधिकतर यदि। आपने ऐसा किया है कि, वे API C # से कॉल करने योग्य नहीं होंगे। जब बात आती है तो इंटरॉप की होती है, तो 'एज' फीचर्स में हमेशा ट्रेड-ऑफ होते हैं, इससे आपको क्या फायदा मिलता है।
ब्रायन

32
मुझे कुछ न करने की एक वजह के रूप में नॉन इंटरऑपरेबिलिटी पसंद नहीं है। यदि इंटरऑपरेबिलिटी एक आवश्यकता है तो इसे करें, यदि नहीं, तो इसके बारे में चिंता क्यों करें? यह YAGNI IMHO है।
जॉन फैरेल

15
@jfar: .NET सीएलआर भूमि अंतर में एक पूरी नई डिमेन्सेंस होती है, क्योंकि किसी भी संकलक में उत्पन्न असेंबलियों को किसी अन्य भाषा से प्राप्त किया जाना चाहिए ।
रेमस रूसु

25
मैं मानता हूं कि आपको सीएलएस का अनुपालन करने की आवश्यकता नहीं है, लेकिन यह एक अच्छा विचार जैसा लगता है यदि आप एक पुस्तकालय या नियंत्रण लिख रहे हैं (और यह शुरू करने वाला स्निप एक ग्रिड से है, हाँ?) अन्यथा, आप सिर्फ सीमित कर रहे हैं? आपके दर्शक / ग्राहक आधार
JMarsch

4
शायद यह बदलने के लायक है: Func <object, string> to Expression << Func <object, string >> और यदि आप अभिव्यक्ति के दाहिने हाथ की ओर कसना करते हैं तो केवल स्थिरांक होने पर आपके पास एक कार्यान्वयन हो सकता है जो ऐसा करता है: सार्वजनिक स्थैतिक IDEDIA <string, string> Hash (params Expression <Func <object, string >> [] hash) {शब्दकोश <string, string> values ​​= new Dictionary <string, string> (); foreach (हैश में var func) {मान [func.Parameters [0] .Name] = (string) ((कॉन्स्टेंट एक्सप्रेशन) func.Body) .Value; } रिटर्न मान; }
davidfowl

154

मुझे लगता है कि नाम की वजह से यह बहुत अजीब नहीं है , लेकिन क्योंकि लैम्ब्डा अनावश्यक है ; यह एक अनाम प्रकार का उपयोग कर सकता है और अधिक लचीला हो सकता है:

.Attributes(new { style = "width:100%", @class="foo", blip=123 });

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


4
यह भी अंतर मुद्दों है; नहीं सभी भाषाओं मक्खी पर उस तरह एक गुमनाम प्रकार बनाने का समर्थन करते हैं।
ब्रायन

5
मैं प्यार करता हूं कि किसी ने वास्तव में सवाल का जवाब नहीं दिया, इसके बजाय लोग "यह बेहतर है" तर्क प्रदान करते हैं। : पी यह एक दुरुपयोग है या नहीं?
सैम केसर

7
मुझे इस पर एरिक लिपर्ट की प्रतिक्रिया देखने की दिलचस्पी होगी। क्योंकि यह FRAMEWORK कोड में है । और यह उतना ही भयानक है।
मैट हिंज

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

2
@Arnis - क्यों और अधिक लचीला: यह निहित पैरामीटर नाम है, जो पर भरोसा नहीं कर रहा है हो सकता है कुछ लैम्ब्डा कार्यान्वयन (अन्य भाषाओं) के साथ कारण मुद्दों (मुझे बोली नहीं है) - लेकिन आप यह भी परिभाषित गुणों के साथ नियमित रूप से वस्तुओं का उपयोग कर सकते हैं। उदाहरण के लिए, यदि आप एक हो सकता था HtmlAttributesकी उम्मीद विशेषताएं (IntelliSense के लिए) के साथ वर्ग, और बस के साथ उन लोगों की उपेक्षा nullमूल्यों ...
मार्क Gravell

137

बस मेरी राय में फेंकना चाहता था (मैं MvcContrib ग्रिड घटक का लेखक हूं)।

यह निश्चित रूप से भाषा का दुरुपयोग है - इसमें कोई संदेह नहीं है। हालाँकि, मैं वास्तव में इसे सहज ज्ञान युक्त नहीं मानूंगा - जब आप किसी कॉल को देखते हैं तो Attributes(style => "width:100%", @class => "foo")
मुझे लगता है कि यह बहुत स्पष्ट है कि क्या चल रहा है (यह निश्चित रूप से अनाम प्रकार के दृष्टिकोण से भी बदतर नहीं है)। एक अंतर्मुखी दृष्टिकोण से, मैं मानता हूं कि यह बहुत अपारदर्शी है।

उन लोगों के लिए, MvcContrib में इसके उपयोग पर कुछ पृष्ठभूमि जानकारी ...

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

अगर शब्दकोश शाब्दिकों के लिए C # में कम क्रिया सिंटैक्स होता, तो मैं ग्रिड घटक में इस सिंटैक्स को शामिल नहीं करता। :)

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

इसके अलावा, किसी ने 'प्रतिबिंब ओवरहेड' का उल्लेख किया है और मैं सिर्फ यह बताना चाहता हूं कि वास्तव में इस दृष्टिकोण के साथ बहुत अधिक ओवरहेड नहीं है - इसमें कोई रनटाइम प्रतिबिंब या अभिव्यक्ति संकलन शामिल नहीं है (देखें http://blog.bittercoder.com /PermaLink,guid,206e64d1-29ae-4362-874b-83f5b103727f.aspx )।


1
मैंने अपने ब्लॉग पर कुछ और गहराई से यहाँ उठाए गए कुछ मुद्दों को संबोधित करने का प्रयास किया है: jeremyskinner.co.uk/2009/12/02/lambda-abuse-the-mvccontrib-hash
जेरेमी स्किनर

4
अनाम वस्तुओं की तुलना में यह Intellisense में कोई कम अपारदर्शी नहीं है।
ब्रैड विल्सन

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

50

मैं चाहूंगा की

Attributes.Add(string name, string value);

यह बहुत अधिक स्पष्ट और मानक है और लैम्बडा का उपयोग करके कुछ भी प्राप्त नहीं किया जा रहा है।


20
हालांकि यह है? html.Attributes.Add("style", "width:100%");के रूप में अच्छी तरह से पढ़ा नहीं है style = "width:100%"(वास्तविक HTML उत्पन्न), जबकि style => "width:100%"यह परिणामी HTML में जैसा दिखता है, उसके बहुत करीब है।
जेमी पेनी

6
उनके वाक्यविन्यास जैसे ट्रिक्स के लिए अनुमति देता है ।Attributes (id => 'foo', @class => 'bar', style => 'width: 100%')। फ़ंक्शन हस्ताक्षर, वेरिएबल की संख्या के लिए पैराग्राफ सिंटैक्स का उपयोग करता है: एट्रिब्यूट्स (params Func <object, object> [] args)। यह बहुत शक्तिशाली है, लेकिन मुझे यह समझने में काफी समय लगा कि यह wtf करता है।
रेमस रूसु

27
@ जैमी: सी # कोड को एचटीएमएल कोड की तरह बनाने की कोशिश करना डिज़ाइन डिसिजन के लिए एक बुरा कारण होगा। वे पूरी तरह से अलग-अलग उद्देश्यों के लिए पूरी तरह से अलग भाषा हैं, और उन्हें समान नहीं दिखना चाहिए।
गुफ़ा

17
एक गुमनाम वस्तु "सौंदर्य" का त्याग किए बिना, बस इस्तेमाल किया जा सकता है? .Attributes (नया {id = "foo", @class = "bar", style = "width: 100%"}) ??
फनका

10
@ गफ्फा यह डिजाइन निर्णयों के लिए एक बुरा कारण क्यों होगा? उन्हें एक जैसा क्यों नहीं दिखना चाहिए? उस तर्क से उन्हें जानबूझकर अलग दिखना चाहिए ? मैं आपका गलत नहीं कह रहा हूँ, मैं सिर्फ इतना कह रहा हूँ कि आप अपनी बात को पूरी तरह से बताना चाहेंगे।
सामंथा ब्रांहम

45

भूमि पर आपका स्वागत है :)

जब तक आप जानते हैं कि क्या हो रहा है, तब तक इसमें कुछ भी गलत नहीं है। (यह तब है जब इस तरह की बात को अच्छी तरह से प्रलेखित नहीं किया गया है कि कोई समस्या है)।

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

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


3
मैं थोड़ा झिझक रहा था, लेकिन मैं सहमत हूं। प्रतिबिंब ओवरहेड के अलावा, स्ट्रिंग का उपयोग करने के बीच कोई महत्वपूर्ण अंतर नहीं है जैसा कि Add () बनाम एक लंबोर्ड पैरामीटर नाम का उपयोग करके किया गया है। कम से कम जो मैं सोच सकता हूं। आप इसे मूक कर सकते हैं और दोनों तरीकों को नोट किए बिना "sytle" टाइप कर सकते हैं।
सामन्था ब्रांहम

5
मैं यह पता नहीं लगा सका कि यह मेरे लिए अजीब क्यों नहीं था, और फिर मुझे रेल याद आ गई। : D
Allyn

43

यह एक से अधिक स्तरों पर भयानक है। और नहीं, यह रूबी जैसा कुछ भी नहीं है। यह C # और .Net का दुरुपयोग है।

इसे और अधिक सीधे तरीके से करने के कई सुझाव दिए गए हैं: ट्यूपल्स, अनाम प्रकार, एक धाराप्रवाह इंटरफ़ेस और इसी तरह।

क्या यह इतना बुरा है कि अपने अच्छे के लिए अपने फैंसी तरीका है:

  • क्या होता है जब आपको वीबी से यह कॉल करने की आवश्यकता होती है?

    .Attributes(Function(style) "width:100%")

  • इसकी पूरी तरह से सहज ज्ञान युक्त, अंतर्मुखी यह पता लगाने में थोड़ी मदद देगा कि सामान को कैसे पास किया जाए।

  • इसका अनावश्यक रूप से अक्षम होना।

  • किसी को भी कोई सुराग नहीं होगा कि इसे कैसे बनाए रखा जाए।

  • विशेषताओं में जाने वाले तर्क का प्रकार क्या है Func<object,string>? उस इरादे का खुलासा कैसे हुआ। आपका अंतर्मुखी दस्तावेज क्या कहने जा रहा है, "कृपया सभी मूल्यों की अवहेलना करें"

मुझे लगता है कि आप विद्रोह की उन भावनाओं को पूरी तरह से उचित ठहरा रहे हैं।


4
मैं कहूंगा - यह पूरी तरह से सहज है। :)
अर्निस लैप्स डे

4
आप कहते हैं यह रूबी जैसा कुछ नहीं है। लेकिन यह रूबी की सिचुएशन की तरह हैश की कीज़ और वैल्यूज़ को निर्दिष्ट करने के लिए बहुत कुछ है।
चार्ली फूल

3
कोड जो अल्फा-रूपांतरण के तहत टूटता है! मार!
फिल

3
@ चार्ली, वाक्यात्मक रूप से यह समान दिखता है, शब्दार्थ रूप से यह अलग है।
सैम केसर

39

मैं "सिंटैक्स ब्राइटनेस" शिविर में हूँ, अगर वे इसे स्पष्ट रूप से दस्तावेज करते हैं, और यह इस भयावह शांत दिखता है, तो इसके साथ लगभग कोई समस्या नहीं है!


10
आमीन, भाई। आमीन (टिप्पणियों के लिए न्यूनतम लंबाई को पूरा करने के लिए आवश्यक 2 वें :) :)
चार्ली फूल

आपकी टिप्पणी अकेले जरूरत से ज्यादा थी। लेकिन फिर, आप केवल एक बार आमीन नहीं कर सकते हैं और फिर अपनी टिप्पणी में रख सकते हैं: डी
स्लीपर स्मिथ

37

वो दोनों। यह लैम्ब्डा एक्सप्रेशन और सिंटैक्स ब्रिलियन्स का अपमान है ।


16
तो यह लांबा अभिव्यक्ति का एक शानदार वाक्यविन्यास दुरुपयोग है? मुझे लगता है कि मैं सहमत हूं :)
सेठ पेट्री-जॉनसन डे

21

मैं शायद ही कभी इस तरह के उपयोग के पार आया था। मुझे लगता है कि यह "अनुचित" है :)

यह उपयोग का सामान्य तरीका नहीं है, यह सामान्य सम्मेलनों के साथ असंगत है। इस तरह के सिंटैक्स में पेशेवरों और विपक्षों की भूमिका होती है:

विपक्ष

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

पेशेवरों

  • डेवलपर द्वारा इस सिंटैक्स में समायोजित किए जाने के बाद यह अधिक पठनीय है।

निचला रेखा - सार्वजनिक एपीआई डिज़ाइन में मैंने अधिक स्पष्ट तरीके से चुना होगा।


2
@ अलीशा - आपके पेशेवरों और विपक्ष उलट हैं। कम से कम मुझे आशा है कि आप यह नहीं कह रहे हैं कि एक प्रो "सहज नहीं" कोड है। ;-)
मेट्रो स्मर्फ़

इस विशेष मामले के लिए - लैम्ब्डा पैरामीटर नाम और स्ट्रिंग पैरामीटर दोनों नाजुक हैं। यह xml पार्सिंग के लिए गतिशील का उपयोग करने जैसा है - यह उचित है क्योंकि आप वैसे भी xml के बारे में निश्चित नहीं हो सकते।
अर्निस लैप्सा 8

19

नहीं, यह निश्चित रूप से आम बात नहीं है। यह प्रति-सहज है, कोड को देखने का कोई तरीका नहीं है कि वह क्या करता है। आपको यह जानना होगा कि इसका उपयोग कैसे किया जाता है, इसे कैसे समझा जाए।

प्रतिनिधियों की एक सरणी का उपयोग करके विशेषताओं की आपूर्ति करने के बजाय, तरीकों का पीछा करना स्पष्ट होगा और बेहतर प्रदर्शन करेंगे:

.Attribute("style", "width:100%;").Attribute("class", "test")

हालांकि यह टाइप करने के लिए थोड़ा अधिक है, यह स्पष्ट और सहज है।


6
वास्तव में? मुझे पता था कि कोड के उस स्निपेट का इरादा क्या था जब मैंने इसे देखा। जब तक आप बहुत सख्त न हों, यह ऐसा नहीं है। एक स्ट्रिंग तर्क के लिए ओवरलोडिंग + के बारे में एक ही तर्क दे सकता है, और इसके बजाय हमें हमेशा एक कॉनैट () पद्धति का उपयोग करना चाहिए।
सामन्था ब्रांथम

4
@Stuart: नहीं, आप बिल्कुल नहीं जानते थे, आप सिर्फ इस्तेमाल किए गए मूल्यों के आधार पर अनुमान लगा रहे थे। कोई भी व्यक्ति यह अनुमान लगा सकता है, लेकिन अनुमान लगाना कोड को समझने का अच्छा तरीका नहीं है।
ग्यूफा

11
मैं अनुमान लगा रहा हूं कि यह .Attribute("style", "width:100%")मुझे देता है style="width:100%", लेकिन मुझे पता है कि यह मुझे दे सकता है foooooo। मैं अंतर नहीं देख रहा हूं।
सामन्था ब्रंथम

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

1
@ राउटर: यदि आप कोड पढ़ते समय हमेशा अनुमान लगा रहे हैं, तो आपको कोड पढ़ने में बहुत मुश्किलें होनी चाहिए ... अगर मुझे "करीब" नामक एक विधि का कॉल दिखाई देता है, तो मैं इकट्ठा कर सकता हूं कि कक्षा का लेखक नामकरण सम्मेलनों के बारे में नहीं जानता है , इसलिए मुझे इस बात की बहुत हिचकिचाहट होगी कि जो कुछ भी किया जाता है, उसके बारे में कुछ भी करने में संकोच नहीं करना चाहिए।
गुफ्फा

17

क्या मैं इसका इस्तेमाल किसी वाक्यांश को गढ़ने के लिए कर सकता हूं?

Magic lambda (n): एक लैम्ब्डा फ़ंक्शन का उपयोग पूरी तरह से एक मैजिक स्ट्रिंग को बदलने के उद्देश्य से किया जाता है।


हाँ ... यह मज़ेदार है। और शायद यह जादुई थोड़े है, बिना किसी संकलन समय सुरक्षा के अर्थ में, क्या ऐसी जगह है जहां इस उपयोग से संकलन-समय त्रुटियों के बजाय रनटाइम का कारण होगा?
मैस्लो


16

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

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

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

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


12

यह अभिव्यक्ति के पेड़ के फायदों में से एक है - कोई भी अतिरिक्त जानकारी के लिए स्वयं कोड की जांच कर सकता है। यह कैसे .Where(e => e.Name == "Jamie")बराबर एसक्यूएल कहां खंड में परिवर्तित किया जा सकता है। यह अभिव्यक्ति के पेड़ों का एक चतुर उपयोग है, हालांकि मुझे उम्मीद है कि यह इससे आगे नहीं बढ़ेगा। कुछ भी अधिक जटिल होने की संभावना कोड की तुलना में अधिक कठिन होने की संभावना है, इसलिए मुझे संदेह है कि यह स्वयं सीमित होगा।


एक मान्य बिंदु है, लेकिन विज्ञापन में सच्चाई है: LINQ TableAttribute और ColumnAttribute जैसी विशेषताओं के एक पूरे सेट के साथ आता है जो इसे एक अधिक वैध संबंध बनाते हैं। इसके अलावा लाइनिंग मैपिंग क्लास के नाम और प्रॉपर्टी के नाम को देखती है, जो यकीनन एक पैरामीटर नाम से ज्यादा स्थिर होते हैं।
रेमुस रूसू

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

7

यह एक दिलचस्प दृष्टिकोण है। यदि आपने अभिव्यक्ति के दाहिने हाथ को विवश किया है तो केवल तभी आप उपयोग कर सकते हैं

Expression<Func<object, string>>

जो मुझे लगता है कि आप प्रतिनिधि के बजाय वास्तव में क्या चाहते हैं (आप दोनों पक्षों के नाम प्राप्त करने के लिए लैम्ब्डा का उपयोग कर रहे हैं) नीचे दिए गए कार्यान्वयन को देखें:

public static IDictionary<string, string> Hash(params Expression<Func<object, string>>[] hash) {
    Dictionary<string, string> values = new Dictionary<string,string>();
    foreach (var func in hash) {
        values[func.Parameters[0].Name] = ((ConstantExpression)func.Body).Value.ToString();
    }
    return values;
}

यहां तक ​​कि क्रॉस लैंग्वेज इंटरॉप चिंता का भी समाधान हो सकता है जो पहले धागे में बताई गई थी।


6

कोड बहुत चालाक है, लेकिन यह संभावित रूप से अधिक समस्याओं का कारण बनता है जो इसे हल करता है।

जैसा कि आपने बताया है, अब पैरामीटर नाम (शैली) और एक HTML विशेषता के बीच एक अस्पष्ट निर्भरता है। कोई संकलन समय जाँच नहीं है। यदि पैरामीटर नाम गलत है, तो पृष्ठ में शायद रनटाइम त्रुटि संदेश नहीं होगा, लेकिन लॉजिक बग (कोई त्रुटि नहीं, लेकिन गलत व्यवहार) खोजने के लिए बहुत कठिन है।

एक बेहतर समाधान यह होगा कि एक डेटा सदस्य हो जिसे संकलन समय पर जांचा जा सके। इसलिए इसके बजाय:

.Attributes(style => "width:100%");

स्टाइल प्रॉपर्टी वाले कोड को कंपाइलर द्वारा जांचा जा सकता है:

.Attributes.Style = "width:100%";

या और भी:

.Attributes.Style.Width.Percent = 100;

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


3
मैं संकलन-समय की जाँच की सराहना करता हूं, लेकिन मुझे लगता है कि यह राय के मामले में नीचे आता है। हो सकता है कि कुछ नई विशेषताएँ () {शैली: "चौड़ाई: 100%"} इस पर अधिक लोगों को जीतेंगी, क्योंकि यह अधिक प्रचलित है। फिर भी, सब कुछ लागू करने की अनुमति देता है HTML एक बहुत बड़ा काम है और मैं किसी को दोष नहीं दे सकता केवल तार / लैम्ब्डा / अनाम कक्षाओं का उपयोग करने के लिए।
सामन्था ब्रांथम

5

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

जब आप मूल्य निर्धारित करने के लिए एक कुंजी जोड़ने की जरूरत नहीं है, तो हम IDEDIA (या नहीं) से विरासत में प्राप्त कर सकते हैं और एक php सरणी की तरह व्यवहार करता है कि एक सूचकांक प्रदान करते हैं। यह .net शब्दार्थ का न केवल c # का एक मान्य उपयोग होगा, और अभी भी प्रलेखन की आवश्यकता है।

उम्मीद है की यह मदद करेगा


4

मेरी राय में यह लंबोदर का दुरुपयोग है।

सिंटैक्स प्रतिभा के रूप में मैं style=>"width:100%"सादा भ्रामक लगता है। =>इसके बजाय विशेष रूप से=


4

IMHO, यह करने का एक अच्छा तरीका है। हम सभी इस तथ्य से प्यार करते हैं कि एक वर्ग नियंत्रक का नामकरण यह एमवीसी में एक नियंत्रक बना देगा? तो ऐसे मामले हैं जहां नामकरण मायने रखता है।

साथ ही इरादा यहाँ बहुत स्पष्ट है। यह समझना बहुत आसान है कि .Attribute( book => "something")परिणाम होगा book="something"और इसमें .Attribute( log => "something")परिणाम होगाlog="something"

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


4
यदि आप नियंत्रक से भी वारिस नहीं हैं, तो एक वर्ग नियंत्रक का नामकरण नहीं करेंगे ...
जॉर्डन वॉलवर्क

3

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


1

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

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