อาร์กิวเมนต์หนึ่งที่สนับสนุนโค้ดสำเร็จรูปคือถ้าคุณเปลี่ยนในที่เดียวมันจะมีผลกับการไหลของรหัสเพียงครั้งเดียว สิ่งนี้จะต้องมีความสมดุลกับความจริงที่ว่าบ่อยครั้งกว่าคุณไม่ต้องการให้การเปลี่ยนแปลงมีผลกับโค้ดทุกชิ้นที่ใช้งาน แต่ฉันได้เห็นตัวอย่างที่หายากซึ่งสนับสนุนการโต้แย้ง
สมมติว่าคุณมีรหัสที่บอกว่า
public ForTheBar(Foo foo)
{
Bar bar = foo.bar();
return bar.BeFooed();
}
ใช้ในสถานที่ประมาณ 2 แห่งในรหัสของคุณ
อยู่มาวันหนึ่งมีคนมาและพูดว่า "โอเคในเส้นทางนี้เท่านั้นเราต้องการให้คุณ Grommit บาร์ก่อนที่จะตบมัน"
และคุณคิดว่า "นี่มันง่ายมาก"
public ForTheBar(Foo foo, bool shouldIGrommit)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
return bar.BeFooed();
}
จากนั้นผู้ใช้ของคุณจะเพิ่มฟังก์ชั่นใหม่และคุณคิดว่ามันเข้ากันได้ดีกับ FooTheBar และคุณถามพวกเขาตามหน้าที่ถ้าคุณควรจะ Grommit แถบนั้นก่อนที่คุณจะฟูและพวกเขาก็พูดว่า "ไม่ไม่ใช่เวลานี้"
ดังนั้นคุณเพียงแค่เรียกวิธีการข้างต้น
แต่จากนั้นผู้ใช้ของคุณบอกว่า "โอเครอในกรณีที่สามเราต้องการให้คุณ Doodle the Bar ก่อนโทรหา BeFooed"
ไม่มีปัญหาคุณคิดว่าฉันสามารถทำได้
public ForTheBar(Foo foo, bool shouldIGrommit, bool shouldIDoodle)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
if (shouldIDoodle)
{
bar.BeDoodled();
}
return bar.BeFooed();
}
ทันใดนั้นโค้ดของคุณกำลังกลายเป็นไอน้ำน้อย บางทีคุณควรยอมรับรหัสสองบรรทัดที่ซ้ำกัน ถึงตอนนี้คุณจะมีรหัสสามชิ้นแต่ละบรรทัดยาว 2-3 บรรทัดและไม่ได้ดูซ้ำอีกต่อไป
ทั้งหมดนี้กล่าวว่าฉันจะตอบโต้ด้วย "นี่ไม่ใช่กรณีทั่วไปและเมื่อมันเกิดขึ้นคุณสามารถ refactor"
อาร์กิวเมนต์ที่ฉันได้ยินเมื่อเร็ว ๆ นี้ก็คือบางครั้งรหัสสำเร็จรูปอาจช่วยคุณนำทางรหัส ตัวอย่างที่เราพูดถึงคือที่ที่เราจะลบรหัสการทำแผนที่สำเร็จรูปจำนวนมากและแทนที่ด้วย AutoMapper ตอนนี้มันเป็นที่ถกเถียงกันเพราะทุกอย่างเป็นไปตามการประชุมคุณไม่สามารถพูดว่า "ชุดคุณสมบัตินี้อยู่ที่ไหน" กับ IDE และคาดว่าจะรู้
ฉันเคยเห็นผู้คนโต้แย้งสิ่งที่คล้ายกันเกี่ยวกับคอนเทนเนอร์ IoC
ไม่พูดว่าฉันเห็นด้วยกับพวกเขา แต่มันก็เป็นข้อโต้แย้งที่ยุติธรรมอย่างไรก็ตาม