2009-12-16 14 views
15

मेरा सहकर्मी इस के साथ आया और मुझे आश्चर्य है कि दूसरों को क्या लगता है? व्यक्तिगत रूप से, मुझे यह दिलचस्प लगता है लेकिन आश्चर्य है कि क्या यह प्रस्थान बहुत बड़ा है? नीचे कोड उदाहरण। नीचे विस्तार विधियां।अधिक धाराप्रवाह सी #/.NET

सामान्य विचार कृपया। अन्य एक्सटेंशन विधियों को जोड़ा जा सकता है?

var ddl = Page.FindControl("LocationDropDownList") as DropDownList; 

ddl.Visible = true; 
ddl.SelectedValue = "123"; 

if(isAdmin) 
    ddl .SelectedValue = "111"; 

बन जाता है:

Page.FindControl("LocationDropDownList") 
    .CastAs<DropDownList>() 
    .With(d => d.Visible = true) 
    .With(d => d.SelectedValue = "123") 
    .WithIf(isAdmin, d => d.Items.Add(new ListItem("Admin", "1"))); 

या:

Page.FindControl("LocationDropDownList") 
     .CastAs<DropDownList>() 
     .With(d => 
     { 
      d.Visible = true; 
      d.SelectedValue = "123"; 
     }) 
     .WithIf(isAdmin, d => d.SelectedValue = "111"); 

एक्सटेंशन तरीके:

public static TResult CastAs<TResult>(this object obj) where TResult : class 
{ 
    return obj as TResult; 
} 

public static T With<T>(this T t, Action<T> action) 
{ 
    if (action == null) 
     throw new ArgumentNullException("action"); 

    action(t); 

    return t; 
} 

public static T WithIf<T>(this T t, bool condition, Action<T> action) 
{ 
    if (action == null) 
     throw new ArgumentNullException("action"); 

    if (condition) 
     action(t); 

    return t; 
} 
+19

** प्रत्येक डिज़ाइन को एक समस्या का समाधान करना चाहिए। ** इस धाराप्रवाह एपीआई डिज़ाइन को हल करने का प्रयास करने में क्या समस्या है? ऐसा लगता है कि मूल्य बनाने के बिना जटिलता जोड़ना प्रतीत होता है। – LBushkin

+2

यह एक बाजुका के साथ एक मक्खी मारने की कोशिश की तरह है! जीतने के लिए कुछ भी नहीं है, कोड की बस और रेखाएं। – JOBG

+0

मेरे दिमाग में, 'ifIf' एक सरल अगर कथन से बहुत कम पठनीय है। यदि आप "धाराप्रवाह" इंटरफ़ेस करने जा रहे हैं, तो कम से कम इसे आसानी से पढ़ें! –

उत्तर

59

स्पष्ट कोड लिखने के लिए अंगूठे के मेरे नियमों में से एक है: सभी दुष्प्रभावों को बयानों में डाल दें; गैर-कथन अभिव्यक्तियों का कोई साइड इफेक्ट नहीं होना चाहिए।

कार्यक्रम का आपका पहला संस्करण स्पष्ट रूप से इस नियम का पालन करता है। दूसरा संस्करण स्पष्ट रूप से इसका उल्लंघन करता है।

एक अतिरिक्त विचार: यदि मैं आपके द्वारा प्रदर्शित कोड की तरह कोड पढ़ना चाहता था, तो मैं स्वाभाविक रूप से मानता हूं कि कोड का उद्देश्य आलसी-मूल्यांकन संरचना का निर्माण करना था जो उन परिचालनों का प्रतिनिधित्व करता था - यह बिल्कुल सही है क्यों सी # 3 में पूछताछ की समझ इस तरह से बनाई गई है। क्वेरी अभिव्यक्ति का परिणाम एक वस्तु है जो क्वेरी के स्थगित अनुप्रयोग का प्रतिनिधित्व करती है।

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

+1

+1। – LBushkin

+3

इस आईएमएचओ जैसे मामलों के लिए एक और दिशानिर्देश यह है कि: ** प्रत्येक डिज़ाइन को समस्या का समाधान करना चाहिए **। यह स्पष्ट नहीं है कि यहां वास्तव में धाराप्रवाह एपीआई क्या समस्या हल करने की कोशिश कर रही है। – LBushkin

+1

विशेषज्ञ की तरह लगता है। – andleer

49

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

पहले संस्करण की तुलना में, यह टाइप करना कठिन, कम स्पष्ट, और कम प्रदर्शन करने वाला है।

+9

+1, बिल्कुल कोई लाभ नहीं, और अब जो भी कोड पढ़ता है उसे 'WithIf' (भयानक नाम, वैसे) और मित्रों को समझने के लिए देखना होगा। –

+1

@ मक्वांडर, मैं असहमत हूं, यह सिर्फ "साथ" शब्द है जो भ्रम पैदा कर रहा है। अगर यह "करो" था, तो यह स्पष्ट रूप से स्पष्ट होगा। – grenade

+0

@ ग्रेनेट: यहां तक ​​कि, 'Do (d =>)' भाग बहुत अनावश्यक लगता है। – peterchen

4

अगर मैंने इसे कभी देखा तो कुछ विस्तार विधि दुरुपयोग है!

11

मुझे लगता है कि मैं यह देखने में असफल रहा कि नए संस्करण आपको क्या प्राप्त करते हैं। मूल बहुत स्पष्ट है और कम शब्दशः है। मुझे लगता है कि यह भी तेज होगा। मैं इस तरह की भाषा सुविधाओं का उपयोग (दुरुपयोग?) का उपयोग करने से बचूंगा जब तक कि कोई स्पष्ट लाभ न हो।

4

वे सिर्फ अलग कोडिंग शैलियों हैं, "आपका बहुत बड़ा प्रस्थान" का क्या मतलब है? क्या से प्रस्थान? आप किस चीज से उपयोग कर रहे हैं? केवल आप ही तय कर सकते हैं। मैं कहूंगा कि वीबी के With ब्लॉक ने कोड पठनीयता के लिए अच्छा से अधिक नुकसान किया है, और मैं सी # में व्यवहार को दोहराने की कोशिश नहीं करता, लेकिन यह सिर्फ मेरा वरीयता है।

मैं बहुत ज्यादा हमेशा इस FindControl के लिए उपयोग करते हैं (हाँ, दृढ़ता से RepeaterItem के लिए लिखा था, यह होना जरूरी नहीं है, लेकिन है कि केवल एक चीज मैं कभी भी किसी भी तरह के लिए इसका इस्तेमाल करते हैं है):

public static T FindControl<T>(this RepeaterItem item, string id) 
{ 
    return item.FindControl(id) as T; 
} 

और आह्वान यह इतना पसंद:

Literal myLiteral = e.Item.FindControl<Literal>("myLiteral"); 
+0

मुझे लगता है कि अधिक सामान्य सी # कोडिंग शैलियों से प्रस्थान होता है। निश्चित रूप से मेरे संगठन के कोडिंग मानकों से एक प्रस्थान। – andleer

+0

जबकि मैं अभी भी कहूंगा कि यह आपकी पसंद के लिए अधिकतर है, मैं यह जोड़ूंगा कि अगर आपके संगठन के पास कोडिंग मानकों हैं, तो आपको आदर्श रूप से उनसे नहीं जाना चाहिए * * –

2

मेरे 2 सेंट: यह ठीक लग रहा है, मेरी ही टिप्पणी है कि "के साथ" एक तरह से की तरह "कहाँ" या "के बाद" जब आप वास्तव में एक संपत्ति सेट कर रहे हैं कुछ का तात्पर्य है। मैं "Do", "निष्पादित करें" या "सेट" जैसे किसी विधि का एक विधि नाम सुझाता हूं, लेकिन हो सकता है कि यह सिर्फ मेरी अजीब दुनिया के दृश्य को देख सके।

कैसे के बारे में:

Page.WithControl<DropDownList>("LocationDropDownList") 
    .Do(d => d.Visible = true) 
    .Do(d => d.SelectedValue = "123") 
    .DoIf(isAdmin, d => d.Items.Add(new ListItem("Admin", "1"))); 
+0

() का उपयोग किया जा सकता है मूल्यों को निकालें या "प्राप्त करें" भी। .थ (डी => fred = d.Text) – andleer

+0

मेरा मतलब है कि "इसके साथ" (मेरे लिए) ऐसा लगता है कि आप एक मान की जांच कर रहे हैं जैसे: .with (d => d.Text == "Foo ") के रूप में एक क्रिया निष्पादित करने के विरोध में।के साथ (डी => DoStuff (डी)) हो सकता है: .xecute (डी => DoStuff (डी)) या। डीओ (डी => DoStuff (डी)) – grenade

+0

सहमत हैं। चलो() से बेहतर विकल्प है() – andleer

0

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

+2

यह इनोवेशन को वापस रखने का कोई कारण नहीं है। यह आपके साथियों को पढ़ाने और आगे बढ़ने में मदद करने का एक कारण है। –

+4

सही चीज़ से बचने के लिए व्यावहारिक या बुद्धिमान नहीं है क्योंकि अन्य लोगों के पास भाषा का उचित कार्य ज्ञान नहीं हो सकता है। हाथ में सवाल यह होना चाहिए कि यह सही बात है या नहीं। – mquander

+0

मैं इन टिप्पणियों से सहमत हूं। नई चाल और अवधारणाओं को सीखना प्रोग्रामिंग करना आगे बढ़ना और सांस लेने के लिए शार्क करना है। आपको यह करना है या आप मर जाते हैं। – andleer

4

मैं पहले संस्करण के साथ अधिक आरामदायक हूं। पढ़ने और समझने में कम समय लगता है। मैं मानता हूं कि विस्तार विधियां भी ठीक हैं यदि आप इससे परिचित हैं और साथ ही विधि से परिचित हैं, लेकिन इस मामले में इसका क्या फायदा है?

5

यह एक्सटेंशन का एक दिलचस्प उपयोग है, और मैं अकेले उस योग्यता पर इसकी सराहना करता हूं। मुझे यकीन नहीं है कि मैं इसका इस्तेमाल करूंगा, लेकिन अगर आपकी टीम इसे पसंद करती है, तो हर तरह से इसका इस्तेमाल करें।

9

"उपयोगी नहीं" के लिए एक और वोट। With एक्सटेंशन विधि किसी विधि के साथ अनुक्रमित कथन को लपेटकर कुछ भी नहीं करती है। सी # में पहले से ही अनुक्रमित कथन के लिए एक अंतर्निहित फ़ंक्शन है, जिसे ; कहा जाता है।

इसी प्रकार, WithIf नियंत्रण प्रवाह में किसी भी संशोधन के बिना एक if-statement को लपेटता है। देखने की मेरी बात से, आप केवल अपने आप को जैसे तरीकों को आमंत्रित कर रहे हैं:

public static T For<T>(
    this T t, int start, Func<int, bool> cond, Action<T, int> f) 
{ 
    for(int i = start; cond(i); i++) 
    { 
     f(t, i); 
    } 
    return t; 
} 
1

मैं पहले संस्करण के साथ छड़ी का कहना चाहते हैं। जो आपने पोस्ट किया है वह कोड पढ़ने वाले किसी के लिए तत्काल उपयोगी होने के लिए बहुत चालाक है।

तुम भी एक कदम आगे जाने के लिए और है कि "वर" के साथ भाग कर सकता है:

DropDownList ddl = (DropDownList) Page.FindControl("ddlName"); 
+0

आपने अभी तक किसी भी कारण से DropDownList पुनरावृत्ति प्रस्तुत की है। मैं var पसंद करता हूं ;-) –

+0

@ मेटा-नाइट- कोड स्पष्टता/पठनीयता का पक्ष लेने का कारण विशेष रूप से उन सी # निर्माण से अपरिचित लोगों के लिए है। –

2

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

6

मूल अधिक पढ़ने योग्य है।

सरल एपीआई परिवर्तन वस्तु FindControl() एक बिल्डर-esque बात द्वारा वापस बनाने के लिए (जहां पूरी तरह से तैयार तरीकों वापसी 'इस') होगा:

Page.FindControl("LocationDropDownList") 
    .setVisible(true) 
    .setSelectedValue(isAdmin ? "111" : "123"); 
2

ऐसा लगता है कि अपने सह कार्यकर्ता एक है लैम्ब्डा जुंकी।

+0

हां। प्रमुख जंकी! – andleer

2

मुझे लगता है कि पठनीयता का सवाल व्यक्तिपरक है और मैंने व्यक्तिगत रूप से आपके द्वारा किए गए कार्यों के साथ कोई समस्या नहीं है। यदि आपके संगठन ने इसे "अनुमोदित" किया है तो मैं इसका उपयोग करने पर विचार करूंगा।

मुझे लगता है कि अवधारणा ध्वनि है और यदि आपने "साथ" को "चलो" में बदल दिया है तो यह अधिक "कार्यात्मक" या "एफ # -ish" होगा। निजी राय।

Page.FindControl("LocationDropDownList")  
    .CastAs<DropDownList>()  
    .Let(d => d.Visible = true) 
    .Let(d => d.SelectedValue = "123"); 
+1

मैं पूरी तरह से सहमत हूं। – grenade

+0

मैं मानता हूं, चलो संभावित रूप से बेहतर नाम है। आम तौर पर, यह आमतौर पर अवधारणा के बारे में नहीं बल्कि इसका नाम कैसे है। – andleer

3

मामूली नोट। व्यक्तिगत अनुभव से, मैं बदल देंगे:

if(isAdmin) 
    ddl.SelectedValue = "111"; 

if(isAdmin) { 
    ddl.SelectedValue = "111"; 
} 

या

if(isAdmin) 
{ 
    ddl.SelectedValue = "111"; 
} 

को यह आपको अभी या बाद में दूर करने में समय की बचत करेंगे।

+7

"यह आपको जल्द या बाद में डिबगिंग में समय बचाएगा।" केवल तभी जब आपके संपादक में ऑटो इंडेंटिंग नहीं है। अन्यथा, मैं एकल-पंक्ति अभिव्यक्तियों के लिए कोई ब्रेसिज़ पसंद नहीं करता हूं। मुझे क्लीनर लग रहा है। – bsneeze

+0

मैं उसी पंक्ति पर एकल-रेखा अभिव्यक्तियों के लिए वोट दूंगा जैसे कि कथन – Scoregraphic

3

यदि यह एक भाषा विशेषता थी:

With(Page.FindControl("LocationDropDownList") as DropDownList) 
{ 
    Visible = true; 
    SelectedValue = "123"; 
    if(isAdmin)  
     Add(new ListItem("111")); 
} 

तुम कुछ जीत जाएंगे: ब्लॉक "के साथ" में उत्परिवर्तित वस्तु की

  • से बचने के अतिरेक
  • सभी भाषा सुविधाएँ उपलब्ध

ऊपर की कोशिश लाभ काटने के बिना शैली का अनुकरण करने के लिए। Cargo Cult

(नोट: मैं इसके खिलाफ विभिन्न तर्क समझ में करते हैं, लेकिन यह अभी भी अच्छा होगा)


संयोग से, मेरी सी ++ Win32 यूआई सहायकों में से कुछ setters कि इसी तरह की चेन का उपयोग क्या आप करना चाहते हैं प्राप्त करें:

LVItem (m_lc, idx) .SetText (_T ("हैलो")) SetImg (12) .SetLParam (id);

उस स्थिति में, मैं कम से कम "कोई रिडंडेंसी" जीतता हूं, लेकिन ऐसा इसलिए है क्योंकि मेरे पास गुण नहीं हैं।

+1

मुझे यह उत्तर पसंद है। यह प्रारंभिक सिंटैक्स जोड़ने की तरह है, लेकिन मौजूदा ऑब्जेक्ट पर। एक उत्कृष्ट दिशानिर्देश के लिए – Dolphin

1

यह एक सही सीखने का मामला है कि इसे और अधिक जटिल बनाने की आवश्यकता है।

पहला संस्करण स्पष्ट है और सामान्य भाषा संरचनाओं से परे कोई अतिरिक्त ज्ञान की आवश्यकता नहीं है।

0

"फ्लुएंट इंटरफेस" सी # के संबंध में पहले से ही शुरुआती लोगों के लिए एक महान वाक्यविन्यास है जो (आईएमएचओ) बेहतर है जो धाराप्रवाह शैली का उपयोग करने की कोशिश कर रहा है। बेशक, आपके उदाहरण में आप एक नई वस्तु शुरू नहीं कर रहे हैं, आप एक मौजूदा बदल रहे हैं। सुविज्ञ इंटरफेस के साथ मेरी पूरी विशेषज्ञता wikipedia की एक 30 सेकंड स्कैन से आता है, लेकिन मुझे लगता है कि JeeBee का जवाब, सुविज्ञ प्रोग्रामिंग की भावना में अधिक है, हालांकि मैं चीजों को थोड़ा बदल सकता है:

Page.FindDropDownList("LocationDropDownList")  
    .setVisible(true)  
    .setAdminSelectedValue("111") 
    .setSelectedValue("123") 

यह तर्क हो सकता है कि यह है अधिक पठनीय, विशेष रूप से गुणों के बिना एक भाषा के लिए, लेकिन मुझे अभी भी लगता है कि यह सी # में समझ में नहीं आता है।

0

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

मुझे टेस्ट कोड विकसित करते समय धाराप्रवाह इंटरफेस बहुत उपयोगी पाया गया है जिसमें अक्सर कई भिन्न वस्तुओं के साथ डोमेन ऑब्जेक्ट्स बनाने के लिए आवश्यक होता है। मैंने सजावटी पैटर्न को पेश करने और अत्यधिक विधि अधिभार को खत्म करने के तरीके के रूप में सफलतापूर्वक उनका उपयोग किया है।

यदि कोई धाराप्रवाह इंटरफेस के बारे में अधिक जानने में रूचि रखता है, तो मैं मार्टिन फाउलर द्वारा work in progress को जांचने का सुझाव देता हूं।

0

अंगूठे का अच्छा शासन:

यदि आपका कोड के अपने पहले छाप है "यह चालाक है" - यह शायद एक अच्छा विचार नहीं है।

अच्छा कोड सरल, पठनीय, और केवल "चालाक" होना चाहिए यदि बिल्कुल आवश्यक

+1

तो आप इसे 'var i = -1; ((++ i

संबंधित मुद्दे