Giải quyết vấn đề về web nếu bạn có thể tạo một công cụ quy tắc trong đó mỗi quy tắc cụ thể được mã hóa độc lập. Một sàng lọc tiếp theo cho điều này sẽ là tạo một ngôn ngữ cụ thể miền (DSL) để tạo các quy tắc, tuy nhiên, một mình DSL chỉ thay thế vấn đề từ một cơ sở mã (chính) sang một cơ sở mã khác (DSL). Không có cấu trúc, DSL sẽ không tốt hơn ngôn ngữ bản địa (Java, C #, v.v.), vì vậy chúng tôi sẽ quay lại với nó sau khi chúng tôi tìm thấy một cách tiếp cận cấu trúc được cải thiện.
Vấn đề cơ bản là bạn đang gặp vấn đề về mô hình hóa. Bất cứ khi nào bạn gặp phải tình huống kết hợp như thế này, đó là một dấu hiệu rõ ràng cho thấy sự trừu tượng mô hình của bạn mô tả tình huống này quá thô. Bạn rất có thể kết hợp các yếu tố nên thuộc về các mô hình khác nhau trong một thực thể.
Nếu bạn tiếp tục phá vỡ mô hình của mình, cuối cùng bạn sẽ hoàn toàn hòa tan hiệu ứng kết hợp này. Tuy nhiên, khi đi theo con đường này, rất dễ bị lạc trong thiết kế của bạn tạo ra một mớ hỗn độn thậm chí còn lớn hơn, sự cầu toàn ở đây không nhất thiết là bạn của bạn.
Các máy trạng thái hữu hạn và các công cụ quy tắc chỉ là một ví dụ về cách giải quyết vấn đề này và dễ quản lý hơn. Ý tưởng chính ở đây là một cách tốt để loại bỏ một vấn đề kết hợp như thế này thường là tạo ra một thiết kế và lặp lại quảng cáo trong các mức độ trừu tượng lồng nhau cho đến khi hệ thống của bạn hoạt động tốt. Akin để làm thế nào fractals được sử dụng để tạo ra các mẫu phức tạp. Các quy tắc vẫn giữ nguyên cho dù bạn nhìn vào hệ thống của mình bằng kính hiển vi hay từ góc nhìn cao của chim.
Ví dụ về việc áp dụng điều này cho tên miền của bạn.
Bạn đang cố gắng mô hình hóa cách những con bò đang di chuyển qua một địa hình. Mặc dù câu hỏi của bạn thiếu chi tiết, tôi sẽ đoán rằng số lượng if lớn của bạn bao gồm cả phần quyết định, chẳng hạn như if cow.isStanding then cow.canRun = true
bạn bị sa lầy khi bạn thêm chi tiết về địa hình chẳng hạn. Vì vậy, đối với mọi hành động bạn muốn thực hiện, bạn phải kiểm tra mọi khía cạnh bạn có thể nghĩ ra và lặp lại các xác minh này cho hành động có thể tiếp theo.
Đầu tiên chúng ta cần thiết kế lặp lại, trong trường hợp này sẽ là một FSM để mô hình hóa các trạng thái thay đổi của mô phỏng. Vì vậy, điều đầu tiên tôi sẽ làm là triển khai một FSM tham chiếu, xác định giao diện trạng thái , giao diện chuyển đổi và có lẽ là bối cảnh chuyển đổicó thể chứa thông tin được chia sẻ để cung cấp cho hai người kia. Việc triển khai FSM cơ bản sẽ chuyển từ chuyển đổi này sang chuyển đổi khác bất kể bối cảnh, đây là nơi công cụ quy tắc xuất hiện. Công cụ quy tắc đóng gói sạch các điều kiện phải đáp ứng nếu quá trình chuyển đổi diễn ra. Một công cụ quy tắc ở đây có thể đơn giản như một danh sách các quy tắc mà mỗi hàm có một hàm đánh giá trả về một boolean. Để kiểm tra xem có nên thực hiện quá trình chuyển đổi hay không, lặp lại danh sách các quy tắc và nếu bất kỳ quy tắc nào đánh giá là sai, quá trình chuyển đổi sẽ không diễn ra. Bản thân quá trình chuyển đổi sẽ chứa mã hành vi để sửa đổi trạng thái hiện tại của FSM (và các tác vụ có thể khác).
Bây giờ, nếu tôi bắt đầu thực hiện mô phỏng dưới dạng một FSM lớn duy nhất ở cấp độ GOD, tôi kết thúc với RẤT NHIỀU trạng thái có thể xảy ra, chuyển đổi, v.v ... bây giờ là một quy tắc thực hiện kiểm tra đối với một thông tin cụ thể của bối cảnh (tại thời điểm này có khá nhiều thứ) và mỗi phần thân IF nằm ở đâu đó trong mã chuyển đổi.
Nhập phân tích fractals: bước đầu tiên sẽ là tạo một FSM cho mỗi con bò trong đó các trạng thái là trạng thái bên trong của con bò (đứng, chạy, đi bộ, chăn thả, v.v.) và chuyển đổi giữa chúng sẽ bị ảnh hưởng bởi môi trường. Có thể đồ thị chưa hoàn thành, ví dụ, chăn thả chỉ có thể truy cập được từ trạng thái đứng, bất kỳ chuyển đổi nào khác đều bị loại bỏ vì đơn giản là không có trong mô hình. Ở đây bạn có hiệu quả phân tách dữ liệu theo hai mô hình khác nhau, con bò và địa hình. Mỗi thuộc tính được đặt riêng. Sự cố này sẽ cho phép bạn đơn giản hóa thiết kế động cơ tổng thể của bạn. Bây giờ thay vì có một công cụ quy tắc duy nhất quyết định tất cả những gì bạn có nhiều công cụ quy tắc đơn giản hơn (một cho mỗi lần chuyển đổi) quyết định các chi tiết rất cụ thể.
Bởi vì tôi đang sử dụng lại cùng một mã cho FSM, về cơ bản đây là cấu hình của FSM. Nhớ khi chúng tôi đề cập đến DSL trước đó? Đây là nơi DSL có thể làm rất nhiều việc tốt nếu bạn có nhiều quy tắc và chuyển tiếp để viết.
Đi sâu hơn
Bây giờ THIÊN CHÚA không còn phải đối phó với tất cả sự phức tạp trong việc quản lý trạng thái bên trong của con bò, nhưng chúng ta có thể đẩy nó đi xa hơn. Ví dụ, vẫn còn rất nhiều phức tạp liên quan đến việc quản lý địa hình. Đây là nơi bạn quyết định nơi sự cố là đủ. Ví dụ, trong GOD của bạn, bạn kết thúc việc quản lý động lực địa hình (cỏ dài, bùn, bùn khô, cỏ ngắn, v.v.), chúng ta có thể lặp lại mô hình tương tự. Không có gì ngăn cản bạn nhúng logic như vậy vào địa hình bằng cách trích xuất tất cả các trạng thái địa hình (cỏ dài, cỏ ngắn, bùn, khô, v.v.) vào một FSM địa hình mới với sự chuyển đổi giữa các trạng thái và có lẽ là các quy tắc đơn giản. Ví dụ, để đến trạng thái bùn, công cụ quy tắc nên kiểm tra bối cảnh để tìm chất lỏng, nếu không thì không thể. Bây giờ GOD đã đơn giản hơn.
Bạn có thể hoàn thành hệ thống của FSM bằng cách làm cho chúng tự chủ và cung cấp cho chúng mỗi luồng. Bước cuối cùng này là không cần thiết nhưng nó cho phép bạn thay đổi linh hoạt hệ thống bằng cách điều chỉnh cách bạn ủy thác việc đưa ra quyết định của mình (khởi chạy một FSM chuyên biệt hoặc chỉ trả về trạng thái được xác định trước).
Hãy nhớ làm thế nào chúng ta đề cập rằng việc chuyển đổi cũng có thể thực hiện "các nhiệm vụ có thể khác"? Hãy khám phá điều đó bằng cách thêm khả năng cho các mô hình khác nhau (FSM) giao tiếp với nhau. Bạn có thể xác định một tập hợp các sự kiện và cho phép mỗi FSM đăng ký người nghe các sự kiện này. Do đó, nếu, ví dụ, một con bò đi vào địa hình hex, hex có thể đăng ký người nghe để thay đổi chuyển tiếp. Ở đây có một chút khó khăn vì mỗi FSM được triển khai ở mức rất cao mà không có bất kỳ kiến thức nào về tên miền cụ thể mà nó chứa. Tuy nhiên, bạn có thể đạt được điều này bằng cách cho bò xuất bản danh sách các sự kiện và tế bào có thể đăng ký nếu nó thấy các sự kiện mà nó có thể phản ứng. Một hệ thống phân cấp tốt của gia đình sự kiện ở đây là một sự đầu tư tốt.
Bạn có thể đẩy sâu hơn nữa bằng cách mô hình hóa mức độ dinh dưỡng và chu kỳ phát triển của cỏ, với ... bạn đoán nó ... một FSM cỏ được nhúng trong mô hình riêng của bản vá địa hình.
Nếu bạn đẩy ý tưởng đủ xa, THIÊN CHÚA có rất ít việc phải làm vì tất cả các khía cạnh đều được quản lý khá nhiều, giải phóng thời gian để dành cho những thứ tin kính hơn.
Tóm tắt
Như đã nêu ở trên, FSM ở đây không phải là giải pháp, chỉ là một phương tiện để minh họa rằng giải pháp cho vấn đề như vậy không được tìm thấy trong mã mỗi lần nói mà là cách bạn mô hình hóa vấn đề của mình. Có nhiều khả năng là các giải pháp khác khả thi và rất có thể tốt hơn nhiều so với đề xuất FSM của tôi. Tuy nhiên, phương pháp "fractals" vẫn là một cách tốt để quản lý khó khăn này. Nếu được thực hiện chính xác, bạn có thể tự động phân bổ các mức sâu hơn, nơi nó quan trọng trong khi đưa ra các mô hình đơn giản hơn, nơi nó ít quan trọng hơn. Bạn có thể xếp hàng thay đổi và áp dụng chúng khi tài nguyên trở nên khả dụng hơn. Trong một chuỗi hành động, việc tính toán chuyển chất dinh dưỡng từ bò sang cỏ có thể không quan trọng lắm. Tuy nhiên, bạn có thể ghi lại các chuyển đổi này và áp dụng các thay đổi sau đó hoặc chỉ gần đúng với phỏng đoán có giáo dục bằng cách thay thế các công cụ quy tắc hoặc có thể thay thế hoàn toàn việc triển khai FSM bằng một phiên bản ngây thơ đơn giản hơn cho các yếu tố không thuộc trường trực tiếp quan tâm (con bò ở đầu kia của lĩnh vực) để cho phép các tương tác chi tiết hơn để có được trọng tâm và chia sẻ tài nguyên lớn hơn. Tất cả điều này mà không bao giờ xem xét lại toàn bộ hệ thống; vì mỗi phần được cách ly tốt, việc tạo ra một thay thế thả vào giới hạn hoặc mở rộng độ sâu của mô hình của bạn trở nên dễ dàng hơn. Bằng cách sử dụng một thiết kế tiêu chuẩn, bạn có thể xây dựng dựa trên đó và tối đa hóa các khoản đầu tư được thực hiện vào các công cụ đặc biệt như DSL để xác định quy tắc hoặc từ vựng chuẩn cho các sự kiện, một lần nữa bắt đầu ở mức rất cao và thêm các sàng lọc khi cần. vì mỗi phần được cách ly tốt, việc tạo ra một thay thế thả vào giới hạn hoặc mở rộng độ sâu của mô hình của bạn trở nên dễ dàng hơn. Bằng cách sử dụng một thiết kế tiêu chuẩn, bạn có thể xây dựng dựa trên đó và tối đa hóa các khoản đầu tư được thực hiện vào các công cụ đặc biệt như DSL để xác định quy tắc hoặc từ vựng chuẩn cho các sự kiện, một lần nữa bắt đầu ở mức rất cao và thêm các sàng lọc khi cần. vì mỗi phần được cách ly tốt, việc tạo ra một thay thế thả vào giới hạn hoặc mở rộng độ sâu của mô hình của bạn trở nên dễ dàng hơn. Bằng cách sử dụng một thiết kế tiêu chuẩn, bạn có thể xây dựng dựa trên đó và tối đa hóa các khoản đầu tư được thực hiện vào các công cụ đặc biệt như DSL để xác định quy tắc hoặc từ vựng chuẩn cho các sự kiện, một lần nữa bắt đầu ở mức rất cao và thêm các sàng lọc khi cần.
Tôi sẽ cung cấp một ví dụ mã nhưng đây là tất cả những gì tôi có thể đủ khả năng để làm ngay bây giờ.