Thiết kế mẫu cho hệ thống quy tắc?


12

Là một dự án vui vẻ nhanh chóng, tôi đã thử viết một trò chơi solitaire. Nhưng khi viết lên các hệ thống quy tắc, tôi cảm thấy bẩn , bởi vì mã của tôi cảm thấy hoàn toàn không có cấu trúc và không thể giải thích được , chủ yếu là do logic trò chơi của tôi là mã spaghetti hoàn chỉnh.

Tôi đã gặp phải vấn đề này trước đây và luôn cảm thấy lúng túng khi viết phần này của chương trình của mình, vì vậy tôi tự hỏi, có bất kỳ thử nghiệm và thực hành tốt nhất nào khi xác định quy tắc trong trò chơi không?


1
Tối đa hóa đóng gói và tối thiểu hóa khớp nối
John McDonald

Câu trả lời:


2

Tôi không nghĩ rằng có một giải pháp độc đáo vì rất nhiều sự điều khiển đến từ vấn đề cụ thể.

Bạn có thể sử dụng mẫu Trình điều khiển Chế độ xem Mô hình: điều này chuyển (giới hạn) vấn đề của bạn sang "cách thực hiện một hành vi trên bộ điều khiển", một beahaviour luôn tuân theo các quy tắc.

Trừ khi chúng ta đang nói về các quy tắc rất đơn giản, cách bạn tổ chức chúng đặt ra một vấn đề về tính biểu cảm . Bạn luôn phải đối mặt với những yêu cầu mâu thuẫn là đơn giản (có cấu trúc) và có tính biểu cảm (viết quy tắc vui vẻ).

Sử dụng MVC đơn giản hóa công việc của bạn vì mô hình chính thức hóa một trạng thái tức là bối cảnh trong đó các quy tắc được thi hành.

Nói rằng, bạn có thể thấy hữu ích khi triển khai Bộ điều khiển bằng cách sử dụng mẫu Chiến lược và / hoặc mẫu Trạng thái để tạo một hành vi phức tạp theo các hành vi có thể chuyển đổi đơn giản hơn. Một mô hình chuỗi-of-resposibility có thể giúp bạn thể hiện quy tắc trong khi một máy nhà nước nên được sử dụng một cách cẩn thận vì nó "nhà nước" một phần trùng lặp ý nghĩa của mô hình "nhà nước".

Sử dụng mẫu Lệnh trong Bộ điều khiển có thể hữu ích để giảm cả độ phản hồi của Bộ điều khiển (Lệnh biết cách xử lý mô hình) và giúp dễ dàng thêm các chức năng hoàn tác / làm lại trong Bộ điều khiển.

Ở mức độ nào, bạn nên thử sử dụng các mẫu thiết kế làm hướng dẫn: chúng rất hữu ích để tránh phát minh lại bánh xe, đặc biệt là bánh xe vuông, nhưng không phải mọi giải pháp của vấn đề đều bao gồm một loạt các bánh xe (tròn) ghép lại với nhau.


2

Tôi không chắc chắn về việc tốt nhất hay thậm chí là tốt nhưng tôi thường sử dụng mẫu Observer . Nó làm việc đủ tốt cho tôi.


1
Bạn có thể làm một ví dụ?
Gustavo Maciel

bạn có thể tạo một người quan sát cho mỗi quy tắc, sau đó gắn chúng vào trạng thái trò chơi. sau mỗi lượt chơi, trạng thái trò chơi gọi tất cả các quan sát viên để kiểm tra xem có bất kỳ quy tắc nào được áp dụng không.
Ali1S232

0

Trừ khi bạn đã thực hiện công việc nhiều lần trước đây, bạn sẽ luôn kết thúc với mã spaghetti. Trên thực tế, tại thời điểm này, bạn chỉ mới bắt đầu: những gì bạn có là bản phác thảo sơ bộ của một thông số sơ bộ. Kiểm tra một số lời khuyên khác ở đây và làm một số viết lại nghiêm túc. Và sau đó viết thêm một vài lần nữa, và sau đó .... Cá nhân tôi không bao giờ chắc chắn liệu tôi có thể tạo được mã của mình thành hình dạng thực sự tuyệt vời hay chỉ bị bệnh khi viết lại nó, nhưng cuối cùng tôi dường như đã hiểu đúng.

Giải quyết vấn đề từ hai đầu. Cố gắng để có được thiết kế tổng thể để có ý nghĩa chọn các bộ phận nhỏ xử lý các công việc đơn giản và làm cho chúng đúng. Sau đó cố gắng làm việc theo cách của bạn từ cả hai đầu đến giữa. Và sau đó làm việc từ giữa trở lại về cả hai đầu. Rồi từ trên xuống, rồi từ dưới lên. Sau đó lặp lại toàn bộ quá trình.

Về cơ bản, những gì bạn có là một bộ sưu tập các lớp. Xem xét lớp A. Nếu lớp A được xây dựng tốt, thì các lớp sử dụng nó sẽ tự động hoạt động tốt hơn, dù chúng tốt hay xấu. Nếu sử dụng lớp Một lớp học tốt, những lớp học đã qua sử dụng sẽ làm được nhiều hơn, tuy nhiên tốt hay xấu họ đang có. Vì vậy, tổ chức các lớp học của bạn tốt nhất có thể, sau đó đảm bảo mỗi lớp là lớp tốt nhất có thể.

Điều quan trọng là phải làm cho nó đúng như bạn có thể. Mã xấu sẽ ám ảnh bạn cho đến ngày bạn vứt nó đi. Với phần mềm, một chút đánh bóng thêm luôn được đền đáp. (Trừ khi không có ai kết thúc bằng cách sử dụng mã ....)

Tóm lại: kiểm tra lời khuyên thực tế được đưa ra trong các câu trả lời khác, sau đó viết lại mã của bạn cho đến khi bạn nhận được thứ bạn thích.


Vì vậy, câu trả lời của bạn về cơ bản là "đọc các câu trả lời khác và làm mã sạch hoặc bạn sẽ hối hận" ...
kaoD

@kaoD: Vâng. Nhưng cũng: nỗ lực mã hóa đầu tiên của bạn có thể sẽ là rác. (Nếu không, bạn không thúc ép bản thân đủ mạnh.) Sẽ mất rất nhiều công sức để kéo nó lại gần nhau, cùng với một chút nghiên cứu và suy nghĩ nhiều. Điều này là bình thường khi viết một chương trình liên quan. Tất cả nỗ lực được sử dụng theo cách này sẽ tiết kiệm thời gian, công sức và đau buồn trong thời gian dài (nếu chương trình vẫn còn đó trong thời gian dài). Và cũng: OOP giúp thời gian lớn nếu bạn có thể nắm bắt được nó. (Tốt nhất tôi có thể làm mà không cần xem mã.)
RalphChapin

4
Bạn có nhận ra rằng bạn thực sự KHÔNG trả lời câu hỏi?
kaoD

Trên thực tế, bất kể bài viết của Ralph về mặt kỹ thuật có phải là câu trả lời hay không, tôi nghĩ rằng câu trả lời của Ralph đã nói lên động cơ của OP khi đặt câu hỏi ngay từ đầu. Tôi tin rằng nó có nhiều giá trị đối với một lập trình viên đã không nhận ra rằng rất hiếm khi bạn thiết kế mã của mình tốt nhất trong lần thử đầu tiên. Ngoài ra, anh ta đưa ra một cách tiếp cận để đối phó với nó dường như được sinh ra từ kinh nghiệm của Ralph.
Steve H

@SteveH Tôi nghĩ rằng câu trả lời của anh ấy có thể áp dụng cho hầu hết mọi quy trình kỹ thuật phần mềm. Bạn có thể sao chép và dán nó ở bất cứ đâu và nó sẽ phù hợp.
kaoD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.