Cơ sở mã hóa tôi đang làm việc thường xuyên sử dụng các biến đối tượng để chia sẻ dữ liệu giữa các phương thức tầm thường khác nhau. Nhà phát triển ban đầu rất kiên quyết rằng điều này tuân thủ các thực tiễn tốt nhất được nêu trong cuốn sách Clean Code của chú Bob / Robert Martin: "Quy tắc đầu tiên của các chức năng là chúng phải nhỏ." và "Số lượng đối số lý tưởng cho một hàm là 0 (niladic). (...) Các đối số là khó. Chúng có rất nhiều sức mạnh khái niệm."
Một ví dụ:
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);
}
}
Tôi sẽ cấu trúc lại thành các biến sau bằng cách sử dụng các biến cục bộ:
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);
}
}
Điều này ngắn hơn, nó loại bỏ việc ghép dữ liệu ngầm giữa các phương thức tầm thường khác nhau và nó giới hạn phạm vi biến đổi ở mức tối thiểu cần thiết. Tuy nhiên, bất chấp những lợi ích này, tôi dường như vẫn không thể thuyết phục được nhà phát triển ban đầu rằng việc tái cấu trúc này được bảo hành, vì nó dường như mâu thuẫn với các hoạt động của chú Bob đã đề cập ở trên.
Do đó câu hỏi của tôi: lý do khách quan, khoa học để ủng hộ các biến cục bộ hơn các biến thể hiện là gì? Tôi dường như không thể đặt ngón tay của mình lên nó. Trực giác của tôi nói với tôi rằng các khớp nối ẩn là xấu và phạm vi hẹp tốt hơn phạm vi rộng. Nhưng khoa học để sao lưu này là gì?
Và ngược lại, có bất kỳ nhược điểm nào đối với việc tái cấu trúc này mà tôi có thể bỏ qua không?