मैं जिस कोडबेस पर काम कर रहा हूं, वह विभिन्न तुच्छ तरीकों के बीच डेटा साझा करने के लिए अक्सर उदाहरण चर का उपयोग करता है। मूल डेवलपर यह मानता है कि यह अंकल बॉब / रॉबर्ट मार्टिन द्वारा क्लीन कोड बुक में बताई गई सर्वोत्तम प्रथाओं का पालन करता है : "कार्यों का पहला नियम यह है कि वे छोटे होने चाहिए।" और "एक फ़ंक्शन के लिए तर्कों की आदर्श संख्या शून्य (एनलाइडिक) है। (...) तर्क कठिन हैं। वे बहुत अधिक वैचारिक शक्ति लेते हैं।"
एक उदाहरण:
public class SomeBusinessProcess {
@Inject private Router router;
@Inject private ServiceClient serviceClient;
@Inject private CryptoService cryptoService;
private byte[] encodedData;
private EncryptionInfo encryptionInfo;
private EncryptedObject payloadOfResponse;
private URI destinationURI;
public EncryptedResponse process(EncryptedRequest encryptedRequest) {
checkNotNull(encryptedRequest);
getEncodedData(encryptedRequest);
getEncryptionInfo();
getDestinationURI();
passRequestToServiceClient();
return cryptoService.encryptResponse(payloadOfResponse);
}
private void getEncodedData(EncryptedRequest encryptedRequest) {
encodedData = cryptoService.decryptRequest(encryptedRequest, byte[].class);
}
private void getEncryptionInfo() {
encryptionInfo = cryptoService.getEncryptionInfoForDefaultClient();
}
private void getDestinationURI() {
destinationURI = router.getDestination().getUri();
}
private void passRequestToServiceClient() {
payloadOfResponse = serviceClient.handle(destinationURI, encodedData, encryptionInfo);
}
}
मैं स्थानीय चर का उपयोग करते हुए निम्नलिखित में सुधार करूंगा:
public class SomeBusinessProcess {
@Inject private Router router;
@Inject private ServiceClient serviceClient;
@Inject private CryptoService cryptoService;
public EncryptedResponse process(EncryptedRequest encryptedRequest) {
checkNotNull(encryptedRequest);
byte[] encodedData = cryptoService.decryptRequest(encryptedRequest, byte[].class);
EncryptionInfo encryptionInfo = cryptoService.getEncryptionInfoForDefaultClient();
URI destinationURI = router.getDestination().getUri();
EncryptedObject payloadOfResponse = serviceClient.handle(destinationURI, encodedData,
encryptionInfo);
return cryptoService.encryptResponse(payloadOfResponse);
}
}
यह छोटा है, यह विभिन्न तुच्छ तरीकों के बीच निहित डेटा युग्मन को समाप्त करता है और यह चर स्कोप को न्यूनतम आवश्यक तक सीमित करता है। फिर भी इन लाभों के बावजूद मैं अभी भी मूल डेवलपर को यह विश्वास नहीं दिला पा रहा हूं कि यह रीक्रैक्टिंग वारंट है, क्योंकि यह ऊपर वर्णित अंकल बॉब की प्रथाओं का खंडन करता प्रतीत होता है।
इसलिए मेरे सवाल: उदाहरण के चर पर स्थानीय चर के पक्ष में उद्देश्य, वैज्ञानिक तर्क क्या है? मैं अपनी उंगली उस पर नहीं डाल सकता। मेरा अंतर्ज्ञान मुझे बताता है कि छिपे हुए कपलिंग खराब हैं और एक संकीर्ण गुंजाइश एक व्यापक से बेहतर है। लेकिन इसे वापस करने का विज्ञान क्या है?
और इसके विपरीत, क्या इस परावर्तन के लिए कोई डाउनसाइड्स हैं जिन्हें मैंने संभवतः अनदेखा कर दिया है?