- John Carmack ने mutable variable के उपयोग पर अपने निजी विचार साझा किए
- उन्होंने कहा कि Python का उपयोग करते हुए ‘single assignment’ सिद्धांत को नज़रअंदाज़ करने की आदत पड़ गई है, और इससे खुद को सावधान रखना चाहिए
- उन्होंने ज़ोर देकर कहा कि loop की iteration में होने वाली गणना को छोड़कर variable को दोबारा assign या update करने से बचना चाहिए
- अगर बीच के सभी calculation steps बने रहें, तो debugging में मदद मिलती है, और code block को स्थानांतरित करते समय अनजाने में पुराने value के इस्तेमाल की समस्या रोकी जा सकती है
- उन्होंने समझाया कि C/C++ में लगभग सभी variables को initialization के समय const के रूप में declare करना एक अच्छी आदत है
- अंत में उन्होंने यह कहते हुए ज़ोर दिया, “काश mutable एक keyword होता,” ताकि immutability default बन सके
1 टिप्पणियां
Hacker News राय
2 साल तक Clojure इस्तेमाल करने के बाद मुझे एहसास हुआ कि अन्य डेवलपर्स को immutable होने से मिलने वाली स्पष्टता समझाना वास्तव में बहुत कठिन है
जो लोग state change के ज़रिए effects पैदा करने वाली सोच के आदी हैं, उनके लिए इसे खुद अनुभव करने से पहले समझना मुश्किल होता है
उदाहरण के लिए, अगर आप
x = 7; x = x + 3; x = x / 2लिखते हैं, तो क्रम बदलने पर error नहीं आएगी, लेकिन result बदल जाएगावहीं
x1,x2जैसे नए variables इस्तेमाल करने पर गलत क्रम में error आएगी और समस्या साफ़ दिखेगीआखिरकार single assignment ऐसी dependencies को स्पष्ट रूप से व्यक्त करने का तरीका है
जिन सहकर्मियों ने functional language कभी नहीं इस्तेमाल की थी, उन्हें यह समझाने की कोशिश की कि function-केंद्रित सोच कितनी आसानी से test की जा सकती है और कितनी साफ़-सुथरी है, लेकिन बात ठीक से पहुँचती नहीं थी
Python में functional style को पढ़ने लायक तरीके से लिखना कठिन है, और JS इस मामले में बेहतर लगता है
आखिर में केवल जिज्ञासु डेवलपर्स ही Clojure जैसी भाषाएँ आज़माते हैं
function को external state जानने की ज़रूरत नहीं होती, और बाहर की दुनिया को भी function के अंदर की जानकारी नहीं चाहिए
पूरे program state को जाने बिना भी किसी खास function को स्वतंत्र रूप से test या debug किया जा सकता है
Haskell community आखिरकार type system के भीतर mutability को फिर से गढ़ने की कोशिश करती दिखती है, यह दिलचस्प है
असली बात है side effects को न्यूनतम लागत पर नियंत्रित करना
Haskell में type system की वजह से entry barrier ऊँचा था, और F# इतना समझौतावादी लगा कि आखिर में C# syntax में ही coding होने लगती थी
Clojure की homoiconicity और शक्तिशाली data structures की वजह से पहली बार यह विचार साफ़ हुआ कि ‘values के साथ काम करना’ क्या होता है
मैं इसे पेशेवर रूप से शायद इस्तेमाल न करूँ, लेकिन जिन लोगों के पास functional language या Lisp का अनुभव नहीं है, उन्हें मैं इसे ज़रूर recommend करना चाहूँगा
काश variables default रूप से immutable होते और हर चीज़ expression होती
लेकिन हक़ीक़त यह है कि Clojure डेवलपर के रूप में मैं Python के आक्रमण से जूझ रहा हूँ
अब मैं TypeScript के आक्रमण से जूझ रहा हूँ, इसलिए यह बात समझ में आती है
यह तरीका परिवर्तन के दायरे को सीमित करने में वास्तव में उपयोगी है
languages के बीच होने वाले tribal wars में फँसने की कोई ज़रूरत नहीं
productivity बढ़ाने के इस दौर में सीमाएँ अर्थहीन हैं
Don’t Call Yourself a Programmer लेख recommend करता हूँ
मैं variable reassignment को कम से कम रखने की कोशिश करता हूँ, लेकिन अक्सर variable shadowing का इस्तेमाल करता हूँ
result = result.process()जैसा pattern संक्षिप्त होने की वजह से पसंद हैउदाहरण के लिए, अगर
process()एक validation function है, तो यह अस्पष्ट हो सकता है कि किसी बिंदु पर value processed थी या नहींइसलिए नामों के ज़रिए state को साफ़ तौर पर अलग रखना बेहतर है
उदाहरण:
result = x |> foo |> bar |> bazया(-> x foo bar baz)result.process()? आखिर कौन-सा result और कौन-सा process?”बाद में code पढ़ने वाला व्यक्ति उलझ सकता है
“variable” शब्द खुद भी हमेशा थोड़ा खटकता है
अगर वह immutable है, तो उसे variable क्यों कहा जाए?
Rust में केवल
mutको स्पष्ट रूप से लिखने पर ही बदलाव संभव होता हैवहीं C में constant बनाने के लिए preprocessor का सहारा लेना पड़ता है, जो भ्रम पैदा करता है
xहर call पर अलग value लेता है, इसलिए वह अपने आप में बदलने वाला value हैreassignment न होने पर भी उसे variable कहा जा सकता है
programming ने यही विचार अपनाया है
constant हर execution में वही value रखता है
Variable (mathematics) देखें
अच्छा होगा अगर IDE variable के बदलने या न बदलने को दृश्य रूप में दिखाए
जैसे, बदले गए variables को बस हल्का-सा mark कर दे
जहाँ तक संभव हो
finalका अधिक इस्तेमाल करने से code पढ़ने और maintain करने में आसान हो जाता हैIDE warning दे, और केवल सच में ज़रूरत होने पर ही बदलाव की अनुमति हो
Rich Hickey की set vs list वाली बात की तरह, ऐसा structure चुनना चाहिए जो अर्थ को स्पष्ट रूप से व्यक्त करे
पहले मैंने thread safety के लिए immutability को बहुत सख्ती से लागू करने वाला एक project किया था
इसकी वजह से code पढ़ना आसान हुआ, और यह ट्रैक करना भी आसान हुआ कि क्या बदल सकता है
तब से मैं immutability का कट्टर प्रशंसक बन गया हूँ
बड़े Haskell codebase पर काम करने के बाद जब फिर C पर लौटा, तो लगा कि immutability default होनी चाहिए
constकाफ़ी नहीं हैmutation के लिए pointers का सहारा लेना पड़ता है, और C++ में तो केवल function call से भी arguments बदल सकते हैं, जिससे चीज़ें अपारदर्शी हो जाती हैं
“लगभग सभी variables को const घोषित करना अच्छा है” — इस बात से सहमत हूँ
यहाँ Rust का ज़िक्र होना स्वाभाविक है
मैं ऐसी syntax की कल्पना करता हूँ जहाँ default immutable हो, और केवल किसी खास block के अंदर ही mutable की अनुमति हो
जैसे Python के
withblock की तरहblock से बाहर निकलते ही फिर से immutable हो जाए
Rust के borrow checker को देखें तो पता चलता है कि यह विचार कितना जटिल है
एक कहावत है, “State is the enemy”
state जितनी बढ़ती है, test करने वाली conditions उतनी ही गुणात्मक रूप से बढ़ती जाती हैं
immutability इस तरह के state explosion को रोकने का एक तरीका है
Separation of Church and State