फ़ंक्शन के भीतर conditionals को ऊपर ले जाना
- अगर किसी फ़ंक्शन के भीतर
if conditional है, तो उसे caller की ओर ले जाने पर विचार करें.
- फ़ंक्शन अगर precondition को अंदर जाँचकर condition पूरी न होने पर 'कुछ भी न करने' के बजाय, caller को precondition जाँचने दें ताकि type के माध्यम से यह सुनिश्चित हो सके कि precondition पूरी हुई है.
- precondition को विशेष रूप से 'ऊपर ले जाने' से कुल मिलाकर जाँच का काम कम हो सकता है, और यही इस नियम की एक मुख्य प्रेरणा है.
loops को नीचे ले जाना
- यह data-oriented सोच से निकला नियम है, जिसमें object के 'batch' concept को लाया जाता है, batch operation को base case माना जाता है, और scalar version को batch version का एक special case माना जाता है.
- performance improvement इसका मुख्य लाभ है; startup cost को amortize किया जा सकता है और processing order में flexibility मिल सकती है.
- उदाहरण के लिए, FFT-आधारित polynomial multiplication में कई बिंदुओं पर एक साथ polynomial का evaluation करना, अलग-अलग evaluation करने की तुलना में तेज़ हो सकता है.
GN⁺ की राय
- इस लेख की सबसे महत्वपूर्ण बात यह है कि यह software development में performance और code clarity बेहतर करने के लिए दो programming rules, 'conditionals को ऊपर ले जाना' और 'loops को नीचे ले जाना', पेश करता है.
- ये नियम code readability बढ़ाने, performance optimize करने और bugs की संभावना घटाने में मदद करते हैं.
- software engineering की complexity को manage करने और efficient code लिखने के तरीकों पर insight देने के कारण यह लेख कई developers के लिए दिलचस्प और उपयोगी है.
1 टिप्पणियां
Hacker News राय
ifऔरforकी व्यवस्था कैसी है, इस पर बहुत ज़्यादा ध्यान नहीं देना चाहिए.forloop के क्रम का गलत इस्तेमाल simulation के runtime को 1 हफ़्ते से घटाकर 1 घंटे तक ला सकता है। ऐसी पृष्ठभूमि वाले लोगforऔरifके क्रम को सहज रूप से optimize करते हैं.ifको ऊपर खिसकाने का एक नुकसान यह है कि function की preconditions और postconditions को function definition में सीधे देख पाना मुश्किल हो जाता है। बड़े प्रोजेक्ट्स में ऐसे function अपने अभिप्रेत context के बाहर दोबारा इस्तेमाल किए जा सकते हैं और bugs पैदा कर सकते हैं। contract framework का इस्तेमाल एक समाधान हो सकता है, लेकिन तब contract और code में conditions को दो बार लिखना पड़ता है.ifनीचे नहीं बल्कि ऊपर होने चाहिए, और errors को सही तरह propagate होना चाहिए.forloop औरifstatement दोनों ही control-flow operations हैं, इसलिए लेख के कुछ दावे अर्थहीन लगते हैं। performance से जुड़ा दावा सबसे मज़बूत है, लेकिन सामान्य सलाह के संदर्भ में इसे सबसे अंत में सोचना चाहिए.walrusपर निर्भर होती है, इसलिएifको ऊपर नहीं ले जाया जा सकता.ifको caller के पास खिसकाना एक भयानक विचार है। कुछ विशेष मामलों में यह अच्छा हो सकता है, लेकिन सामान्य स्थिति में यह नहीं चाहिए। libraries में preconditions को बाहरी boundary पर जाँचना चाहिए ताकि अंदरूनी implementation बिना आंतरिक assumptions के आगे बढ़ सके। caller की जाँच पर निर्भर रहना इस उद्देश्य को निष्फल कर देता है.