क्या व्यावसायिक सॉफ्टवेयर में लैम्बडा फ़ंक्शंस \ विधियों का उपयोग करना स्वीकार्य है?


26

मैंने यहाँ पोस्ट पर ध्यान दिया है कि बहुत अधिक पुनरावृत्ति के बिना मध्य विचार में छेद को हल करने के लिए डेलीगेट्स \ lambda फ़ंक्शंस के उपयोग का प्रदर्शन: http://www.markhneedham.com/blog/2009/04/04/functional-c -इस छेद में मध्यम पैटर्न /

समस्या यह प्रतीत होती है कि जूनियर डेवलपर्स और अन्य जरूरी नहीं समझते हैं कि फ़ंक्शन पॉइंटर \ डेलिगेट \ _ लैम्ब्डा फंक्शन कॉन्सेप्ट क्या है, जो कोड को और अधिक कठिन बनाता है।

क्या हमें व्यावसायिक सॉफ़्टवेयर, विशेषकर छोटी टीम या एकमात्र डेवलपर दुकानों में इस उपकरण के उपयोग से बचना या गंभीर रूप से सीमित करना चाहिए?

या क्या यह उचित टिप्पणियों के साथ उपयोग करने के लिए स्वीकार्य है और उम्मीद करता है कि जब मैं आसपास नहीं रहूंगा तो अगला डेवलपर लैम्ब्डा फ़ंक्शन के बारे में समझेगा या सीखेगा?


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

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

3
क्या होगा यदि एक जूनियर कोडर लैम्ब्डा का उपयोग करना चाहता है, लेकिन चिंतित है कि पुराने सी ++ हैकर्स इसे प्राप्त नहीं करने जा रहे हैं? न तो लैम्ब्डा, न ही जैसे लगता है ... एल्गोरिदम का उपयोग व्यावसायिक सॉफ्टवेयर में किया जाना चाहिए।
नौकरी

10
यदि यह इस दृष्टिकोण के लिए था, तो हम अभी भी दो मोनोक्रोम मॉनिटरों को रगड़कर आग बना देंगे।
sbi

3
विश्वविद्यालय सी पाठ्यक्रमों में अच्छी तरह से कार्य करने के लिए संकेत दिए गए हैं। और आपके पास C # में प्रतिनिधि भी हैं, इसलिए लगभग किसी भी डेवलपर को डेटा प्रकार / पैरामीटर के रूप में कार्यों के साथ काफी सहज होना चाहिए। वह कोड लिखें जिसे आप सबसे अच्छा लिख ​​सकते हैं।
डैनियल इवानोव

जवाबों:


23

समस्या यह है कि जूनियर डेवलपर्स और अन्य लोगों को यह समझना जरूरी नहीं है कि फ़ंक्शन पॉइंटर \ डेलिगेट \ _ लैम्ब्डा फंक्शन कॉन्सेप्ट क्या है

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

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

एक डेवलपर को पता होना चाहिए कि वे जिस भाषा का उपयोग कर रहे हैं, वह कनिष्ठ है या नहीं। यदि वे नहीं करते हैं, तो उन्हें फायर करें और ऐसा कोई व्यक्ति खोजें जो ऐसा करता है, या उन्हें प्रशिक्षित करता है ताकि वे ऐसा करें।


11
खैर, मैं
लंबोदा

49

हाँ, उनका उपयोग करें।

मैं एक जूनियर डेवलपर हूं, और मैं लंबदा को जानता हूं / समझता हूं (और आपके द्वारा उल्लेखित अन्य अवधारणाएं)। कुछ भी नहीं है कि मैं एक जूनियर डेवलपर को उन सभी अवधारणाओं को बहुत कम समय में सीखने से रोक सकता हूं। सॉफ्टवेयर डेवलपमेंट के कई सारे गोचरों की बात आने पर जूनियर्स के पास उतना अनुभव / विशेषज्ञता नहीं हो सकती है, हालांकि, लैम्ब्डा जैसी अवधारणाएं प्रोग्रामिंग की मूल समझ और इंटरनेट कनेक्शन के साथ किसी को भी आसानी से समझी जा सकती हैं। इसके अलावा, यह अजीब लगता है कि आपने उदाहरण के रूप में लैम्ब्डा को चुना है, यदि आप C # का उपयोग कर रहे हैं, तो संभावना है कि आपके पास ऐसा नहीं है कि जूनियर डेवलपर्स पर लैम्ब्डा सीखने पर एक सिर शुरू होता है (वे केवल 2008 में पेश किए गए थे, अगर मैं ठीक से याद है)।

संक्षेप में, हमें neophytes के लिए अपने कोड को गूंगा करने की कोई आवश्यकता नहीं है। हम बस ठीक हो जाएंगे, और वास्तव में आपके साथ आने वाले सर्वोत्तम संभव कार्यान्वयन पर काम करना पसंद करेंगे। :)


4
जब तक हम, न्योफाइट्स धीमे होते हैं। उस स्थिति में कृपया हमारे लिए कोड को डंबल करें, या ... हमें पहले स्थान पर न रखें।
जॉब

19
@ जोब - मुझे लगता है कि हमें अभी खुलकर कहना है और कहा है कि अगर कोई जूनियर एक दो दिन दिए गए लंबोदर सिंटैक्स को नहीं समझ सकता है (बहुत उदार हो रहा है), तो यह वास्तव में एक भर्ती मुद्दा हो सकता है।
मॉर्गन हेरलॉकर

2
Neophytes को stackoverflow.com/questions/2167360/… पर इंगित करें ... यह उस समय मेरे प्रश्न का एक उत्कृष्ट उत्तर था और इसने Linq और lambdas की मेरी समझ को स्प्रिंगबोर्ड में मदद की।
आइब्रीस्ट

20

यदि वे आपकी समस्या का एक समझदार समाधान हैं तो आपको उनका उपयोग करना चाहिए।

अपने आप को कृत्रिम रूप से प्रतिबंधित न करें - आप खराब गुणवत्ता कोड के साथ समाप्त होने की अधिक संभावना रखते हैं जो बनाए रखना मुश्किल है।

यदि कोड अच्छी तरह से उपयुक्त टिप्पणियों के साथ लिखा गया है, तो निम्नलिखित लोगों को आपसे सीखने में सक्षम होना चाहिए ।


13

एक ब्लॉक के शीर्ष पर टिप्पणियों में msdn प्रलेखन के लिए एक लिंक रखो जो इसका उपयोग करता है फिर आगे बढ़ें। आपको नई / जटिल तकनीक का उपयोग करने से डरना नहीं चाहिए, इसके डेवलपर्स का हिस्सा उन चीजों को सीखने के लिए है जो वे नहीं जानते हैं।


14
क्या वास्तव में एक लिंक भी आवश्यक है?
मॉर्गन हेरलॉकर

3
क्या आप लैंबडा का उपयोग करने के लिए हर बार एक लिंक डालेंगे?
फेडेरिको क्लेज़ कुल्लोका

जटिलता दुश्मन है ...
रॉबर्ट एस सियाकियो

11

समस्या यह है कि जूनियर डेवलपर्स और अन्य लोगों को यह समझना जरूरी नहीं है कि फ़ंक्शन पॉइंटर \ डेलिगेट \ _ लैम्ब्डा फंक्शन कॉन्सेप्ट क्या है

फिर उन्हें सीखने की जरूरत है। अवधि।

  1. यह C # का गूढ़ कोना नहीं है । आप उन्हें कई .Net पुस्तकालयों का उपयोग करने के लिए समझना चाहिए।
  2. यह सामान्य रूप से एक गूढ़ भाषा विषय नहीं है। वस्तुतः लोकप्रिय उपयोग की हर भाषा में आज फ़ंक्शन पॉइंटर के कुछ स्वाद हैं, और अधिकांश (या जल्द ही जावा और सी ++ के मामले में) बंद हो रहे हैं।

बस उन्हें यह समझाने में कुछ मिनट लग जाएं। यह मुश्किल नहीं है।


5

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

फ़ंक्शन पॉइंटर \ डेलिगेट \ lambda फ़ंक्शन अवधारणा

यह ध्यान दिया जाना चाहिए कि वे तीन अलग-अलग चीजें हैं।


3

दो संभावित परिदृश्य:

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

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


2

यह वह जगह है जहाँ संगति बहुत मदद कर सकती है। यदि आप इसे एक ही शैली के साथ लगातार उपयोग करते हैं, आदि, तो पाठकों को केवल इसे एक बार सीखना होगा, और फिर वे इसे हर जगह पहचानते हैं।

इसके अलावा, यह स्पष्ट होने में मदद कर सकता है, कम से कम पहले। उदाहरण के लिए, ये दोनों बराबर हैं:

doSomething(() => someMethod());

doSomething(someMethod);

private void doSomething(Action someAction) { ... }
private void someMethod() { ... }

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

मुझे पता है कि ReSharper इसे दूसरे मामले में बदलने के लिए आपको धक्का देता है, लेकिन मुझे आश्चर्य है कि अगर यह हमेशा एक अच्छा विचार है। दूसरे मामले में, आपको यह जानना होगा कि doSomethingAction


1
मैं दूसरे का उपयोग करता हूं, मैं देखता हूं कि someMethod पास है, और यह निर्धारित करने के लिए कि someMethod क्या है, मैं राइट क्लिक करूंगा, और def'n पर जाऊंगा। यह एक समारोह / विधि है और यह उस बिंदु पर किसी भी प्रोग्रामर को समझाना चाहिए।
कैफीक

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

"दूसरे मामले में, आपको यह जानना होगा कि doSomethingएक लेता है Action।" और कैसे है कि किसी को पता है कि functionWithNameThatDoesNotSpecifyItsArgumentTypesएक लेता है से अलग है ObjectOfSomeType? वास्तव में, उन भाषाओं में जहां फ़ंक्शंस सत्य प्रथम श्रेणी के ऑब्जेक्ट हैं, यह कोई भिन्न नहीं है।
JAB

1

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

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


1
itemsList.ForEach(item => DoAction(item));
...
public void DoAction(Item item) {
  //...do various things here...
}

अब, शायद यहाँ हम DoAction कह रहे हैं क्योंकि इसका शरीर लैंबडा के भीतर फिट होने के लिए बहुत लंबा है। उस स्थिति में, ForEach () एक्सटेंशन मेथड टू लिस्ट का उपयोग करने से हमें नियमित रूप से फॉर्च्यूनर लूप का उपयोग करने पर बहुत अधिक लाभ नहीं मिलता है, हालांकि यह कोड की कुछ पंक्तियों को सहेजता है, मुझे लगता है। लेकिन इस विशेष मामले में, ForEach () का उपयोग करके हमें कुछ ऐसा करने में ललचाया जा सकता है जो वास्तव में अधिक कोड ले रहा है, और स्टैक पर कुछ अतिरिक्त थ्रैशिंग का कारण बनता है; तर्क पारित करने के लिए एक लैम्ब्डा बनने की आवश्यकता नहीं है

आपको बस DoAction को इस तरह से कॉल करना चाहिए:

itemsList.ForEach(DoAction);

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


-1

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

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

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