Üzerinde çalıştığım kod temeli, çeşitli önemsiz yöntemler arasında veri paylaşmak için sık sık örnek değişkenleri kullanır. Asıl geliştirici, bunun Bob Amca / Robert Martin tarafından Temiz Kod kitabında belirtilen en iyi uygulamalara uyması konusunda gayretlidir : "İşlevlerin ilk kuralı, küçük olmaları gerektiğidir." ve "Bir fonksiyon için ideal argüman sayısı sıfırdır (niladik). (...) Argümanlar zordur. Çok fazla kavramsal güç harcarlar."
Bir örnek:
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);
}
}
Yerel değişkenleri kullanarak aşağıdakileri dikkate alın:
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);
}
}
Bu daha kısadır, çeşitli önemsiz yöntemler arasındaki örtük veri bağlantısını ortadan kaldırır ve değişken kapsamları gereken minimum ile sınırlar. Yine de, bu faydalara rağmen, orijinal geliştiriciyi yukarıda belirtilen Bob Amca'nın uygulamalarıyla çelişiyor gibi göründüğü için bu yeniden düzenlemenin garantili olduğuna ikna edemiyorum.
Dolayısıyla benim sorularım: Örnek değişkenler yerine yerel değişkenleri desteklemenin amacı, bilimsel mantığı nedir? Parmağımı üstüne koymuş gibi görünemiyorum. Benim sezgi gizli kaplinler kötü ve dar bir kapsam geniş olandan daha iyi olduğunu gösteriyor bana. Fakat bunu destekleyen bilim nedir?
Ve tam tersine, bu yeniden gözden geçirmenin muhtemelen göz ardı ettiğim herhangi bir olumsuz tarafı var mı?