Đối với tôi đó là một vấn đề khớp nối và liên quan đến độ chi tiết của thiết kế. Ngay cả hình thức khớp nối lỏng lẻo nhất cũng giới thiệu sự phụ thuộc từ thứ này sang thứ khác. Nếu điều đó được thực hiện cho hàng trăm đến hàng ngàn đối tượng, ngay cả khi chúng tương đối đơn giản, tuân thủ SRP và ngay cả khi tất cả các phụ thuộc chảy vào trừu tượng ổn định, điều đó tạo ra một cơ sở mã hóa rất khó để suy luận về một tổng thể có liên quan.
Có những điều thiết thực giúp bạn đánh giá mức độ phức tạp của một cơ sở mã, không được thảo luận thường xuyên trong SE lý thuyết, như mức độ sâu của ngăn xếp cuộc gọi bạn có thể nhận được trước khi bạn kết thúc và bạn cần đi sâu đến đâu trước khi bạn có thể, với rất tự tin, hiểu tất cả các tác dụng phụ có thể xảy ra ở cấp độ đó của ngăn xếp cuộc gọi, kể cả trong trường hợp ngoại lệ.
Và tôi đã tìm thấy, theo kinh nghiệm của tôi, các hệ thống phẳng hơn với các ngăn xếp cuộc gọi nông hơn có xu hướng dễ dàng hơn nhiều để lý do. Một ví dụ cực đoan sẽ là một hệ thống thành phần thực thể trong đó các thành phần chỉ là dữ liệu thô. Chỉ có các hệ thống mới có chức năng, và trong quá trình triển khai và sử dụng ECS, tôi đã thấy nó là hệ thống dễ nhất từ trước đến nay, để lý giải về việc khi nào các cơ sở mã phức tạp trải qua hàng trăm ngàn dòng mã về cơ bản đun sôi vài chục hệ thống chứa tất cả các chức năng.
Quá nhiều thứ cung cấp chức năng
Giải pháp thay thế trước đây khi tôi làm việc trong các cơ sở mã trước đó là một hệ thống có hàng trăm đến hàng ngàn vật thể nhỏ bé, trái ngược với vài chục hệ thống cồng kềnh với một số đối tượng được sử dụng chỉ để truyền thông điệp từ đối tượng này sang đối tượng khác ( Message
ví dụ, có giao diện công cộng riêng). Về cơ bản, đó là những gì bạn nhận được tương tự khi bạn hoàn nguyên ECS trở lại điểm mà các thành phần có chức năng và mỗi tổ hợp thành phần duy nhất trong một thực thể mang lại loại đối tượng riêng. Và điều đó sẽ có xu hướng mang lại các chức năng nhỏ hơn, đơn giản hơn được kế thừa và cung cấp bởi sự kết hợp vô tận của các đối tượng mô hình hóa các ý tưởng tuổi teen ( Particle
đối tượng vs.Physics System
, ví dụ). Tuy nhiên, nó cũng có xu hướng tạo ra một biểu đồ phức tạp của các phụ thuộc lẫn nhau gây khó khăn cho việc suy luận về những gì xảy ra từ cấp độ rộng, đơn giản là vì có rất nhiều điều trong codebase thực sự có thể làm điều gì đó và do đó có thể làm điều gì đó sai - - các loại không phải là loại "dữ liệu", mà là loại "đối tượng" có chức năng liên quan. Các loại phục vụ dưới dạng dữ liệu thuần túy không có chức năng liên quan có thể có thể bị lỗi do chúng không thể tự làm bất cứ điều gì.
Các giao diện thuần túy không giúp ích gì cho vấn đề dễ hiểu này bởi vì ngay cả khi điều đó làm cho "phụ thuộc thời gian biên dịch" ít phức tạp hơn và cung cấp nhiều phòng thở hơn để thay đổi và mở rộng, thì nó cũng không làm cho "phụ thuộc thời gian chạy" và tương tác trở nên ít phức tạp hơn. Đối tượng khách hàng vẫn kết thúc việc gọi các chức năng trên một đối tượng tài khoản cụ thể ngay cả khi chúng được gọi thông qua IAccount
. Đa hình và giao diện trừu tượng có công dụng của chúng nhưng chúng không tách rời mọi thứ theo cách thực sự giúp bạn suy luận về tất cả các tác dụng phụ có thể xảy ra tại bất kỳ điểm nào. Để đạt được kiểu tách rời hiệu quả này, bạn cần một cơ sở mã có ít thứ hơn có chứa chức năng.
Nhiều dữ liệu hơn, ít chức năng hơn
Vì vậy, tôi đã tìm thấy phương pháp ECS, ngay cả khi bạn không áp dụng hoàn toàn, cực kỳ hữu ích, vì nó biến hàng trăm đối tượng thành dữ liệu thô với hệ thống cồng kềnh, được thiết kế thô hơn, cung cấp tất cả chức năng. Nó tối đa hóa số loại "dữ liệu" và giảm thiểu số lượng loại "đối tượng", và do đó giảm thiểu tối đa số lượng địa điểm trong hệ thống của bạn thực sự có thể bị lỗi. Kết quả cuối cùng là một hệ thống rất "phẳng", không có biểu đồ phụ thuộc phức tạp, chỉ là hệ thống cho các thành phần, không bao giờ ngược lại và không bao giờ thành phần với các thành phần khác. Về cơ bản, đó là dữ liệu thô nhiều hơn và ít trừu tượng hơn, có tác dụng tập trung và làm phẳng chức năng của cơ sở mã cho các khu vực chính, trừu tượng hóa chính.
30 điều đơn giản hơn không nhất thiết đơn giản hơn để lý giải về hơn 1 điều phức tạp hơn, nếu 30 điều đơn giản đó có liên quan đến nhau trong khi điều phức tạp lại tự đứng vững. Vì vậy, đề nghị của tôi thực sự là chuyển sự phức tạp ra khỏi sự tương tác giữa các vật thể và nhiều hơn đối với các vật thể cồng kềnh không phải tương tác với bất kỳ thứ gì khác để đạt được sự tách rời hàng loạt, sang toàn bộ "hệ thống" (không phải là nguyên khối và vật thể thần, làm phiền bạn, và không phải các lớp với 200 phương thức, nhưng một mức độ cao hơn đáng kể so với một Message
hoặc Particle
mặc dù có giao diện tối giản). Và ủng hộ các loại dữ liệu cũ đơn giản hơn. Bạn càng phụ thuộc vào những thứ đó, bạn sẽ nhận được càng ít khớp nối. Ngay cả khi điều đó mâu thuẫn với một số ý tưởng SE, tôi đã thấy nó thực sự giúp ích rất nhiều.