यदि आप एक लाइनर जैसे विस्तार करने के लिए मजबूर महसूस किया
a = F(G1(H1(b1), H2(b2)), G2(c1));
मैं आपको दोषी नहीं ठहराऊंगा। यह न केवल पढ़ने के लिए कठिन है, यह डिबग करना कठिन है।
क्यों?
- यह सघन है
- कुछ डिबगर केवल एक ही बार में पूरी बात को उजागर करेंगे
- यह वर्णनात्मक नामों से मुक्त है
यदि आप इसे मध्यवर्ती परिणामों के साथ बढ़ाते हैं, तो आप प्राप्त करते हैं
var result_h1 = H1(b1);
var result_h2 = H2(b2);
var result_g1 = G1(result_h1, result_h2);
var result_g2 = G2(c1);
var a = F(result_g1, result_g2);
और यह अभी भी पढ़ना मुश्किल है। क्यों? यह दो समस्याओं का हल करता है और एक चौथे का परिचय देता है:
यह सघन है
कुछ डिबगर केवल एक ही बार में पूरी बात को उजागर करेंगे
- यह वर्णनात्मक नामों से मुक्त है
- यह गैर-वर्णनात्मक नामों के साथ बरबाद है
यदि आप इसे ऐसे नामों के साथ विस्तारित करते हैं जो नए, अच्छे, शब्दार्थ अर्थ जोड़ते हैं, तो और भी बेहतर! एक अच्छा नाम मुझे समझने में मदद करता है।
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
अब कम से कम यह एक कहानी कहता है। यह समस्याओं को ठीक करता है और स्पष्ट रूप से यहां दी गई किसी भी चीज़ से बेहतर है लेकिन इसके लिए आपको नामों के साथ आने की आवश्यकता है।
अगर आप इसे अर्थहीन नामों के साथ पसंद करते हैं result_this
और result_that
क्योंकि आप केवल अच्छे नामों के बारे में नहीं सोच सकते हैं, तो मैं वास्तव में आपको पसंद करूंगा कि हम निरर्थक नाम को अव्यवस्थित करें और कुछ अच्छे पुराने व्हाट्सएप का उपयोग करके इसका विस्तार करें:
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
यह उतना ही पठनीय है, यदि अधिक नहीं, तो अर्थहीन परिणाम वाले नामों की तुलना में (न कि ये फ़ंक्शन नाम उस महान हैं)।
यह सघन है
कुछ डिबगर केवल एक ही बार में पूरी बात को उजागर करेंगे
- यह वर्णनात्मक नामों से मुक्त है
यह गैर-वर्णनात्मक नामों के साथ बरबाद है
जब आप अच्छे नामों के बारे में नहीं सोच सकते हैं, तो यह उतना ही अच्छा है जितना इसे मिलता है।
कुछ कारणों से डिबगर नई लाइनों से प्यार करते हैं, इसलिए आपको पता होना चाहिए कि यह डीबग करना मुश्किल नहीं है:
यदि यह पर्याप्त नहीं है, तो कल्पना G2()
को एक से अधिक स्थानों पर बुलाया गया और फिर यह हुआ:
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
मुझे लगता है कि यह अच्छा है कि चूंकि प्रत्येक G2()
कॉल स्वयं की लाइन पर होगी, इसलिए यह शैली आपको सीधे मुख्य कॉलिंग में ले जाती है।
तो कृपया 1 और 2 की समस्याओं को हमें समस्या के साथ चिपकाने के बहाने के रूप में उपयोग न करें। 4. जब आप उनके बारे में सोच सकते हैं तो अच्छे नामों का उपयोग करें। जब आप नहीं कर सकते तो निरर्थक नामों से बचें।
ऑर्बिट की टिप्पणी में लाइटनेस दौड़ सही ढंग से बताती है कि ये कार्य कृत्रिम हैं और इनमें ख़राब नाम हैं। तो यहाँ इस शैली को जंगली से कुछ कोड पर लागू करने का एक उदाहरण है:
var user = db.t_ST_User.Where(_user => string.Compare(domain,
_user.domainName.Trim(), StringComparison.OrdinalIgnoreCase) == 0)
.Where(_user => string.Compare(samAccountName, _user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase) == 0).Where(_user => _user.deleted == false)
.FirstOrDefault();
मुझे उस शोर की धारा को देखने से नफरत है, यहां तक कि जब शब्द रैपिंग की आवश्यकता नहीं होती है। यह इस शैली के तहत कैसा दिखता है:
var user = db
.t_ST_User
.Where(
_user => string.Compare(
domain,
_user.domainName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(
_user => string.Compare(
samAccountName,
_user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(_user => _user.deleted == false)
.FirstOrDefault()
;
जैसा कि आप देख सकते हैं, मैंने पाया है कि यह शैली कार्यात्मक कोड के साथ अच्छी तरह से काम करती है जो ऑब्जेक्ट ओरिएंटेड स्पेस में बढ़ रही है। यदि आप अच्छे नामों के साथ इंटरमीडिएट शैली में ऐसा कर सकते हैं तो आपके लिए अधिक शक्ति है। तब तक मैं इसका उपयोग कर रहा हूं। लेकिन किसी भी मामले में, कृपया, परिणामहीन नामों से बचने के लिए कोई रास्ता निकालें। वे मेरी आँखों को चोट पहुँचाते हैं।