จากมุมมองหลักการ SOLID คำตอบ jgauffinเหมาะสม อย่างไรก็ตามคุณไม่ควรลืมเกี่ยวกับหลักการออกแบบทั่วไปเช่นที่หลบซ่อนข้อมูล
ฉันเห็นปัญหาหลายประการด้วยวิธีการที่กำหนด:
- ในขณะที่คุณชี้ให้เห็นว่าตัวเองคนที่ไม่ได้คาดหวังที่จะใช้คำว่า 'ใหม่' เมื่อวัตถุที่สร้างขึ้นไม่จัดการใด ๆ ของรัฐ การออกแบบของคุณสะท้อนถึงความตั้งใจ ผู้ที่ใช้ชั้นเรียนของคุณอาจสับสนว่าเป็นสิ่งที่รัฐจัดการหรือไม่และการโทรไปยังวิธีการต่อไปอาจส่งผลให้เกิดพฤติกรรมที่แตกต่างกัน
- จากมุมมองของบุคคลที่ใช้คลาสสถานะภายในจะถูกซ่อนไว้เป็นอย่างดี แต่เมื่อต้องการแก้ไขในชั้นเรียนหรือเพียงเข้าใจมันคุณกำลังทำให้สิ่งต่าง ๆ ซับซ้อนขึ้น ฉันได้เขียนมากเกี่ยวกับปัญหาที่ฉันเห็นด้วยวิธีการแยกเพียงเพื่อให้เล็กลงโดยเฉพาะเมื่อย้ายรัฐในขอบเขตชั้นเรียน คุณกำลังปรับเปลี่ยนวิธีใช้ API ของคุณเพื่อให้มีฟังก์ชั่นขนาดเล็กลง! ว่าในความคิดของฉันจะพามันไปไกลเกินไป
ข้อมูลอ้างอิงบางส่วนที่เกี่ยวข้อง
อาจจะเป็นจุดหลักของการโต้แย้งอยู่ในวิธีที่ห่างไกลที่จะยืดSingle รับผิดชอบหลักการ "ถ้าคุณนำมันไปสู่สุดโต่งและสร้างคลาสที่มีเหตุผลเดียวที่มีอยู่คุณอาจจบลงด้วยวิธีเดียวต่อคลาสเท่านั้นซึ่งจะทำให้เกิดการแผ่ขยายขนาดใหญ่ของคลาสสำหรับแม้แต่กระบวนการที่ง่ายที่สุดทำให้ระบบเป็น ยากที่จะเข้าใจและยากที่จะเปลี่ยนแปลง "
การอ้างอิงที่เกี่ยวข้องอื่นที่เกี่ยวข้องกับหัวข้อนี้: "แบ่งโปรแกรมของคุณเป็นวิธีการที่ทำงานหนึ่งที่สามารถระบุตัวได้เก็บการดำเนินการทั้งหมดไว้ในวิธีการในระดับเดียวกันของนามธรรม " - Kent Beck Key นี่คือ "ระดับที่เป็นนามธรรมของสิ่งเดียวกัน" นั่นไม่ได้หมายความว่า "สิ่งหนึ่ง" เนื่องจากมักถูกตีความ ระดับของสิ่งที่เป็นนามธรรมนี้ขึ้นอยู่กับบริบทที่คุณออกแบบ
ดังนั้นวิธีการที่เหมาะสมคืออะไร?
โดยไม่ทราบว่ากรณีการใช้ที่เป็นรูปธรรมของคุณเป็นเรื่องยากที่จะบอก มีสถานการณ์ที่บางครั้งฉัน (ไม่บ่อย) ใช้วิธีการที่คล้ายกันคือ เมื่อฉันต้องการประมวลผลชุดข้อมูลโดยไม่ต้องการให้ฟังก์ชันนี้พร้อมใช้งานสำหรับขอบเขตคลาสทั้งหมด ฉันเขียนบทความในบล็อกเกี่ยวกับเรื่องนี้ว่า lambdas สามารถปรับปรุงการห่อหุ้มได้อย่างไร ผมก็เริ่มคำถามในหัวข้อที่นี่ในการเขียนโปรแกรม ต่อไปนี้เป็นตัวอย่างล่าสุดของที่ฉันใช้เทคนิคนี้
new TupleList<Key, int>
{
{ Key.NumPad1, 1 },
...
{ Key.NumPad3, 16 },
{ Key.NumPad4, 17 },
}
.ForEach( t =>
{
var trigger = new IC.Trigger.EventTrigger(
new KeyInputCondition( t.Item1, KeyInputCondition.KeyState.Down ) );
trigger.ConditionsMet += () => AddMarker( t.Item2 );
_inputController.AddTrigger( trigger );
} );
เนื่องจากรหัส 'ท้องถิ่น' มาก ๆ ภายในForEach
ไม่ได้ถูกนำไปใช้ที่อื่นฉันสามารถเก็บไว้ในตำแหน่งที่แน่นอนซึ่งมีความเกี่ยวข้อง การสรุปรหัสในลักษณะที่รหัสซึ่งอาศัยซึ่งกันและกันถูกจัดกลุ่มอย่างรุนแรงร่วมกันทำให้สามารถอ่านได้ในความคิดของฉัน
ทางเลือกที่เป็นไปได้
- ใน C # คุณสามารถใช้วิธีการขยายแทน ดังนั้นดำเนินการกับข้อโต้แย้งโดยตรงที่คุณผ่านวิธีการ 'สิ่งหนึ่ง' นี้
- ดูว่าฟังก์ชั่นนี้ไม่ได้อยู่ในคลาสอื่นจริงหรือไม่
- ทำให้มันเป็นฟังก์ชั่นแบบคงที่ในระดับคงที่ สิ่งนี้น่าจะเป็นแนวทางที่เหมาะสมที่สุดตามที่ปรากฏใน API ทั่วไปที่คุณอ้างถึง
bool arrayContainsSomestring = new List<string>(stringArray).Contains("somestring");
เมื่อทั้งหมดที่ฉันสนใจคือข้อมูลบางส่วนและวิธีการขยาย LINQ ไม่สามารถใช้ได้ ใช้งานได้ดีและอยู่ในif()
สภาพที่เหมาะสมโดยไม่จำเป็นต้องกระโดดผ่านห่วง แน่นอนคุณต้องการภาษาที่รวบรวมขยะหากคุณกำลังเขียนโค้ดเช่นนั้น