Кодовая база, над которой я работаю, часто использует переменные экземпляра для обмена данными между различными тривиальными методами. Первоначальный разработчик непреклонен, что он придерживается лучших практик, изложенных в книге « Чистый код » дядюшки Боба / Роберта Мартина: «Первое правило функций заключается в том, что они должны быть маленькими». и «Идеальное число аргументов для функции - ноль (нильадик). (...) Аргументы - это сложно. Они требуют много концептуальной силы».
Пример:
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);
}
}
Это короче, оно устраняет неявную связь данных между различными тривиальными методами и ограничивает области видимости до минимума. Тем не менее, несмотря на эти преимущества, я все еще не могу убедить первоначального разработчика в том, что этот рефакторинг оправдан, так как, по-видимому, он противоречит практике дяди Боба, упомянутой выше.
Отсюда мои вопросы: какова цель, научное обоснование предпочтения локальных переменных переменным экземпляра? Кажется, я не могу понять, как это сделать. Моя интуиция говорит мне, что скрытые связи плохие и что узкая область лучше, чем широкая. Но какая наука поддерживает это?
И наоборот, есть ли недостатки этого рефакторинга, которые я, возможно, упустил из виду?