Grupa przyjaciół i ja pracowaliśmy od jakiegoś czasu nad projektem i chcieliśmy wymyślić przyjemny sposób OOP reprezentujący scenariusz specyficzny dla naszego produktu. Zasadniczo pracujemy nad grą w piekło w stylu Touhou i chcieliśmy stworzyć system, w którym moglibyśmy z łatwością reprezentować każde możliwe zachowanie kuli, jakie moglibyśmy wymarzyć.
Tak właśnie zrobiliśmy; stworzyliśmy naprawdę elegancką architekturę, która pozwoliła nam podzielić zachowanie pocisku na różne komponenty, które mogą być dowolnie dołączane do instancji pocisków, podobnie jak system komponentów Unity . Działał ładnie, był łatwo rozszerzalny, był elastyczny i obejmował wszystkie nasze bazy, ale był niewielki problem.
Nasza aplikacja obejmuje również dużą liczbę generowania procedur, a mianowicie generujemy proceduralnie zachowania pocisków. Dlaczego to jest problem? Cóż, nasze rozwiązanie OOP do reprezentowania zachowania pocisków, choć eleganckie, jest nieco skomplikowane w pracy bez człowieka. Ludzie są wystarczająco inteligentni, aby wymyślić rozwiązania problemów, które są zarówno logiczne, jak i sprytne. Algorytmy generowania procedur nie są jeszcze tak sprytne i trudno nam było wdrożyć sztuczną inteligencję, która w pełni wykorzystuje naszą architekturę OOP. Trzeba przyznać, że wadą architektury jest to, że nie jest ona intuicyjna we wszystkich sytuacjach.
Aby rozwiązać ten problem, w zasadzie wepchnęliśmy wszystkie zachowania oferowane przez różne komponenty do klasy wypunktowanej, aby wszystko, co mogliśmy sobie wyobrazić, było oferowane bezpośrednio w każdej instancji wypunktowanej, w przeciwieństwie do innych powiązanych instancji komponentowych. To sprawia, że nasze algorytmy generowania procedur są nieco łatwiejsze w obsłudze, ale teraz nasza klasa pocisków jest ogromnym bogiem . Jest to jak dotąd największa klasa w programie z ponad pięciokrotnie większym kodem niż cokolwiek innego. Utrzymanie jest również trochę uciążliwe.
Czy to w porządku, że jedna z naszych klas zamieniła się w obiekt boski, aby ułatwić pracę z innym problemem? Zasadniczo, czy jest w porządku mieć zapach w kodzie, jeśli pozwala on na łatwiejsze rozwiązanie innego problemu?