พื้นหลัง
ฉันกำลังทำงานในโครงการ C # ต่อเนื่อง ฉันไม่ใช่โปรแกรมเมอร์ C # ซึ่งส่วนใหญ่เป็นโปรแกรมเมอร์ C ++ ดังนั้นฉันจึงได้รับมอบหมายงานที่ง่ายและเป็นโครงสร้างใหม่
รหัสเป็นระเบียบ มันเป็นโครงการขนาดใหญ่ เนื่องจากลูกค้าของเราเรียกร้องให้มีการเปิดตัวคุณสมบัติใหม่ ๆ และการแก้ไขข้อผิดพลาดบ่อยครั้งนักพัฒนาอื่น ๆ ทั้งหมดจึงถูกบังคับให้ใช้วิธีการเดรัจฉานบังคับในขณะที่เข้ารหัส รหัสไม่สามารถรักษาได้สูงนักและผู้พัฒนารายอื่นก็เห็นด้วย
ฉันไม่ได้มาที่นี่เพื่ออภิปรายว่าพวกเขาทำถูกหรือไม่ ขณะที่ฉันกำลังปรับโครงสร้างใหม่ฉันสงสัยว่าฉันกำลังทำอย่างถูกวิธีเพราะรหัสการปรับโครงสร้างใหม่ของฉันดูเหมือนจะซับซ้อน! นี่คืองานของฉันเป็นตัวอย่างง่ายๆ
ปัญหา
มีหกชั้นเรียน: A
, B
, C
, D
, และE
ทุกชั้นเรียนมีฟังก์ชั่นF
ExecJob()
การใช้งานทั้งหกแบบนั้นคล้ายคลึงกันมาก โดยทั่วไปในตอนแรกA::ExecJob()
เขียน จากนั้นรุ่นที่แตกต่างกันเล็กน้อยที่ถูกต้องซึ่งได้ดำเนินการในB::ExecJob()
โดย A::ExecJob()
copy-paste-การเปลี่ยนแปลงของ เมื่อจำเป็นต้องใช้เวอร์ชันอื่นที่แตกต่างกันเล็กน้อยC::ExecJob()
เขียนขึ้นและต่อไป การใช้งานทั้งหกมีรหัสทั่วไปบางส่วนจากนั้นบางบรรทัดที่แตกต่างกันรหัสแล้วอีกบางรหัสทั่วไปและอื่น ๆ นี่เป็นตัวอย่างง่ายๆของการใช้งาน:
A::ExecJob()
{
S1;
S2;
S3;
S4;
S5;
}
B::ExecJob()
{
S1;
S3;
S4;
S5;
}
C::ExecJob()
{
S1;
S3;
S4;
}
SN
กลุ่มของคำสั่งเดียวกันที่แน่นอนอยู่ที่ไหน
เพื่อให้เป็นเรื่องธรรมดาฉันได้สร้างคลาสใหม่และย้ายรหัสทั่วไปในฟังก์ชั่น การใช้พารามิเตอร์เพื่อควบคุมกลุ่มคำสั่งที่ควรดำเนินการ:
Base::CommonTask(param)
{
S1;
if (param.s2) S2;
S3;
S4;
if (param.s5) S5;
}
A::ExecJob() // A inherits Base
{
param.s2 = true;
param.s5 = true;
CommonTask(param);
}
B::ExecJob() // B inherits Base
{
param.s2 = false;
param.s5 = true;
CommonTask(param);
}
C::ExecJob() // C inherits Base
{
param.s2 = false;
param.s5 = false;
CommonTask(param);
}
โปรดทราบว่าตัวอย่างนี้ใช้เพียงสามคลาสและคำสั่งที่ซับซ้อนมากเกินไป ในทางปฏิบัติCommonTask()
ฟังก์ชั่นดูซับซ้อนมากกับการตรวจสอบพารามิเตอร์ทั้งหมดและมีคำสั่งอีกมากมาย นอกจากนี้ในรหัสจริงมีCommonTask()
ฟังก์ชั่นหลายๆ
แม้ว่าการใช้งานทั้งหมดจะใช้รหัสร่วมกันและExecJob()
ฟังก์ชั่นการค้นหาที่น่ารัก แต่ก็มีสองปัญหาที่รบกวนฉัน:
- สำหรับการเปลี่ยนแปลงใด ๆ
CommonTask()
คุณสมบัติทั้งหก (และอาจมีมากขึ้นในอนาคต) จำเป็นต้องได้รับการทดสอบ CommonTask()
ซับซ้อนอยู่แล้ว มันจะซับซ้อนขึ้นเมื่อเวลาผ่านไป
ฉันกำลังทำอย่างถูกวิธี?