รูปแบบการออกแบบสำหรับระบบกฎ?


12

เป็นโครงการที่สนุกอย่างรวดเร็วฉันพยายามเขียนเกมเล่นไพ่คนเดียว แต่เมื่อฉันเขียนระบบกฎฉันรู้สึกสกปรกเพราะรหัสของฉันรู้สึกว่าไม่มีโครงสร้างและไม่สามารถแยกออกได้ส่วนใหญ่เป็นเพราะตรรกะเกมของฉันเป็นรหัสสปาเก็ตตี้ที่สมบูรณ์

ฉันเคยเจอปัญหานี้มาก่อนและรู้สึกประหม่าเมื่อเขียนส่วนนี้ของโปรแกรมของฉันดังนั้นฉันจึงสงสัยว่ามีการทดลองและทดสอบแนวทางปฏิบัติที่ดีที่สุดเมื่อมีการกำหนดกฎในเกมหรือไม่?


คำตอบ:


2

ฉันไม่คิดว่าจะมีวิธีแก้ปัญหาเฉพาะเพราะ cosiderations จำนวนมากมาจากปัญหาเฉพาะ

คุณสามารถใช้รูปแบบตัวควบคุมมุมมองโมเดล: การเคลื่อนไหวนี้ (จำกัด ) ปัญหาของคุณเพื่อ "วิธีการใช้พฤติกรรมบนคอนโทรลเลอร์" ซึ่งเป็นพฤติกรรมที่ต้องปฏิบัติตามกฎเสมอ

หากเรามีการพูดคุยเกี่ยวกับกฎระเบียบที่ง่ายมากในแบบที่คุณจัดระเบียบให้ poses ปัญหาของการแสดงออก คุณต้องเผชิญกับความต้องการที่ขัดแย้งกันของการเป็นคนเรียบง่าย (มีโครงสร้าง) และแสดงออก (เขียนกฎความสนุก)

การใช้ MVC ทำให้งานของคุณง่ายขึ้นเพราะโมเดลทำสถานะเป็นทางการเช่นบริบทที่มีการบังคับใช้กฎ

กล่าวว่าคุณอาจพบว่ามีประโยชน์ในการใช้คอนโทรลเลอร์โดยใช้ รูปแบบกลยุทธ์และ / หรือรูปแบบของรัฐเพื่อประกอบพฤติกรรมที่ซับซ้อนในแง่ของพฤติกรรมที่สลับได้ง่ายขึ้น รูปแบบChain-of-resposibilityสามารถช่วยให้คุณแสดงกฎในขณะที่ควรใช้เครื่องรัฐอย่างระมัดระวังเพราะ "สถานะ" ของมันซ้อนทับบางส่วนความหมายของ "สถานะ" ของโมเดล

ใช้ รูปแบบคำสั่งภายในตัวควบคุมอาจมีประโยชน์เพื่อลดการตอบสนองของคอนโทรลเลอร์ (คำสั่งรู้วิธีจัดการกับโมเดล) และทำให้ง่ายต่อการเพิ่มฟังก์ชั่นการเลิกทำ / ทำซ้ำในคอนโทรลเลอร์

คุณควรลองใช้รูปแบบการออกแบบเป็นแนวทาง: มันมีประโยชน์ที่จะหลีกเลี่ยงการสร้างล้อใหม่โดยเฉพาะล้อสี่เหลี่ยม แต่ไม่ใช่ทุกวิธีการแก้ปัญหาที่ประกอบด้วยล้อ (กลม) ที่ประกอบเข้าด้วยกัน


2

ผมไม่แน่ใจว่าเกี่ยวกับการที่ดีที่สุดหรือแม้กระทั่งที่ดี แต่ผมมักจะใช้รูปแบบการสังเกตการณ์ มันทำงานได้ดีพอสำหรับฉัน


1
คุณสามารถทำตัวอย่างได้หรือไม่?
Gustavo Maciel

คุณสามารถสร้างผู้สังเกตการณ์สำหรับแต่ละกฎจากนั้นแนบไปกับสถานะเกม หลังจากแต่ละเกมเทิร์นจะเรียกผู้สังเกตการณ์ทั้งหมดเพื่อตรวจสอบว่ามีการใช้กฎเหล่านี้หรือไม่
Ali1S232

0

หากคุณไม่เคยทำงานหลายครั้งมาก่อนคุณจะจบลงด้วยรหัสสปาเก็ตตี้ จริงๆแล้ว ณ จุดนี้คุณเพิ่งเริ่มต้น: สิ่งที่คุณมีคือร่างคร่าวๆของข้อมูลจำเพาะเบื้องต้น ลองดูคำแนะนำอื่น ๆ ที่นี่และทำการเขียนใหม่อย่างจริงจัง แล้วก็เขียนใหม่อีกแล้วแล้ว .... โดยส่วนตัวฉันไม่แน่ใจว่าฉันจะทำให้โค้ดของฉันมีรูปร่างที่ยอดเยี่ยมจริง ๆ หรือแค่เบื่อการเขียนใหม่ แต่ฉันดูเหมือนจะทำให้ถูกต้องในที่สุด

แก้ไขปัญหาจากปลายทั้งสอง พยายามทำให้การออกแบบโดยรวมดูสมเหตุสมผลและเลือกชิ้นส่วนขนาดเล็กที่จัดการงานง่าย ๆ และทำให้ถูกต้อง จากนั้นลองใช้วิธีของคุณจากปลายทั้งสองไปสู่กึ่งกลาง แล้วทำงานจากตรงกลางกลับไปทางปลายทั้งสอง จากนั้นลงจากบนลงล่างจากบนลงล่าง จากนั้นทำซ้ำกระบวนการทั้งหมด

โดยพื้นฐานแล้วสิ่งที่คุณมีคือชุดของคลาส พิจารณาคลาส A หากคลาส A ถูกสร้างอย่างดีคลาสที่ใช้คลาสนั้นจะทำงานได้ดีขึ้นโดยอัตโนมัติ แต่จะดีหรือไม่ดี ถ้าเรียนชั้นใช้กันในชั้นเรียนที่ใช้เหล่านั้นจะทำอย่างไรดีหรือไม่ดีที่พวกเขามี ดังนั้นจัดชั้นเรียนของคุณให้ดีที่สุดเท่าที่จะทำได้จากนั้นตรวจสอบให้แน่ใจว่าแต่ละชั้นเรียนนั้นเป็นชั้นที่ดีที่สุดเท่าที่จะเป็นไปได้

มันเป็นสิ่งสำคัญที่จะทำให้มันถูกต้องเท่าที่จะทำได้ รหัสที่ไม่ถูกต้องจะหลอกหลอนคุณจนถึงวันที่คุณทิ้งมันไป ด้วยซอฟแวร์การขัดเล็กน้อยเป็นพิเศษจะจ่ายเสมอ (เว้นแต่จะไม่มีใครลงเอยด้วยการใช้รหัส .... )

ในการสรุป: ตรวจสอบคำแนะนำจริงที่ให้ไว้ในคำตอบอื่น ๆ จากนั้นเขียนรหัสของคุณใหม่จนกว่าคุณจะได้สิ่งที่ต้องการ


โดยทั่วไปแล้วคำตอบของคุณคือ "อ่านคำตอบอื่น ๆ แล้วทำโค้ดให้สะอาดหรือคุณจะเสียใจ" ...
kaoD

@kaoD: ใช่ แต่ยัง: ความพยายามในการเขียนโปรแกรมครั้งแรกของคุณอาจจะเป็นขยะ (ถ้าไม่ใช่คุณไม่ได้พยายามอย่างหนักพอ) มันต้องใช้ความพยายามอย่างมากในการดึงมันเข้าด้วยกันพร้อมกับการค้นคว้าและความคิดมากมาย นี่เป็นเรื่องปกติเมื่อเขียนโปรแกรมที่เกี่ยวข้อง ความพยายามทั้งหมดที่ใช้ในลักษณะนี้จะประหยัดเวลาความพยายามและความเศร้าโศกในระยะยาว (หากโปรแกรมยังคงอยู่ในระยะยาว) และยัง: OOP ช่วยครั้งใหญ่ถ้าคุณสามารถได้รับมัน (ดีที่สุดที่ฉันสามารถทำได้โดยไม่เห็นรหัส)
RalphChapin

4
คุณรู้หรือไม่ว่าคุณไม่ตอบคำถาม
kaoD

จริงๆแล้วไม่ว่าโพสต์ของ Ralph จะเป็นคำตอบหรือไม่ฉันคิดว่าคำตอบของ Ralph นั้นพูดถึงแรงจูงใจของ OP ในการถามคำถามในตอนแรก ฉันเชื่อว่ามันมีค่ามากสำหรับ coder ที่ไม่ได้ตระหนักว่ามันยากที่คุณจะออกแบบรหัสของคุณให้ดีที่สุดในการลองครั้งแรก นอกจากนี้เขายังเสนอวิธีการจัดการกับสิ่งที่ดูเหมือนจะเกิดจากประสบการณ์ของราล์ฟ
Steve H

@ Steve ฉันคิดว่าคำตอบของเขาใช้ได้กับกระบวนการวิศวกรรมซอฟต์แวร์เกือบทุกประเภท คุณสามารถคัดลอกและวางได้ทุกที่และมันจะพอดี
kaoD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.