प्रोग्रामिंग शैली

From Vigyanwiki

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

इस विषय पर क्लासिक कार्यों के संचालन के लिए 1970 के दशक में 'प्रोग्रामिंग शैली के तत्वों' को लिखा गया था, और उस समय प्रचलित फोरट्रान और पीएल/आई भाषाओं के उदाहरणों के साथ इसे प्रस्तुत किया गया था।

किसी विशेष फंक्शन में उपयोग की जाने वाली प्रोग्रामिंग शैली किसी कंपनी या अन्य कंप्यूटिंग संगठन के कोडिंग समूहों के साथ-साथ कोड के लेखक की प्राथमिकताओं से प्राप्त की जाती है। प्रोग्रामिंग शैलियों को अधिकांशतः विशिष्ट प्रोग्रामिंग भाषा (या भाषा समूह) के लिए डिज़ाइन किया जाता है: सी (प्रोग्रामिंग भाषा) स्रोत कोड में अच्छी मानी जाने वाली शैली मौलिक प्रोग्रामिंग भाषा स्रोत कोड आदि के लिए उपयुक्त नहीं हो सकती है। चूंकि कुछ नियम सामान्यतः कई भाषाओं पर लागू होते हैं।

अच्छी शैली के तत्व

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

कोड की स्थिति

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

इंडेंटेशन

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

if (hours < 24 && minutes < 60 && seconds < 60) {
    return true;
} else {
    return false;
}

या

if (hours < 24 && minutes < 60 && seconds < 60)
{
    return true;
}
else
{
    return false;
}

इसी के साथ कुछ इस प्रकार के कोड भी प्राप्त होते हैं-

if  ( hours   < 24
   && minutes < 60
   && seconds < 60
)
{return    true
;}         else
{return   false
;}

पहले दो उदाहरण संभवतः पढ़ने में बहुत सरल हैं क्योंकि वे स्थापित विधियों से इंडेंट किए गए हैं। कई नेस्टेड निर्माणों को हल करते समय यह इंडेंटेशन शैली विशेष रूप से उपयोगी होती है।

मोडलिक

मॉडुलिक ज़ीरो इंडेंटेशन स्टाइल समूह इंडेंटेशन के अतिरिक्त कैरिज रिटर्न के साथ उपरोक्त सभी की तुलना करते हैं:

if (hours < 24 && minutes < 60 && seconds < 60)
return true;

else
return false;

लुआ प्रोग्रामिंग

लुआ प्रोग्रामिंग भाषा पारंपरिक कर्ली ब्रेसिज़ या कोष्ठक का उपयोग नहीं करता है, बल्कि इस कमांड में अभिव्यक्ति का पालन किया जाना चाहिए, इसी प्रकार इस प्रोग्राम की कमांड then, और end ब्लॉक के साथ बंद होना चाहिए।

if hours < 24 and minutes < 60 and seconds < 60 then
  return true
else
  return false
end

लुआ प्रोग्रामिंग में इंडेंटेशन वैकल्पिक है। इसके लिए and, or, और not लुआ में तार्किक ऑपरेटरों के रूप में उपयोग किये जाते हैं।

इसके सत्य/असत्य कथनों को इस प्रकार प्रिंट किया जाता हैं हैं, जैसे-

print(not true)

इसका अर्थ असत्य होगा।

पायथन प्रोग्रामिंग

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

(एचटीएमएल के लिए), [कोड] ... [/कोड] ( bbcode के लिए), आदि।
if hours < 24 and minutes < 60 and seconds < 60:
    return True
else:
    return False

ध्यान दें कि पायथन कर्ली ब्रेसिज़ का उपयोग नहीं करता है, अपितु नियमित कोलन (उदाहरण के लिए else:) ता उपयोग करते हैं।

कई पायथन प्रोग्रामर PEP8 के रूप में जानी जाने वाली सामान्य रूप से सहमत शैली मार्गदर्शिका का पालन करते हैं।[1] PEP8 अनुपालन को स्वचालित करने के लिए डिज़ाइन किए गए उपकरण हैं।

हास्केल प्रोग्रामिंग

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

let c_1 = 1
    c_2 = 2
in
    f x y = c_1 * x + c_2 * y

एक पंक्ति में इस प्रकार लिखा जा सकता है:

let {c_1=1;c_2=2} in f x y = c_1 * x + c_2 * y

हास्केल प्रोग्रामिंग के उपयोग को प्रोत्साहित करता है, जहां विस्तारित पाठ कोड की उत्पत्ति की व्याख्या करता है। हास्केल लिपियों में (नाम के साथ lhs विस्तार), कोड के रूप में चिह्नित ब्लॉक को छोड़कर सब कुछ टिप्पणी है।

प्रोग्राम लैटेक्स में लिखा जा सकता है, ऐसी स्थिति में code पर्यावरण चिन्हित करता है कि कोड क्या है।

इसके अतिरिक्त, प्रत्येक सक्रिय कोड पैराग्राफ को खाली रेखा के साथ पूर्ववर्ती और समाप्त करके चिह्नित किया जा सकता है, और कोड की प्रत्येक पंक्ति को चिन्ह और स्थान से अधिक के साथ प्रारंभ किया जा सकता है।

यहाँ लैटेक्स मार्कअप का उपयोग करते हैं जिसका उदाहरण इस प्रकार हैं:

The function \verb+isValidDate+ test if date is valid
\begin{code}
isValidDate :: Date -> Bool
isValidDate date = hh>=0  && mm>=0 && ss>=0
                 && hh<24 && mm<60 && ss<60
 where (hh,mm,ss) = fromDate date
\end{code}
observe that in this case the overloaded function is \verb+fromDate :: Date -> (Int,Int,Int)+.

इसका उदाहरण इस प्रकार हैं:

The function isValidDate test if date is valid

> isValidDate :: Date -> Bool
> isValidDate date = hh>=0  && mm>=0 && ss>=0
>                  && hh<24 && mm<60 && ss<60
>  where (hh,mm,ss) = fromDate date

observe that in this case the overloaded function is fromDate :: Date -> (Int,Int,Int).


लंबवत संरेखण

टाइपो-जेनरेट किए गए बग को और अधिक स्पष्ट करने के लिए, समान तत्वों को लंबवत रूप से संरेखित करना अधिकांशतः सहायक होता है। इसकी तुलना इस प्रकार करते हैं:

$search = array('a', 'b', 'c', 'd', 'e');
$replacement = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value = 0;
$anothervalue = 1;
$yetanothervalue = 2;

इसके साथ ही उपयुक्त कोड भी उपओग करते हैं:

$search      = array('a',   'b',   'c',   'd',   'e');
$replacement = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value           = 0;
$anothervalue    = 1;
$yetanothervalue = 2;

इन उदाहरणों में उपयुक्च दो चीजों को सहजता से स्पष्ट करता है जो पूर्व में स्पष्ट नहीं थे:

  • खोज और प्रतिस्थापन शब्द संबंधित हैं और मेल खाते हैं: वे असतत चर नहीं हैं,
  • प्रतिस्थापन शब्दों की तुलना में और खोज शब्द है। यदि यह बग है, तो अब इसके देखे जाने की अधिक संभावना है।

चूंकि, ध्यान दें कि लंबवत संरेखण के विरुद्ध तर्क हैं:

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

उदाहरण के लिए, यदि ऊपर दिए गए कोड पर साधारण रीफैक्टरिंग ऑपरेशन किया जाता है, तो इस प्रकार वैरियेबल $replacement को $r और $anothervalue को $a नाम दिया जाता है, परिणामी कोड इस प्रकार दिखेगा:

$search      = array('a',   'b',   'c',   'd',   'e');
$r = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value           = 0;
$a    = 1;
$yetanothervalue = 2;

इस प्रकार के परिवर्तन के पश्चात भी मूल अनुक्रमिक स्वरूपण ठीक दिखेगा:

$search = array('a', 'b', 'c', 'd', 'e');
$r = array('foo', 'bar', 'baz', 'quux');

// Another example:
 
$value = 0;
$a = 1;
$yetanothervalue = 2;

रिक्त स्थान

उन स्थितियों में जहां कुछ व्हाइटस्पेस वर्ण की आवश्यकता होती है, अधिकांश मुक्त-प्रारूप भाषाओं के व्याकरण प्रकट होने वाली राशि से संबंधित नहीं होते हैं। वाइटस्पेस से संबंधित शैली का उपयोग सामान्यतः पठनीयता बढ़ाने के लिए किया जाता है। वर्तमान में कोई ज्ञात ठोस तथ्य (अध्ययन से निष्कर्ष) नहीं हैं कि किस व्हाइटस्पेस शैली में सबसे अच्छी पठनीयता है।

उदाहरण के लिए, C कोड के निम्नलिखित वाक्यगत समकक्ष उदाहरणों की तुलना करें:

int i;
for(i=0;i<10;++i){
    printf("%d",i*i+i);
}

इसके विरुद्ध हम इस कोड को उपयोग करते हैं-

int i;
for (i = 0; i < 10; ++i) {
    printf("%d", i * i + i);
}

टैब

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

एक उदाहरण के रूप में, प्रोग्रामर चार के टैब का विश्राम स्थान को पसंद करता है और अपने टूलसमूह को इस प्रकार कॉन्फ़िगर करता है, और इनका उपयोग अपने कोड को प्रारूपित करने के लिए करता है।

int     ix;     // Index to scan array
long    sum;    // Accumulator for sum

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

int             ix;             // Index to scan array
long    sum;    // Accumulator for sum

इस समस्या के व्यापक रूप से उपयोग किए जाने वाले समाधान में संरेखण के लिए टैब के उपयोग को प्रतिबंधित करना या टैब स्टॉप को कैसे समूह किया जाना चाहिए, इस पर उपयुक्त नियम सम्मिलित हो सकते हैं। ध्यान दें कि टैब ठीक कार्य करते हैं, इसके लिए निरंतर इसका उपयोग किए जाते हैं, तार्किक इंडेंटेशन तक सीमित होते हैं, और संरेखण के लिए उपयोग नहीं किए जाते हैं:

class MyClass {
	int foobar(
		int qux, // first parameter
		int quux); // second parameter
	int foobar2(
		int qux, // first parameter
		int quux, // second parameter
		int quuux); // third parameter
};


यह भी देखें

संदर्भ

  1. "PEP 0008 -- Style Guide for Python Code". python.org.


बाहरी संबंध