내가 작업하고있는 코드베이스는 인스턴스 변수를 자주 사용하여 다양한 사소한 메소드간에 데이터를 공유합니다. 원래 개발자는 이것이 Bob / Robert Martin 삼촌 의 Clean Code book에 언급 된 모범 사례를 준수한다는 것을 강력하게 인정합니다 . "기능의 첫 번째 규칙은 작을 것입니다." 그리고 "함수에 대한 이상적인 인수의 수는 0입니다 (나일론). (...) 인수는 어렵습니다. 많은 개념적 힘이 필요합니다."
예를 들면 :
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);
}
}
이것은 더 짧고, 다양한 사소한 방법들 사이의 암시 적 데이터 결합을 제거하고 변수 범위를 필요한 최소로 제한합니다. 그러나 이러한 이점에도 불구하고 위에서 언급 한 Bob 아저씨의 관행에 위배되는 것처럼이 리팩토링이 필요하다는 것을 원래 개발자에게 설득 할 수없는 것 같습니다.
따라서 내 질문 : 인스턴스 변수보다 로컬 변수를 선호하는 객관적이고 과학적인 근거는 무엇입니까? 손가락을 대지 못하는 것 같습니다. 내 직감 은 숨겨진 커플 링이 나쁘고 좁은 범위가 넓은 것보다 낫다는 것을 알려줍니다. 그러나 이것을 뒷받침하는 과학은 무엇입니까?
반대로, 내가 간과 한이 리팩토링에 단점이 있습니까?