c# - घोषणात्मक और अनिवार्य प्रोग्रामिंग के बीच क्या अंतर है




paradigms imperative-programming (11)

कंप्यूटर विज्ञान में, घोषणात्मक प्रोग्रामिंग एक प्रोग्रामिंग प्रतिमान है जो इसके नियंत्रण प्रवाह का वर्णन किये बिना गणना के तर्क को व्यक्त करता है।

http://en.wikipedia.org/wiki/Declarative_programming

संक्षेप में घोषणात्मक भाषा सरल है क्योंकि इसमें नियंत्रण प्रवाह की जटिलता की कमी है (लूप, अगर बयान, आदि)

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

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


प्रभावशाली प्रोग्रामिंग के लिए डेवलपर्स को चरण-दर-चरण परिभाषित करने की आवश्यकता होती है कि कोड को कैसे निष्पादित किया जाना चाहिए। एक अनिवार्य फैशन में दिशानिर्देश देने के लिए, आप कहते हैं, "पहली स्ट्रीट पर जाएं, मुख्य पर बाईं ओर मुड़ें, दो ब्लॉक चलाएं, मेपल पर दाएं मुड़ें, और बाईं ओर तीसरे घर पर रुकें।" घोषणात्मक संस्करण इस तरह कुछ सुना सकता है : "मुकदमा के घर पर ड्राइव करें।" कोई कहता है कि कुछ कैसे करना है; दूसरा कहता है कि क्या करने की जरूरत है।

घोषणात्मक शैली के अनिवार्य शैली पर दो फायदे हैं:

  • यह यात्रियों को निर्देशों के एक लंबे सेट को याद रखने के लिए मजबूर नहीं करता है।
  • यह यात्री को जब संभव हो तो मार्ग को अनुकूलित करने की अनुमति देता है।

Calvert, सी कुलकर्णी, डी (200 9)। आवश्यक LINQ। एडिसन वेस्ले 48।


इंपीरेटिव प्रोग्रामिंग कंप्यूटर को स्पष्ट रूप से बता रही है कि क्या करना है, और इसे कैसे करना है, जैसे ऑर्डर निर्दिष्ट करना

सी#:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

घोषणा तब होती है जब आप कंप्यूटर को बताते हैं कि क्या करना है, लेकिन वास्तव में यह कैसे करना है। डेलिटल / प्रोलॉग पहली भाषा है जो इस संबंध में दिमाग में आती है। असल में सबकुछ घोषणात्मक है। आप वास्तव में आदेश की गारंटी नहीं दे सकते।

सी # एक और अधिक अनिवार्य प्रोग्रामिंग भाषा है, लेकिन कुछ सी # विशेषताएं लिंक की तरह अधिक घोषणात्मक हैं

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

वही बात अनिवार्य रूप से लिखी जा सकती है:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(विकिपीडिया लिंकक से उदाहरण)


उपर्युक्त उत्तर और अन्य ऑनलाइन पोस्ट निम्नलिखित का उल्लेख करते हैं:

  • घोषणात्मक प्रोग्रामिंग के साथ, आप कोड लिखते हैं जो वर्णन करता है कि आप क्या चाहते हैं, लेकिन यह आवश्यक नहीं है कि इसे कैसे प्राप्त किया जाए
  • आपको अनिवार्य प्रोग्रामिंग पर घोषणात्मक प्रोग्रामिंग पसंद करनी चाहिए

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

  • उदाहरण के लिए, LINQ loops (के लिए, जबकि, आदि) से अधिक घोषणात्मक है, उदाहरण के लिए, आप सूची का उपयोग कर सकते हैं। जहां () एक नई फ़िल्टर की गई सूची प्राप्त करने के लिए। इसके लिए काम करने के लिए, माइक्रोसॉफ्ट ने LINQ अबास्ट्रक्शन के पीछे सभी भारी भारोत्तोलन किया है।

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

किसी भी कार्यक्रम में, आपके पास हमेशा अनिवार्य और घोषणात्मक दोनों कोड होंगे, जो आपको लक्ष्य रखना चाहिए, अवशेषों के पीछे सभी अनिवार्य कोड छिपाना है, ताकि कार्यक्रम के अन्य भाग उन्हें घोषणात्मक रूप से उपयोग कर सकें।

अंत में, हालांकि कार्यात्मक प्रोग्रामिंग और LINQ आपके प्रोग्राम को और अधिक घोषणात्मक बना सकता है, आप हमेशा अधिक अवशोषण प्रदान करके इसे और अधिक घोषणात्मक बना सकते हैं। उदाहरण के लिए:

// JavaScript example

// Least declarative
var bestProducts = [];
for(var i = 0; i < products.length; i++) {
    var product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
var bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
var bestProducts = getBestProducts();

घोषणात्मक प्रोग्रामिंग तब होती है जब आप कहते हैं कि आप क्या चाहते हैं, और अनिवार्य भाषा तब होती है जब आप कहते हैं कि आप क्या चाहते हैं।

पायथन में एक साधारण उदाहरण:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

पहला उदाहरण घोषणात्मक है क्योंकि हम सूची बनाने के किसी भी "कार्यान्वयन विवरण" निर्दिष्ट नहीं करते हैं।

सी # उदाहरण में आम तौर पर, LINQ परिणामों का उपयोग घोषणात्मक शैली में करते हुए, क्योंकि आप यह नहीं कह रहे हैं कि आप जो चाहते हैं उसे प्राप्त करना; आप केवल यही कह रहे हैं कि आप क्या चाहते हैं। आप एसक्यूएल के बारे में भी यही कह सकते हैं।

घोषणात्मक प्रोग्रामिंग का एक लाभ यह है कि यह संकलक को निर्णय लेने की अनुमति देता है जिसके परिणामस्वरूप आप हाथ से क्या कर सकते हैं उससे बेहतर कोड हो सकते हैं। यदि आपके पास कोई क्वेरी है तो SQL उदाहरण के साथ चल रहा है

SELECT score FROM games WHERE id < 100;

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


घोषणात्मक बनाम अनिवार्य प्रोग्रामिंग का एक महान सी # उदाहरण LINQ है।

अनिवार्य प्रोग्रामिंग के साथ, आप संकलक को बताएं कि आप क्या करना चाहते हैं, चरण-दर-चरण।

उदाहरण के लिए, आइए इस संग्रह से शुरू करें, और विषम संख्याओं का चयन करें:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

अनिवार्य प्रोग्रामिंग के साथ, हम इसके माध्यम से कदम उठाएंगे, और तय करेंगे कि हम क्या चाहते हैं:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

यहां, हम कह रहे हैं:

  1. एक परिणाम संग्रह बनाएँ
  2. संग्रह में प्रत्येक नंबर के माध्यम से कदम
  3. संख्या की जांच करें, अगर यह अजीब है, तो इसे परिणामों में जोड़ें

दूसरी तरफ, घोषणात्मक प्रोग्रामिंग के साथ, आप कोड लिखते हैं जो आप चाहते हैं कि वर्णन करता है, लेकिन यह आवश्यक नहीं है कि इसे कैसे प्राप्त करें (अपने वांछित परिणाम घोषित करें, लेकिन चरण-दर-चरण नहीं):

var results = collection.Where( num => num % 2 != 0);

यहां, हम कह रहे हैं "हमें सबकुछ दें जहां यह अजीब है", "संग्रह के माध्यम से कदम नहीं। इस आइटम को जांचें, अगर यह अजीब है, तो इसे परिणाम संग्रह में जोड़ें।"

कई मामलों में, कोड दोनों डिज़ाइनों का मिश्रण भी होगा, इसलिए यह हमेशा काला और सफेद नहीं होता है।


मुझे आश्चर्य है कि क्यों किसी ने विशेषता वर्गों को सी # में एक घोषणात्मक प्रोग्रामिंग टूल के रूप में वर्णित नहीं किया है। इस पृष्ठ के लोकप्रिय उत्तर ने अभी LINQ के बारे में एक घोषणात्मक प्रोग्रामिंग टूल के रूप में बात की है।

विकिपीडिया के अनुसार

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

तो LINQ, एक कार्यात्मक वाक्यविन्यास के रूप में, निश्चित रूप से एक घोषणात्मक विधि है, लेकिन कॉन्फ़िगरेशन टूल के रूप में सी # में विशेषता कक्षाएं भी घोषणात्मक हैं। इसके बारे में अधिक पढ़ने के लिए यहां एक अच्छा प्रारंभिक बिंदु है: सी # विशेषता प्रोग्रामिंग का त्वरित अवलोकन


मुझे कैम्ब्रिज कोर्स + उनके उदाहरणों से स्पष्टीकरण पसंद आया:

  • घोषणात्मक - निर्दिष्ट करें कि क्या करना है, यह नहीं करना है
    • उदाहरण: एचटीएमएल वर्णन करता है कि वेब पेज पर क्या दिखना चाहिए, यह नहीं कि स्क्रीन पर इसे कैसे खींचा जाना चाहिए
  • प्रभावशाली - दोनों और कैसे निर्दिष्ट करें
    • int x; - क्या (घोषणात्मक)
    • x=x+1; - किस तरह

मैं एक और उदाहरण जोड़ूंगा जो दुर्लभ रूप से घोषणात्मक / अनिवार्य प्रोग्रामिंग चर्चा में पॉप अप करता है: उपयोगकर्ता इंटरफ़ेस!

सी # में, आप विभिन्न तकनीकों का उपयोग करके एक यूआई बना सकते हैं।

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

घोषणात्मक अंत में, आपके पास WPF है। आप मूल रूप से कुछ एक्सएमएल (हाँ, हाँ, "एक्सएएमएल" तकनीकी रूप से लिखते हैं) और ढांचा आपके लिए काम करता है। आप कहते हैं कि उपयोगकर्ता इंटरफ़ेस कैसा दिखता है। यह समझने के लिए सिस्टम पर निर्भर है कि इसे कैसे किया जाए।

वैसे भी, बस सोचने के लिए एक और बात है। सिर्फ इसलिए कि एक भाषा घोषणात्मक या अनिवार्य है इसका मतलब यह नहीं है कि इसमें दूसरे की कुछ विशेषताएं नहीं हैं।

इसके अलावा, घोषणात्मक प्रोग्रामिंग का एक लाभ यह है कि उद्देश्य आमतौर पर कोड पढ़ने से अधिक आसानी से समझा जाता है जबकि अनिवार्य आपको निष्पादन पर बेहतर नियंत्रण देता है।

इसका सब कुछ:

घोषणात्मक -> आप what करना चाहते हैं

प्रभावशाली -> आप इसे how करना चाहते हैं


मोबाइल ऐप विकास के संदर्भ में बस एक और उदाहरण जोड़ने के लिए। आईओएस और एंड्रॉइड में हमारे पास इंटरफेस बिल्डर्स हैं, जहां हम ऐप्स के यूआई को परिभाषित कर सकते हैं।

इन बिल्डर्स का उपयोग करके तैयार यूआई प्रकृति में घोषणात्मक है, जहां हम घटकों को खींचते हैं और छोड़ते हैं। वास्तविक ड्रॉइंग फ्रेमवर्क और सिस्टम के नीचे होता है और किया जाता है।

लेकिन हम कोड में पूरे घटकों को भी आकर्षित कर सकते हैं, और यह प्रकृति में अनिवार्य है।

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


प्रभावशाली प्रोग्रामिंग
एक प्रोग्रामिंग भाषा जिसके लिए प्रोग्रामिंग अनुशासन की आवश्यकता होती है जैसे सी / सी ++, जावा, कोबोल, फोरट्रान, पर्ल और जावास्क्रिप्ट। डेटा प्रोसेसिंग और प्रोग्रामिंग के ज्ञान के आधार पर, ऐसी भाषाओं में लिखने वाले प्रोग्रामर को समस्या को हल करने के लिए कार्यों का उचित क्रम विकसित करना होगा।

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

घोषणात्मक प्रोग्रामिंग उदाहरण सीएसएस, एचटीएमएल, एक्सएमएल, एक्सएसएलटी, रेगएक्स हैं।







declarative-programming