การมอบหมายในวิชาวิศวกรรมซอฟต์แวร์ของฉันคือการออกแบบแอพพลิเคชั่นที่สามารถเล่นเกมในรูปแบบที่แตกต่างกันได้ เกมดังกล่าวคือ Mancala เกมเหล่านี้บางเกมเรียกว่า Wari หรือ Kalah เกมเหล่านี้แตกต่างกันไปในบางแง่มุม แต่สำหรับคำถามของฉันเป็นสิ่งสำคัญที่ต้องรู้ว่าเกมดังกล่าวอาจแตกต่างกันดังต่อไปนี้:
- วิธีการจัดการผลลัพธ์ของการย้าย
- วิธีการกำหนดจุดสิ้นสุดของเกม
- วิธีการตัดสินผู้ชนะ
สิ่งแรกที่ฉันนึกถึงในการออกแบบสิ่งนี้คือการใช้รูปแบบกลยุทธ์ฉันมีการเปลี่ยนแปลงในอัลกอริทึม (กฎที่แท้จริงของเกม) การออกแบบอาจมีลักษณะเช่นนี้:

จากนั้นฉันก็คิดกับตัวเองว่าในเกมของ Mancala และ Wari วิธีที่ผู้ชนะได้รับการตัดสินนั้นเหมือนกันและรหัสจะซ้ำกัน ฉันไม่คิดว่านี่เป็นคำจำกัดความที่ละเมิดหลักการ 'หนึ่งกฎที่เดียว' หรือหลักการของ DRY ที่เห็นว่าเป็นการเปลี่ยนแปลงในกฎสำหรับ Mancala ไม่ได้หมายความว่าจะต้องเปลี่ยนกฎใน Wari โดยอัตโนมัติเช่นกัน อย่างไรก็ตามจากข้อเสนอแนะที่ฉันได้รับจากอาจารย์ของฉันฉันได้รับความประทับใจในการค้นหาการออกแบบที่แตกต่าง
ฉันมากับสิ่งนี้:

แต่ละเกม (Mancala, Wari, Kalah, ... ) จะมีคุณลักษณะของประเภทของส่วนต่อประสานของกฏแต่ละตัวเช่นWinnerDeterminerหากมีรุ่น Mancala 2.0 ซึ่งเหมือนกับ Mancala 1.0 ยกเว้นว่าผู้ชนะจะตัดสินได้อย่างไร ใช้รุ่น Mancala
ฉันคิดว่าการใช้กฎเหล่านี้เป็นรูปแบบกลยุทธ์นั้นใช้ได้อย่างแน่นอน แต่ปัญหาที่แท้จริงเกิดขึ้นเมื่อฉันต้องการออกแบบเพิ่มเติม
ในการอ่านเกี่ยวกับรูปแบบวิธีการของแม่แบบฉันคิดได้ทันทีว่าสามารถนำไปใช้กับปัญหานี้ได้ การกระทำที่ทำเมื่อผู้ใช้ทำการย้ายจะเหมือนกันเสมอและในลำดับเดียวกันคือ:
- ฝากก้อนหินในหลุม (สิ่งนี้จะเหมือนกันสำหรับเกมทุกเกมดังนั้นจะดำเนินการในรูปแบบเทมเพลต)
- กำหนดผลลัพธ์ของการย้าย
- ตรวจสอบว่าเกมได้เสร็จสิ้นเนื่องจากการย้ายก่อนหน้านี้
- ถ้าเกมจบลงให้ตัดสินว่าใครชนะ
สามขั้นตอนสุดท้ายนั้นอยู่ในรูปแบบกลยุทธ์ของฉันที่อธิบายไว้ข้างต้น ฉันมีปัญหามากในการรวมสองสิ่งนี้เข้าด้วยกัน ทางออกหนึ่งที่เป็นไปได้ที่ฉันพบคือการละทิ้งรูปแบบกลยุทธ์และทำสิ่งต่อไปนี้:

ฉันไม่เห็นความแตกต่างในการออกแบบระหว่างรูปแบบกลยุทธ์และสิ่งนี้ แต่ฉันแน่ใจว่าฉันจำเป็นต้องใช้วิธีการของแม่แบบ (แม้ว่าฉันจะแน่ใจว่าต้องใช้รูปแบบกลยุทธ์)
ฉันยังไม่สามารถระบุได้ว่าใครจะรับผิดชอบในการสร้างTurnTemplateวัตถุในขณะที่ด้วยรูปแบบกลยุทธ์ฉันรู้สึกว่าฉันมีครอบครัวของวัตถุ (กฎสามข้อ) ซึ่งฉันสามารถสร้างได้ง่ายโดยใช้รูปแบบโรงงานนามธรรม จากนั้นฉันจะมี a MancalaRuleFactory, WariRuleFactoryฯลฯ และพวกเขาจะสร้างอินสแตนซ์ที่ถูกต้องของกฎและส่งกลับRuleSetวัตถุ
สมมติว่าฉันใช้กลยุทธ์ + รูปแบบนามธรรมจากโรงงานและฉันมีRuleSetวัตถุที่มีอัลกอริทึมสำหรับกฎสามข้อในนั้น วิธีเดียวที่ผมรู้สึกว่าผมยังสามารถใช้รูปแบบวิธีการแม่แบบนี้คือการส่งผ่านวัตถุของฉันRuleSet TurnTemplate'ปัญหา' ที่พื้นผิวนั้นคือฉันจะไม่ต้องการการใช้งานที่เป็นรูปธรรมของTurnTemplateชั้นเรียนเหล่านี้จะล้าสมัย ในวิธีการป้องกันของฉันในฉันเพิ่งจะเรียกTurnTemplate ruleSet.determineWinner()ผลที่ตามมาTurnTemplateชั้นเรียนจะไม่เป็นนามธรรมอีกต่อไป แต่จะต้องกลายเป็นรูปธรรมแล้วมันยังคงเป็นรูปแบบวิธีการของแม่แบบหรือไม่?
เพื่อสรุปฉันคิดในทางที่ถูกหรือว่าฉันขาดอะไรง่าย ๆ ? หากฉันอยู่ในเส้นทางที่ถูกต้องฉันจะรวมรูปแบบกลยุทธ์และรูปแบบวิธีการของแม่แบบได้อย่างไร