📘 CodingMarble Learn

प्रोग्रामिंग पैरेडाइम: आदेशात्मक, फंक्शनल और ऑब्जेक्ट शैली

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

🎬 कदम-दर-कदम कहानी

  1. हमारा सवाल: सूची की सम संख्याओं के वर्ग जोड़ना। पैरेडाइम इसे हल करने की एक शैली है। हम एक ही सूची पर तीन शैलियाँ आज़माएँगे।
  2. आदेशात्मक शैली। एक पॉइंटर सूची पर चलता है और total नाम का चर बार-बार बदलता है: 4, फिर 20, फिर 56। प्रोग्राम आदेशों की सूची है।
  3. फंक्शनल शैली। सूची तीन मशीनों से गुज़रती है: filter सम रखता है, map वर्ग बनाता है, fold जोड़ता है। पहली सूची कभी नहीं बदलती।
  4. ऑब्जेक्ट शैली। हर संख्या एक ऑब्जेक्ट है जो अपने काम जानता है। सम ऑब्जेक्ट अपना वर्ग निकालकर योग ऑब्जेक्ट को भेजते हैं।
  5. कौन-सी शैली चुनें? एक सवाल चुनो और देखो कौन-सा खंभा सबसे ऊँचा है। सूची का हिसाब फंक्शनल को, खेल ऑब्जेक्ट को, मशीन के क़दम आदेशात्मक को जँचते हैं।
  6. खुला खेल: सूची की लंबाई बदलो, हर शैली चलाओ और देखो कि तीनों का उत्तर एक ही है।

टिप: 3D दृश्य को घुमाने के लिए खींचें। ज़ूम के लिए दो उंगलियाँ इस्तेमाल करें।

🤔 आम शंकाएँ और उनके जवाब

उत्तर एक ही है तो अलग शैलियाँ क्यों चाहिए?

उत्तर एक है, पर प्रोग्राम को पढ़ना, जाँचना और बदलना कितना आसान है, यह अलग होता है। 3D में तीनों रन की तुलना करो।

चर का "बदलना" क्या होता है?

संचित मान बदल जाता है: total 0, 4, 20, 56। इस बदलते डेटा को स्थिति कहते हैं और 3D का बोर्ड इसे दिखाता है।

सूची नहीं बदलती तो नया डेटा कहाँ जाता है?

हर मशीन अगली पंक्ति में नई सूची बनाती है। सबसे ऊपर की पंक्ति जैसी थी वैसी रहती है।

ऑब्जेक्ट को कैसे पता कि क्या करना है?

उसकी क्लास उसे is_even और square जैसे मेथड देती है। ऑब्जेक्ट सिर्फ़ अपने डेटा पर काम करता है और उत्तर आगे भेज देता है।

तो सबसे अच्छा पैरेडाइम कौन-सा है?

हर जगह कोई एक सबसे अच्छा नहीं। खंभे दिखाते हैं कि सही चुनाव सवाल पर निर्भर है। असली प्रोग्राम शैलियाँ मिलाते हैं।

क्या लंबी सूची पर भी तीनों शैलियाँ एक ही उत्तर देंगी?

हाँ। स्लाइडर बदलो और हर शैली के लिए "चलाओ" दबाओ: उत्तर मिलते हैं।

प्रोग्रामिंग पैरेडाइम क्या है?

पैरेडाइम (paradigm) प्रोग्राम लिखने की एक शैली या सोचने का तरीक़ा है। एक ही सवाल अलग शैलियों में हल हो सकता है। कंप्यूटर को फ़र्क़ नहीं पड़ता; इंसान को पड़ता है, क्योंकि अच्छी शैली से प्रोग्राम पढ़ना, जाँचना और बदलना आसान होता है।

हमारा उदाहरण: 1 से 6 की सम संख्याओं के वर्ग जोड़ो। उत्तर: 2² + 4² + 6² = 4 + 16 + 36 = 56।

ज़्यादातर आधुनिक भाषाएँ (Python, JavaScript, Java) एक से ज़्यादा पैरेडाइम चलने देती हैं।

आदेशात्मक पैरेडाइम: आदेश और बदलते चर

आदेशात्मक (imperative) प्रोग्राम क्रम से आदेशों की सूची है। इसमें ऐसे चर होते हैं जिनके मान बदलते हैं। इस बदलते संचित डेटा को स्थिति (state) कहते हैं। आम साधन हैं क्रम, चयन (if) और लूप। जब आदेश नाम वाली प्रक्रियाओं में बाँटे जाएँ तो इसे प्रक्रियात्मक (procedural) कहते हैं।

total = 0
for n in range(1, 7):
    if n % 2 == 0:
        total = total + n * n
print(total)   # 56

ताक़त: कंप्यूटर के काम करने के तरीक़े के क़रीब और क़दम-दर-क़दम समझने में आसान। कमज़ोरी: बहुत सारे बदलते चरों से बड़े प्रोग्राम जाँचना कठिन हो जाता है।

फंक्शनल पैरेडाइम: फंक्शन अंदर, फंक्शन बाहर

फंक्शनल (functional) प्रोग्राम फंक्शनों से बनता है। शुद्ध फंक्शन (pure function) एक ही इनपुट पर हमेशा वही आउटपुट देता है और अपने बाहर कुछ नहीं बदलता (कोई साइड इफ़ेक्ट नहीं)। डेटा वहीं नहीं बदला जाता; नया मान बनता है (अपरिवर्तनीय डेटा)।

evens   = filter(lambda n: n % 2 == 0, range(1, 7))
squares = map(lambda n: n * n, evens)
print(sum(squares))   # 56

ताक़त: छोटा, जाँचने में आसान, कई काम साथ चलें तब भी सुरक्षित। कमज़ोरी: शुरू में अजीब लग सकता है और खेल की स्क्रीन जैसी बदलती चीज़ों के लिए हमेशा सबसे अच्छा नहीं।

ऑब्जेक्ट-आधारित पैरेडाइम: बात करने वाले ऑब्जेक्ट

ऑब्जेक्ट-आधारित (object-oriented) प्रोग्राम ऑब्जेक्टों से बनता है। हर ऑब्जेक्ट अपना डेटा (गुण/attributes) और अपने काम (मेथड/methods) रखता है। क्लास उसका नक़्शा है और ऑब्जेक्ट उससे बनते हैं। ऑब्जेक्ट संदेश भेजकर (मेथड बुलाकर) साथ काम करते हैं। डेटा को ऑब्जेक्ट के अंदर छिपाकर रखना एनकैप्सुलेशन है। नई क्लास पुरानी का उपयोग कर सकती है (इनहेरिटेंस)।

class Num:
    def __init__(self, v): self.v = v
    def is_even(self): return self.v % 2 == 0
    def square(self): return self.v * self.v

class Sum:
    def __init__(self): self.total = 0
    def add(self, x): self.total += x

s = Sum()
for v in range(1, 7):
    n = Num(v)
    if n.is_even(): s.add(n.square())
print(s.total)   # 56

ताक़त: असली चीज़ों (खिलाड़ी, बैंक खाते, बटन) से मेल खाता है। कमज़ोरी: छोटे काम के लिए ज़रूरत से ज़्यादा कोड।

एक और पैरेडाइम: डिक्लेरेटिव और लॉजिक

डिक्लेरेटिव (declarative) प्रोग्राम बताता है कि क्या नतीजा चाहिए, कैसे पाना है यह नहीं। SQL इसका उदाहरण है: SELECT name FROM students WHERE marks > 90 यह नहीं बताता कि खोज कैसे हो। लॉजिक प्रोग्रामिंग (जैसे Prolog) में तुम तथ्य और नियम लिखते हो और सवाल पूछते हो; सिस्टम उत्तर ख़ुद खोजता है। फंक्शनल प्रोग्रामिंग को भी अक्सर डिक्लेरेटिव कहा जाता है।

घटना-आधारित (event-driven) प्रोग्राम घटनाओं (क्लिक, कुंजी) का इंतज़ार करता है और हर घटना पर कोड का एक टुकड़ा चलाता है। वेब पेज इसी तरह चलते हैं, अक्सर ऑब्जेक्टों के साथ।

किसी पैरेडाइम में प्रोग्राम लिखना और जाँचना

किसी पैरेडाइम में प्रोग्राम लिखने के लिए उसकी सोच अपनाओ:

  1. आदेशात्मक: क़दमों की सूची बनाओ, चरों के नाम रखो, लूप तय करो।
  2. फंक्शनल: काम को छोटे शुद्ध फंक्शनों में बाँटो और उन्हें पाइपलाइन में जोड़ो।
  3. ऑब्जेक्ट: "चीज़ें" खोजो, हर एक को डेटा और काम दो, तय करो कौन किसे संदेश भेजेगा।

अपने प्रोग्राम को जाँचने (evaluate) के लिए पूछो: क्या कई सूचियों पर उत्तर सही है? क्या पढ़ना आसान है? क्या जाँचना आसान है? क्या बाद में बिना बिगाड़े बदल सकता हूँ?

ट्रेसिंग मदद करती है: हर क़दम के बाद चरों के मान लिखो। ऊपर के आदेशात्मक कोड में total 0 → 4 → 20 → 56 होता है।

सवाल के लिए पैरेडाइम चुनना

कोई पैरेडाइम हर काम के लिए सबसे अच्छा नहीं। इन्हें तौलो:

असली प्रोग्राम शैलियाँ मिलाते हैं: ढाँचे के लिए ऑब्जेक्ट, हिसाब के लिए फंक्शन और मेथडों के अंदर आदेश।

मुख्य सूत्र और परिभाषाएँ

हल किए गए उदाहरण

1. सूची 1..6 के लिए आदेशात्मक प्रोग्राम का ट्रेस करो और हर सम संख्या के बाद total लिखो।

शुरू में total = 0। n = 2: total = 0 + 4 = 4। n = 4: total = 4 + 16 = 20। n = 6: total = 20 + 36 = 56। विषम 1, 3, 5 छोड़ दी जाती हैं।

2. [1, 2, 3, 4] के लिए "हर संख्या दुगनी करो, फिर 5 से बड़ी रखो" के फंक्शनल क़दम लिखो।

map दुगना करता है: [2, 4, 6, 8]। filter > 5 रखता है: [6, 8]। क्रम मायने रखता है: पहले map, फिर filter। मूल सूची [1, 2, 3, 4] नहीं बदली।

3. एक खेल में Player, Enemy और Coin हैं। कौन-सा पैरेडाइम जँचता है और हर एक क्या रख सकता है?

ऑब्जेक्ट-आधारित। Player: डेटा = जान, जगह; मेथड = चलना, कूदना। Enemy: डेटा = जान, गति; मेथड = पीछा करना, हमला। Coin: डेटा = मूल्य; मेथड = उठाना। वे "attack(player)" जैसे संदेश भेजते हैं।

4. वर्गों के योग वाले सवाल के तीनों हल एक-एक पंक्ति में तुलना करो।

आदेशात्मक: लूप चर total बदलता है। फंक्शनल: filter, map और fold उत्तर बनाते हैं, कोई चर नहीं बदलता। ऑब्जेक्ट: हर Num ऑब्जेक्ट अपना वर्ग निकालकर Sum ऑब्जेक्ट को भेजता है। तीनों का उत्तर 56।

आम गलतियाँ

अभ्यास क्विज़

1. कौन-सा पैरेडाइम चरों को बदलने वाले आदेशों से प्रोग्राम बनाता है?
2. फंक्शनल पैरेडाइम में "map" क्या करता है?
3. क्लास का सबसे सही वर्णन है:
4. SQL मुख्यतः कौन-सा पैरेडाइम है?
5. 1..6 की सम संख्याओं के वर्गों का योग है:

अभ्यास: खुद जवाब दो

अपना जवाब लिखो या चुनो, फिर जाँचें दबाओ। अटको तो संकेत देखो; जवाब देने के बाद पूरा हल दिखेगा।

अक्सर पूछे जाने वाले प्रश्न

प्रोग्रामिंग के मुख्य पैरेडाइम कौन-से हैं?

आदेशात्मक (प्रक्रियात्मक सहित), फंक्शनल, ऑब्जेक्ट-आधारित और डिक्लेरेटिव या लॉजिक। घटना-आधारित भी आम शैली है।

आदेशात्मक और फंक्शनल प्रोग्रामिंग में क्या अंतर है?

आदेशात्मक प्रोग्राम क्रम से आदेश देते हैं जो चरों को बदलते हैं। फंक्शनल प्रोग्राम डेटा को शुद्ध फंक्शनों से गुज़ारते हैं और डेटा को वहीं नहीं बदलते।

प्रोग्रामिंग पैरेडाइम कैसे चुनें?

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

यह कहाँ पढ़ाया जाता है

नीदरलैंडHAVO 5 (eindexamenjaar)Elective theme: Programming paradigms
नीदरलैंडVWO 6 (eindexamenjaar)Elective theme: Programming paradigms

पहले यह पढ़ें

आगे पढ़ें

इससे जुड़े पाठ

सभी कंप्यूटर विज्ञान पाठ