Czy wielokrotne dziedziczenie nie rozwiązuje wszystkich problemów występujących w systemach encji?


10

Pytanie jest dość samo wyjaśniające: czy wielokrotne dziedziczenie nie rozwiązuje wszystkich problemów, które rozwiązują również systemy encji?

Właśnie przypomniałem sobie termin zwany „wielokrotnym dziedziczeniem”, który wydaje się rozwiązywać wiele wzdęć, które narzuciło klasyczne dziedzictwo.


1
Wielokrotne dziedziczenie jest podobne do systemów encji, ale nie jest takie samo. Na przykład wiele elementów dziedziczenia nie może mieć składników dodawanych i usuwanych w czasie wykonywania. Nie wszystkie języki obsługują również wielokrotne dziedziczenie. Można również uznać kompozycję za należącą do tej samej kategorii vs byt / komponenty.
MichaelHouse

2
Jeśli twoje klasy są już tak schludne, że możesz bezproblemowo dziedziczyć je razem w dowolny sposób, równie dobrze mogą już być komponentami. Komponenty umożliwiają także kompozycję / agregację w czasie wykonywania

Cóż, jest bardziej złożony i mniej podatny na błędy, więc dlaczego wolisz?
API-Beast

2
MI tak naprawdę nie rozwiązuje problemów „wzdęcia”, ponieważ dziedziczenie nadmiaru interfejsu z klasy lub klas nadrzędnych jest raczej objawem złego użycia mechanizmu dziedziczenia, a nie pojedynczego lub wielokrotnego dziedziczenia. Ten sam „wzdęcie” można również osiągnąć w podejściu do problemu zorientowanym na kompozycję.

@MrBeast, czy masz na myśli bardziej złożony / bardziej podatny na błędy, mniej złożony / podatny na błędy, czy „dlaczego nie wolisz?”
3Dave

Odpowiedzi:


10

Nie, wielokrotne dziedziczenie nie rozwiązuje wszystkich tych samych problemów, które robią systemy encji: systemy encji i wielokrotne dziedziczenie to dwie bardzo różne rzeczy. Możesz zbudować system encji z wielokrotnym lub bez wielokrotnego dziedziczenia i podobnie możesz korzystać z wielokrotnego dziedziczenia bez budowania systemu encji.

Tradycyjnie systemy jednostek skupione na komponentach są opracowywane z powodu chęci odejścia od ciężkiego dziedziczenia w dowolnej formie, zamiast tego dążenia do kompozycji . Istnieje wystarczająca literatura i dyskusja w innym miejscu na temat tego powiedzenia, na przykład na temat samych programistów SE lub SO , a większe pytanie, dlaczego preferować kompozycję, jest trochę nie na temat tworzenia gier. Krótko mówiąc, jest to podejście, które zwykle poprawia zmienność i łatwość konserwacji.


2

Odpowiedź Josha jest niesamowita, ale chciałbym dodać:

Jedną z najfajniejszych funkcji Entity / Component jest oparty na danych sposób, w jaki każda „rzecz” w grze jest tworzona i zarządzana. Z tego, co widziałem, po utworzeniu ładnej biblioteki typów komponentów i systemów możesz budować praktycznie wszystko przy minimalnych modyfikacjach kodu. (Uwaga: minimalna! = 0 )

Definiując grę pod kątem zachowania i dając sobie możliwość modyfikowania tych zachowań w locie - w czasie wykonywania, podczas inicjalizacji poprzez ładowanie ich ze skryptu lub bazy danych itp. - otwieracie cały świat nowych możliwości. Chcesz się dowiedzieć, dlaczego twoje cienie nie lądują tam, gdzie można się spodziewać? Dodaj element kamery / POV do swojego światła.

Podmiot / komponent pozwala budować, co tylko chcesz, o ile utworzyłeś bloki.

Ponadto wielokrotne dziedziczenie powoduje ten sam problem, co pojedyncze dziedziczenie. Po dodaniu atrybutu lub zachowania w hierarchii następuje jego propagacja. Tak długo, jak tworzysz głębokie hierarchie, napotykasz niepotrzebne ciężary, powielasz kod lub rozwiązujesz konflikty. Większości tego można uniknąć, wyobrażając sobie grę jako dane.

Właśnie zacząłem grać z tym w ciągu ostatnich kilku tygodni, ale jestem pod wrażeniem, jak proste stały się rzeczy. To nie jest srebrna kula - natknąłem się na kilka przypadków, w których przymocowanie lambdy do komponentu było najczystszym i najwygodniejszym sposobem rozwiązania problemu - ale jest to całkiem dobry wzór, jeśli można to tak nazwać.

Z nieco pokrewną uwagą: jeden z dużych, nudnych generatorów konserwacji w aplikacjach zorientowanych na dane (strony internetowe itp.) Mapuje obiekty hierarchiczne na relacyjne bazy danych. Mamy wiele fajnych rozwiązań, ale ostatecznie są to wszystkie hacki zaprojektowane w celu spłaszczenia hierarchii. Zamiast budować model w taki sposób, aby spełniał cel aplikacji, kończy się kompromis między efektywną hierarchią a logiczną reprezentacją relacyjną. Pomyślałem o przebudowaniu dość dużej hierarchii w jednej z moich aplikacji jako systemu encji / komponentów - porzuć hierarchię i uczyń bazę danych Złotym Standardem do końca wdrożenia - i jest obiecująca.

Po zintegrowaniu funkcji takich jak dynamiczne generowanie kodu / buforowanie kodu, które mogą rozwiązać problemy z wydajnością, uzyskuje się szybką, elastyczną, logiczną architekturę, która może po prostu zrealizować cel OOP wielokrotnego użytku w znacznie, znacznie lepszy sposób.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.