ฉันอ่านเกี่ยวกับรหัสที่พบบ่อยมีกลิ่นในหนังสือ Refactoring Martin Fowler ของ ในบริบทนั้นฉันสงสัยเกี่ยวกับรูปแบบที่ฉันเห็นในฐานรหัสและไม่มีใครสามารถคิดว่ามันเป็นรูปแบบการต่อต้าน
รูปแบบเป็นสิ่งหนึ่งที่วัตถุถูกส่งผ่านเป็นอาร์กิวเมนต์หนึ่งหรือหลายวิธีซึ่งทั้งหมดนี้เปลี่ยนสถานะของวัตถุ แต่ไม่มีใครกลับวัตถุ ดังนั้นจึงขึ้นอยู่กับการส่งผ่านโดยอ้างอิงธรรมชาติของ (ในกรณีนี้) C # /. NET
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
ฉันพบว่า (โดยเฉพาะอย่างยิ่งเมื่อวิธีการไม่ได้ตั้งชื่ออย่างเหมาะสม) ฉันต้องมองหาวิธีการดังกล่าวเพื่อทำความเข้าใจว่าสถานะของวัตถุมีการเปลี่ยนแปลง มันทำให้เข้าใจรหัสมากขึ้นเนื่องจากฉันต้องการติดตาม call-stack หลายระดับ
ฉันต้องการเสนอให้ปรับปรุงโค้ดดังกล่าวเพื่อส่งคืนออบเจ็กต์อื่น (โคลน) ด้วยสถานะใหม่หรืออะไรก็ตามที่จำเป็นในการเปลี่ยนออบเจ็กต์ที่ไซต์การโทร
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
สำหรับฉันดูเหมือนว่ารูปแบบแรกจะถูกเลือกบนสมมติฐาน
- ทำงานได้น้อยลงหรือต้องการรหัสน้อยกว่า
- มันช่วยให้เราสามารถเปลี่ยนวัตถุและคืนข้อมูลบางส่วน
Thing
ว่ามันมีประสิทธิภาพมากขึ้นเนื่องจากเรามีอินสแตนซ์น้อย
ฉันแสดงให้เห็นทางเลือกอื่น แต่เพื่อที่จะนำเสนอมันต้องมีการโต้แย้งกับวิธีแก้ปัญหาดั้งเดิม หากมีข้อโต้แย้งใด ๆ ที่สามารถสร้างขึ้นมาเพื่อทำให้กรณีที่โซลูชันดั้งเดิมเป็นรูปแบบการต่อต้าน
และหากมีอะไรผิดปกติกับทางเลือกอื่นของฉัน