2009-01-11 13 views
13

एक धाराप्रवाह इंटरफ़ेस क्या है? मुझे इसकी अच्छी परिभाषा नहीं मिल रही है, लेकिन मुझे जो कुछ भी मिलता है वह उस भाषा में लंबे कोड उदाहरण हैं जिन्हें मैं बहुत परिचित नहीं हूं (उदा। सी ++)।फ्लुएंट इंटरफेस और लीकी एब्स्ट्रैक्शन

इसके अलावा, एक लीकी अबास्ट्रक्शन क्या है?

धन्यवाद

+1

इसे दो अलग-अलग प्रश्नों के रूप में पोस्ट किया जाना चाहिए था। –

उत्तर

9

एक धाराप्रवाह इंटरफ़ेस एक शब्द एरिक इवांस गढ़ा और यह विधि श्रृंखलन के लिए सिर्फ एक और नाम है। मार्टिन Fowler इस विषय पर articles के couple लिखा था, लेकिन यह मोटे तौर पर इस तरह दिखता है:

m_Window = window::with() 
    .width(l_Width) 
    .height(l_Height) 
    .title("default window") 
    .left(200) 
    .top(200) 
.create(); 

Fluent इंटरफ़ेस आम तौर पर एक भाषा है कि उन्हें (सी में नामांकित पैरामीटर मुहावरा का समर्थन नहीं करता में नाम वाले पैरामीटर बनाने के लिए इस्तेमाल कर रहे हैं ++ उदाहरण के लिए), या डोमेन विशिष्ट भाषाओं में कोड को अधिक तेज़ी से पढ़ने के लिए।

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

::CreateWindow(
     "Window class", 
     "Window title", 
     dwStyle, X, Y, 
     nWidth, nHeight, 
     hWndPant, hMenu, 
     hInstance, NULL 
); 
+0

jQuery की चेनिंग की तरह? –

+0

यह कुछ समय हो गया है क्योंकि मैंने कोई वेब संबंधित विकास किया है, लेकिन jQuery दस्तावेज़ से निर्णय ले रहा है, ऐसा लगता है कि यह है। –

+0

यह विधि तेज है, धाराप्रवाह इंटरफेस नहीं। ऊपर से रasmस के उत्तर से उद्धरण देखें * "निश्चित रूप से चेनिंग धाराप्रवाह इंटरफ़ेस के साथ उपयोग करने के लिए एक आम तकनीक है, लेकिन वास्तविक प्रवाह उस से कहीं अधिक है ...." – Pacerier

5

यहाँ एक नियमित रूप से हर दिन इंटरफेस है:

public interface NotFluent 
{ 
    void DoA(); 
    void DoB(); 
    void DoC(); 
} 

और यहाँ एक धाराप्रवाह इंटरफ़ेस है:

public interface Fluent 
{ 
    Fluent DoA(); 
    Fluent DoB(); 
    Fluent DoC(); 
} 

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

NotFluent foo = new NotFluentImpl(); 
foo.DoA(); 
foo.DoB(); 
foo.DoC(); 

Fluent bar = new FluentImpl(); 
bar.DoA().DoB().DoC(); 

सूचना है कि धाराप्रवाह इंटरफ़ेस जब अलग-अलग कॉल चेनिंग उपयोग करने के लिए आसान है:

यहाँ उनके उपयोग के उदाहरण हैं। आईआरएल, लिंक एक्सटेंशन विधियों की जांच करें और कैसे प्रत्येक कॉल को दूसरे में प्रवाह करने के लिए डिज़ाइन किया गया है। विधियों में से कोई भी शून्य शून्य नहीं है, भले ही यह एक वैध परिणाम होगा।

+0

क्या यह उदाहरण बस विधि विधि नहीं है? फाउलर नोट्स [* "कई लोग विधि चेनिंग के साथ धाराप्रवाह इंटरफेस को समान मानते हैं" *] (http://www.martinfowler.com/bliki/FluentInterface.html)। उपर्युक्त कोड में कौन सी संपत्ति है जो इसे विधिवत श्रृंखला के विपरीत एक धाराप्रवाह इंटरफ़ेस बनाती है? – Pacerier

+0

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

+0

पुन * "इसका उत्तर क्यों न दें" *, मेरे पास कोई जवाब नहीं है, इसलिए प्रश्न हैं। और यह "विभाजन बाल" नहीं है, ऐसा लगता है कि FluentInterface विधि चेनिंग के बराबर नहीं है। – Pacerier

1

एक धाराप्रवाह इंटरफ़ेस में, किसी ऑब्जेक्ट के तरीके ऑब्जेक्ट का संदर्भ वापस कर देंगे, ताकि आप विधि कॉल को एक साथ जोड़ सकें।

उदाहरण के लिए, NValidate में, मैं ऐसा किया पैरामीटर मान्यता सरल करने के लिए:

public City GetCity(string zipCode) 
{ 
    zipCode.Assert("zipCode").IsNotNullOrEmpty().HasLength(5,10).Matches("\\d[5]-\\d[4]"); 
    // Continue processing 
} 

मैं, कपोल-कल्पना टपकाया करने के लिए हालांकि नहीं बोल सकता।

24

एक धाराप्रवाह इंटरफ़ेस एक एपीआई है जो आपको कोड लिखने की अनुमति देता है जो सामान्य अंग्रेजी की तरह कम या कम पढ़ता है। उदाहरण के लिए:

Find.All.Questions(Where.IsAnswered == true); 

विधि चेन आमतौर पर कार्यान्वयन के हिस्से के रूप में किया जाता है, लेकिन वहाँ है कि तुलना में यह अधिक है।Fowler उद्धरण करने के लिए:

मैंने एक आम गलतफहमी भी देखी है - कई लोग विधि चेनिंग के साथ धाराप्रवाह इंटरफेस को समान रूप से समझाते हैं। निश्चित रूप से चेनिंग फ्लैंट इंटरफेस के साथ उपयोग करने के लिए एक आम तकनीक है, लेकिन वास्तविक प्रवाह उस से कहीं अधिक है।

यह भी अक्सर एक आंतरिक DSL कहा जाता है, के बाद से वाक्य रचना एक डीएसएल की है कि जैसा दिखता है, लेकिन यह बजाय एक पार्सर के द्वारा कार्रवाई की जा रही के मेजबान भाषा अंदर कार्यान्वित किया जाता है। ताकि इस तरह के तरीकों को एक साथ श्रृंखलित जा सकती है

+0

और .. धाराप्रवाह इंटरफेस के पेशेवर/विपक्ष क्या हैं? – Pacerier

3

एक ऑब्जेक्ट-ओरिएंटेड इंटरफेस, धाराप्रवाहअगर तरीकों कि पक्ष प्रभाव वापसी self के लिए क्रियान्वित कर रहे हैं है।

मुझे पहली बार 1 99 0 में फ्लुएंट इंटरफेस का सामना करना पड़ा जब मॉडुला -3 इंटरफेस पुलिस (मैं इसे नहीं बना रहा) को प्रारंभिक ऑब्जेक्ट को वापस करने के लिए सभी प्रारंभिक तरीकों की आवश्यकता थी। मेरा मानना ​​है कि यह उपयोग "धाराप्रवाह इंटरफ़ेस" शब्द के सिक्का की भविष्यवाणी करता है।

+0

असल में जब ओपी "धाराप्रवाह इंटरफ़ेस" कहता है, तो वह [फ्लुएंट इंटरफेस] (http://www.martinfowler.com/bliki/FluentInterface.html) की फाउलर की परिभाषा का जिक्र कर रहा है। सामान्य रूप से केवल * धाराप्रवाह * इंटरफ़ेस नहीं। – Pacerier

17

एक लीकी अबास्ट्रक्शन एक अमूर्त है जहां अंतर्निहित वास्तविकता का विवरण अक्सर "लीक हो जाता है"।

All abstractions lie अधिक या कम, लेकिन कभी-कभी अवतार अंतर्निहित वास्तविकता के लिए इतना बुरा फिट होता है, इससे इससे अधिक नुकसान होता है।

एक अमूर्तता में "रिसाव" का एक साधारण उदाहरण सामान्य फ्लोट प्रकार हो सकता है। ऐसा लगता है कि सामान्य वास्तविक संख्याएं प्रदर्शित होती हैं और आप मूल गणना करने के लिए इसका उपयोग कर सकते हैं। लेकिन कुछ समय में आप एक परिदृश्य का सामना करते हैं जहां 1/3 * 3! = 1 या 1 + 10^-20 = 1. वह तब होता है जब वास्तविक कार्यान्वयन विवरण रिसाव और अमूर्त तोड़ता है।

1

धन्यवाद दोस्तों।

ग्रेट विवरण।

धाराप्रवाह इंटरफेस के बारे में मेरा विचार जहां वे पठनीयता के लिए थे। मैं हमेशा तरीकों की एक श्रृंखला पढ़ सकता हूं और कैसे पिछली/अगली विधि से संबंधित है।

उदा। पोस्टर की तरह जिसने सत्यापन उदाहरण पोस्ट किया है (मैंने पहले जैसा कोड लिखा है)।

1

Neal Ford अपनी पुस्तक 'उत्पादक प्रोग्रामर' में फ्लुएंट इंटरफेस उदाहरणों को समझाने और देने का अच्छा काम करता है।

पारंपरिक वस्तु या getters/setters के साथ 'सेम':

Car car = new CarImpl(); 
MarketingDescription des = new MarketingDescriptionImpl(); 
desc.setType("Box"); 
desc.setSubtype("Insulated"); 
desc.setAttribute("length", "50.5"); 
desc.setAttribute("ladder", "yes"); 
desc.setAttribute("lining type", "cork"); 
car.setDescription(desc); 

मिलिए एक धाराप्रवाह इंटरफेस के साथ समान रूप से आवश्यकता:

Car car = Car.describedAs() 
    .box() 
    .length(50.5) 
    .type(Type.INSULATED) 
    .includes(Equipment.LADDER) 
    .lining(Lining.CORK); 
0

आप एक अच्छा definitition और की बुनियादी अवधारणाओं पा सकते हैं धाराप्रवाह इंटरफ़ेस इस इस पोस्ट:

Guidelines to Fluent Interface design in C# part 1

मुझे उम्मीद है कि मदद करता है।

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