codebase ที่ฉันใช้บ่อยใช้ตัวแปรอินสแตนซ์เพื่อแชร์ข้อมูลระหว่างวิธีการต่าง ๆ นักพัฒนาดั้งเดิมยืนยันว่านี่เป็นไปตามแนวทางปฏิบัติที่ดีที่สุดที่ระบุไว้ในหนังสือClean Codeของลุงบ๊อบ / โรเบิร์ตมาร์ติน: "กฎข้อแรกของฟังก์ชั่นคือพวกเขาควรมีขนาดเล็ก" และ "จำนวนที่เหมาะสมของการขัดแย้งสำหรับฟังก์ชั่นคือศูนย์ (niladic) (... ) การโต้เถียงนั้นยากพวกเขาใช้พลังทางแนวคิดมากมาย"
ตัวอย่าง:
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);
}
}
ฉันจะ refactor ที่เป็นต่อไปนี้โดยใช้ตัวแปรท้องถิ่น:
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);
}
}
นี่จะสั้นกว่าซึ่งจะกำจัดการมีเพศสัมพันธ์ข้อมูลโดยนัยระหว่างวิธีการเล็กน้อยต่าง ๆ และ จำกัด ขอบเขตของตัวแปรให้น้อยที่สุดที่ต้องการ ถึงแม้จะมีประโยชน์เหล่านี้ แต่ก็ดูเหมือนว่าฉันไม่สามารถโน้มน้าวให้นักพัฒนาดั้งเดิมได้ยืนยันว่าการปรับโครงสร้างนี้จะได้รับการรับประกันเนื่องจากดูเหมือนจะขัดแย้งกับการปฏิบัติของลุงบ๊อบที่กล่าวถึงข้างต้น
ดังนั้นคำถามของฉัน: อะไรคือวัตถุประสงค์เหตุผลทางวิทยาศาสตร์เพื่อสนับสนุนตัวแปรท้องถิ่นมากกว่าตัวแปรอินสแตนซ์? ฉันไม่สามารถวางนิ้วลงบนมันได้ สัญชาตญาณของฉันบอกฉันว่าข้อต่อที่ซ่อนอยู่นั้นไม่ดีและขอบเขตที่แคบนั้นดีกว่าตัวที่กว้าง แต่อะไรคือวิทยาศาสตร์ที่จะสนับสนุนสิ่งนี้
และในทางกลับกันมีข้อเสียสำหรับการเปลี่ยนโฉมใหม่ที่ฉันอาจมองข้ามหรือไม่?