เรามีสถานที่ค่อนข้างมากในซอร์สโค้ดของแอปพลิเคชันของเราที่คลาสหนึ่งมีวิธีการมากมายที่มีชื่อเดียวกันและพารามิเตอร์ที่แตกต่างกัน วิธีการเหล่านั้นมักจะมีพารามิเตอร์ทั้งหมดของวิธี 'ก่อนหน้า' บวกอีกหนึ่ง
มันเป็นผลมาจากวิวัฒนาการที่ยาวนาน (รหัสดั้งเดิม) และความคิดนี้ (ฉันเชื่อ):
" มีวิธี M ที่ทำสิ่ง A. ฉันต้องทำ A + B ตกลงฉันรู้ ... ฉันจะเพิ่มพารามิเตอร์ใหม่ให้กับ M สร้างวิธีการใหม่เพื่อย้ายรหัสจาก M ไปยังวิธีใหม่ ด้วยพารามิเตอร์อีกหนึ่งตัวให้ทำ A + B ตรงนั้นแล้วเรียกวิธีการใหม่จาก M ด้วยค่าเริ่มต้นของพารามิเตอร์ใหม่ "
นี่คือตัวอย่าง (ในภาษา Java-like-language):
class DocumentHome {
(...)
public Document createDocument(String name) {
// just calls another method with default value of its parameter
return createDocument(name, -1);
}
public Document createDocument(String name, int minPagesCount) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false);
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false, "");
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank, String title) {
// here the real work gets done
(...)
}
(...)
}
ฉันรู้สึกว่ามันผิด ไม่เพียง แต่เราไม่สามารถเพิ่มพารามิเตอร์ใหม่เช่นนี้ตลอดไปได้ แต่รหัสยากที่จะขยาย / เปลี่ยนแปลงเนื่องจากการพึ่งพาทั้งหมดระหว่างวิธีการ
ต่อไปนี้เป็นวิธีการทำได้ดีกว่า:
แนะนำวัตถุพารามิเตอร์:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
ตั้งค่าพารามิเตอร์เป็น
DocumentHome
วัตถุก่อนที่เราจะเรียกcreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
แยกงานออกเป็นวิธีต่างๆและเรียกพวกเขาตามต้องการ:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
คำถามของฉัน:
- ปัญหาที่อธิบายเป็นปัญหาจริงหรือไม่?
- คุณคิดอย่างไรเกี่ยวกับแนวทางแก้ไขที่แนะนำ คุณต้องการแบบไหน (ขึ้นอยู่กับประสบการณ์ของคุณ)
- คุณนึกถึงโซลูชันอื่น ๆ ได้ไหม?