- हाल ही में एक codebase की समीक्षा करते समय, कोड की गुणवत्ता अच्छी होने के बावजूद मानसिक रूप से थकाने वाला अनुभव हुआ
- यह कोड की complexity से अधिक readability से जुड़ा हुआ था
- कोड की पठनीयता बढ़ाने के लिए 8 पैटर्न निकाले गए
कोड पठनीयता metrics और वैकल्पिक complexity metrics
- कोड पठनीयता को मापने के लिए कोई सार्वभौमिक और व्यापक रूप से उपयोग किया जाने वाला metric मौजूद नहीं है
- केवल ऐसे academic papers या व्यक्तिगत राय मौजूद हैं जिनका वास्तविक दुनिया में उपयोग नहीं होता
- नया metric बनाने के बजाय, ऐसे visual patterns पर ध्यान दिया गया जिन पर कोई भी आसानी से चर्चा कर सके
- complexity metric के लिए महत्वपूर्ण शर्तें:
- source code snippets या individual functions पर काम करना चाहिए
- algorithmic complexity के बजाय कोड लिखने के तरीके पर ध्यान होना चाहिए
- style elements (जैसे variable names, whitespace, indentation आदि) पर ध्यान नहीं होना चाहिए
Halstead complexity metric
- 1970 के दशक में Maurice Halstead द्वारा विकसित कोड complexity metric
- भाषा और platform की परवाह किए बिना कोड लिखने के तरीके को संख्यात्मक रूप से मापा जा सकता है
- operators और operands की संख्या के आधार पर program की length, volume और difficulty की गणना करता है
- मुख्य मापदंड:
- unique operators की संख्या (
n1)
- unique operands की संख्या (
n2)
- कुल operators की संख्या (
N1)
- कुल operands की संख्या (
N2)
- जितने अधिक operators और operands उपयोग होंगे, कोड की complexity उतनी बढ़ेगी
- सभी भाषाओं में operators और operands की परिभाषा स्पष्ट नहीं होती, इसलिए consistent tool का उपयोग महत्वपूर्ण है
Halstead complexity से मिले insights
- छोटे functions और कम variables होने पर readability बेहतर होती है
- भाषा-विशिष्ट operators या syntactic sugar का उपयोग न्यूनतम रखें
- functional programming में chains (
map/reduce/filter आदि) बहुत लंबी हो जाएँ तो readability घटती है
Cognitive Complexity
- SonarSource द्वारा विकसित complexity metric
- कोड को पढ़ने में कठिनाई को अधिक सटीक रूप से मापने का प्रयास
- तीन मुख्य सिद्धांत:
- shorthand constructs पढ़ने की कठिनाई को कम करते हैं
- non-linear flow में रुकावट कठिनाई बढ़ाती है
- nested control flow कठिनाई बढ़ाता है
Cognitive Complexity से मिले insights
- shorthand constructs संक्षिप्त होते हैं, लेकिन उनमें संभावित bugs का जोखिम हो सकता है
- conditional statements और logical operators का अत्यधिक उपयोग readability को घटाता है
- exception handling कोड complexity बढ़ाने का प्रमुख कारण है
goto से सामान्यतः बचना चाहिए, लेकिन कुछ परिस्थितियों में यह उपयोगी हो सकता है
- nested control structures को जहाँ तक संभव हो कम करना चाहिए
functions का आकार, patterns और variables
- function का दृश्य "shape" कोड readability में महत्वपूर्ण भूमिका निभाता है
- readability बढ़ाने के तीन सिद्धांत:
- स्पष्ट और ठोस variable names का उपयोग
- variable shadowing से बचें
- ऐसे नाम उपयोग करें जिन्हें दृश्य रूप से अलग पहचाना जा सके (
i, j जैसे मिलते-जुलते नामों से बचें)
- variables की lifespan कम करें
- variable का scope जितना छोटा हो, उतना अच्छा
- जो variables function boundary के पार लंबे समय तक बने रहते हैं, वे complexity बढ़ाते हैं
- परिचित code patterns का पुन: उपयोग
- consistent code patterns बनाए रखने से readability बेहतर होती है
- नए approaches की बजाय पहले से परिचित patterns को प्राथमिकता दें
कोड readability सुधारने वाले 8 पैटर्न
- lines/operators/operands की संख्या कम करें – छोटे functions और कम variables readability बढ़ाते हैं
- नए approaches से बचें – codebase में परिचित patterns बनाए रखें
- grouping – लंबे function chains, iterators आदि को helper functions में बाँटें
- conditional statements को सरल रखें – conditions छोटी रखें और logical operators के मिश्रण को न्यूनतम करें
goto को न्यूनतम रखें – आवश्यकता होने पर केवल error handling में सीमित रूप से उपयोग करें
- nesting कम करें – nested logic को घटाएँ और ज़रूरत होने पर function में अलग करें
- स्पष्ट variable names का उपयोग करें – ठोस और non-overlapping variable names रखें
- variables की lifespan कम करें – उन्हें function के भीतर कम समय तक रखें और function boundaries के पार न जाने दें
निष्कर्ष
- कोड readability, कोड quality का एक महत्वपूर्ण तत्व है
- Halstead और Cognitive Complexity readability समस्याओं को संख्यात्मक रूप से समझने और सुधार की दिशा सुझाने में मदद कर सकते हैं
- संक्षिप्त और स्पष्ट कोड लिखने से maintenance आसान होता है और bugs की संभावना कम होती है
- सर्वोत्तम कोड लेखन का मतलब है सादगी, consistency और clarity को प्राथमिकता देना
1 टिप्पणियां
Hacker News राय
map,reduce,filterजैसी functional programming संरचनाओं को जोड़ना संक्षिप्त होता है, लेकिन लंबी chain अक्सर readability को नुकसान पहुंचाती हैmapऔरfilterको यूँ ही कोसने से बचने लायक परिचय होना चाहिएअच्छे कोड का एक महत्वपूर्ण पहलू गुणात्मक और साहित्यिक होता है
कोड पढ़ते समय सबसे थकाने वाली समस्या mutability है
छोटे functions और कम variables आम तौर पर पढ़ने में आसान होते हैं
TypeScript कोड पढ़ना कठिन बना देता है
getOddness4फ़ंक्शन असममिति पैदा करता हैgetOddness2फ़ंक्शन सममित विकल्प देता हैलेख दिलचस्प है, लेकिन पूरी तरह संतोषजनक नहीं
map,reduce,filterजैसी संरचनाएँ सही तरीके से इस्तेमाल हों तो दूसरे operators की जगह ले सकती हैं और "volume" कम करती हैंreadability को परिभाषित करने की कोशिश सराहनीय है
कोड की complexity को syntax tree के आकार से व्यक्त किया जा सकता है
लंबी function chain या callback को छोटे समूहों में बाँटना और अच्छे नाम वाले variables का उपयोग करना बेहतर है