codebase ของเรานั้นเก่าและโปรแกรมเมอร์ใหม่อย่างฉันเรียนรู้ที่จะทำอย่างที่มันทำเพื่อความสม่ำเสมอ เมื่อคิดว่าเราจะต้องเริ่มต้นที่ไหนสักแห่งฉันก็เลยทำมันเองเพื่อสร้างคลาสของตัวยึดข้อมูลอีกครั้ง:
- ลบเมธอด setter และสร้างฟิลด์ทั้งหมด
final
(ฉันใช้ "final
ดี" ตามหลักการ) ตัวตั้งค่าถูกใช้เฉพาะในตัวสร้างเมื่อมันปรากฏออกดังนั้นสิ่งนี้จึงไม่มีผลข้างเคียง - แนะนำคลาส Builder
คลาส Builder นั้นจำเป็นเนื่องจากตัวสร้าง (ซึ่งเป็นสิ่งที่ให้การรีแฟคเตอร์ใหม่ในตอนแรก) ครอบคลุมโค้ดประมาณ 3 บรรทัด แต่ก็มีจำนวนมากของพารามิเตอร์
โชคดีที่มีมันเพื่อนร่วมทีมของฉันกำลังทำงานในโมดูลอื่นและเกิดขึ้นเพื่อต้องการผู้ตั้งค่าเนื่องจากค่าที่เขาต้องการนั้นมีอยู่ในจุดต่าง ๆ ในการไหล ดังนั้นรหัสดูเหมือนว่านี้:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
ฉันเป็นที่ถกเถียงกันอยู่ว่าเขาควรจะใช้ผู้สร้างแทนเพราะการกำจัด setters ทำให้ทุ่งนาไม่สามารถเปลี่ยนแปลงได้ (พวกเขาเคยได้ยินว่าฉันโกรธมากเกี่ยวกับความไม่สามารถเปลี่ยนแปลงได้ก่อนหน้านี้) และเพราะผู้สร้างอนุญาตให้สร้างวัตถุ ฉันร่างรหัสเทียมต่อไปนี้:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
หากข้อยกเว้นนั้นเริ่มทำงานbar
จะมีข้อมูลที่เสียหายซึ่งจะหลีกเลี่ยงได้ด้วยตัวสร้าง:
public Bar foo(){
Builder builder=new Builder();
try{
builder.setA(a);
//dangerous stuff;
builder.setB(b);
//more dangerous stuff
builder.setC(c);
return builder.build();
}catch(){}
return null;
}
เพื่อนร่วมทีมของฉันตอบโต้ว่าข้อยกเว้นที่เป็นปัญหาจะไม่เกิดขึ้นซึ่งมีความยุติธรรมเพียงพอสำหรับรหัสเฉพาะนั้น แต่ฉันเชื่อว่าหายไปจากป่าสำหรับต้นไม้
การประนีประนอมคือการย้อนกลับไปใช้โซลูชันเก่าคือใช้ตัวสร้างที่ไม่มีพารามิเตอร์และตั้งค่าทุกอย่างด้วย setters ตามต้องการ เหตุผลคือการแก้ปัญหานี้เป็นไปตามหลักการ KISS ซึ่งเหมืองของฉันละเมิด
ฉันใหม่กับ บริษัท นี้ (น้อยกว่า 6 เดือน) และตระหนักดีว่าฉันทำสิ่งนี้หาย คำถามที่ฉันมีคือ:
- มีข้อโต้แย้งอื่น ๆ สำหรับการใช้ผู้สร้างแทนที่จะเป็น "วิธีเก่า" หรือไม่?
- การเปลี่ยนแปลงที่ฉันเสนอนั้นคุ้มค่าหรือไม่
แต่จริงๆ
- คุณมีเคล็ดลับใดบ้างที่จะนำเสนอข้อโต้แย้งดังกล่าวได้ดีขึ้นเมื่อพยายามสนับสนุนสิ่งใหม่ ๆ ?
setA
?