Basis kode yang saya kerjakan sering menggunakan variabel instan untuk berbagi data antara berbagai metode sepele. Pengembang asli bersikeras bahwa ini mematuhi praktik terbaik yang dinyatakan dalam buku Kode Bersih oleh Paman Bob / Robert Martin: "Aturan fungsi pertama adalah bahwa mereka harus kecil." dan "Jumlah argumen ideal untuk suatu fungsi adalah nol (niladik). (...) Argumennya sulit. Mereka membutuhkan banyak kekuatan konseptual."
Sebuah contoh:
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);
}
}
Saya akan mengubahnya menjadi menggunakan variabel lokal berikut:
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);
}
}
Ini lebih pendek, menghilangkan kopling data implisit antara berbagai metode sepele dan membatasi ruang lingkup variabel ke minimum yang diperlukan. Namun terlepas dari manfaat ini, saya masih belum bisa meyakinkan pengembang asli bahwa refactoring ini dibenarkan, karena tampaknya bertentangan dengan praktik Paman Bob yang disebutkan di atas.
Karena itu pertanyaan saya: Apa tujuan, alasan ilmiah untuk mendukung variabel lokal daripada variabel instan? Sepertinya saya tidak bisa meletakkan jari saya di atasnya. Saya intuisi memberitahu saya bahwa kopling tersembunyi buruk dan bahwa ruang lingkup yang sempit adalah lebih baik daripada yang luas. Tapi apa ilmu yang mendukung hal ini?
Dan sebaliknya, apakah ada kerugian untuk refactoring yang mungkin saya abaikan?