Tôi thừa nhận, tôi đã phạm tội lạm dụng, và thậm chí lạm dụng quyền thừa kế. Dự án trò chơi (văn bản) đầu tiên mà tôi đã thực hiện khi tham gia khóa học OOP của mình đã đi xa như "Cửa bị khóa" và "Cửa không khóa" từ "Cửa" và "Phòng có một cửa", "Phòng có hai cửa" và cứ thế từ "Phòng".
Với trò chơi (đồ họa) mà tôi đã làm việc gần đây, tôi nghĩ rằng tôi đã học được bài học của mình và đặt giới hạn cho việc sử dụng tính kế thừa. Tuy nhiên tôi nhận thấy những vấn đề sớm bắt đầu xuất hiện. Lớp gốc của tôi bắt đầu nở rộ ngày càng nhiều, và các lớp lá của tôi chứa đầy các mã trùng lặp.
Tôi nghĩ rằng tôi vẫn đang làm sai, và sau khi tìm kiếm nó trực tuyến, tôi phát hiện ra rằng tôi không phải là người duy nhất gặp vấn đề này. Đó là cách tôi kết thúc việc khám phá các hệ thống Thực thể sau một số nghiên cứu kỹ lưỡng (đọc: googlefu)
Khi tôi bắt đầu đọc nó, tôi có thể thấy rõ ràng nó có thể giải quyết các vấn đề tôi gặp phải như thế nào với hệ thống phân cấp OOP truyền thống với các thành phần. Đây là trong các bài đọc đầu tiên tuy nhiên. Khi tôi tình cờ tìm thấy nhiều cách tiếp cận cực đoan khác của ES ES, chẳng hạn như phương pháp tại T-machine .
Tôi bắt đầu không đồng ý với các phương pháp họ đang sử dụng. Một hệ thống thành phần thuần túy dường như quá mức cần thiết, hoặc đúng hơn là không trực quan, có lẽ là thế mạnh của OOP. Tác giả đã đi xa đến mức nói rằng hệ thống ES trái ngược với OOP và trong khi nó có thể sử dụng được dọc theo OOP, thì nó thực sự không nên. Tôi không nói là sai, nhưng tôi không cảm thấy đó là một giải pháp tôi muốn thực hiện.
Vì vậy, với tôi, và để giải quyết các vấn đề tôi gặp phải ở đầu bài, mà không đi ngược lại với trực giác của tôi, vẫn là sử dụng một hệ thống phân cấp, tuy nhiên nó sẽ không phải là một hệ thống phân cấp nguyên khối như những gì tôi đã sử dụng trước đây, mà là một từ đa hình (tôi không thể tìm thấy một từ đối diện với nguyên khối), bao gồm một số cây nhỏ hơn.
Ví dụ sau đây cho thấy điều tôi muốn nói (điều này được lấy cảm hứng từ một ví dụ tôi tìm thấy trong Game Engine Architecture, Chương 14).
Tôi sẽ có một cây nhỏ cho xe cộ. Lớp xe gốc sẽ có thành phần kết xuất, thành phần va chạm, thành phần vị trí, v.v.
Sau đó, một chiếc xe tăng, một lớp con của phương tiện sẽ kế thừa những thành phần đó từ nó và được cung cấp thành phần "pháo" của riêng nó.
Các nhân vật cũng vậy. Một nhân vật sẽ có các thành phần riêng, sau đó Lớp Người chơi sẽ kế thừa nó và được cấp một Bộ điều khiển đầu vào, trong khi các lớp kẻ thù khác sẽ thừa hưởng từ lớp Nhân vật và được cấp một bộ điều khiển AI.
Tôi không thực sự thấy bất kỳ vấn đề với thiết kế này. Mặc dù không sử dụng Hệ thống điều khiển thực thể thuần túy, nhưng vấn đề với hiệu ứng sủi bọt và lớp gốc lớn được giải quyết bằng cách sử dụng hệ thống phân cấp nhiều cây, và vấn đề về các lá trùng lặp mã nặng nề đã biến mất vì các lá không có bất kỳ mã nào để bắt đầu, chỉ cần các thành phần. Nếu một thay đổi cần được thực hiện ở cấp độ lá, thì đơn giản như thay đổi một thành phần duy nhất, thay vì sao chép dán mã ở mọi nơi.
Tất nhiên, là người thiếu kinh nghiệm như tôi, tôi không thấy có vấn đề gì khi lần đầu tiên tôi bắt đầu sử dụng mô hình nặng phân cấp, kế thừa duy nhất, vì vậy nếu có vấn đề với mô hình mà tôi hiện đang nghĩ đến việc thực hiện, tôi sẽ không có thể nhìn thấy nó
Ý kiến của bạn?
PS: Tôi đang sử dụng Java, vì vậy sử dụng nhiều kế thừa để thực hiện điều này thay vì sử dụng các thành phần thông thường là không thể.
PPS: Truyền thông liên thành phần sẽ được thực hiện bằng cách liên kết các thành phần phụ thuộc với nhau. Điều này sẽ dẫn đến khớp nối, nhưng tôi nghĩ đó là một sự đánh đổi ok.