Кодування не так складно на самому справі . Важкою частиною є написання коду, який має сенс, читабельний і зрозумілий. Тому я хочу стати кращим розробником та створити якусь солідну архітектуру.
Тому я хочу створити архітектуру для NPC у відеоіграх. Це стратегія в реальному часі, як Starcraft, Age of Empires, Command & Conquers, і т. Д. І тому я буду мати різні види NPC. NPC може мати один до багатьох здібностям (методи) цим: Build()
, Farm()
і Attack()
.
Приклади:
Робітник може Build()
і Farm()
Воїн може Attack()
Громадянин може Build()
, Farm()
а Attack()
Рибалка може Farm()
іAttack()
Я сподіваюсь, що досі все зрозуміло.
Тому зараз у мене є свої типи NPC та їхні здібності. Але давайте перейдемо до технічного / програмного аспекту.
Яка б була хороша програмна архітектура для моїх різних видів NPC?
Гаразд, я міг би мати базовий клас. Насправді я думаю, що це хороший спосіб дотримуватися принципу DRY . Тож у мене можуть бути такі методи, як WalkTo(x,y)
у моєму базовому класі, оскільки кожен NPC зможе перейти. Але тепер давайте прийдемо до реальної проблеми. Де я реалізую свої здібності? (Пам'ятаєте: Build()
, Farm()
а Attack()
)
Оскільки здібності будуть складатися з тієї самої логіки, було б дратувати / порушувати принцип DRY, щоб реалізувати їх для кожного NPC (Worker, Warrior, ..).
Гаразд, я міг би реалізувати свої здібності в базовому класі. Це зажадає який - то логіки , яка перевіряє , якщо NPC може використовувати здатність X. IsBuilder
, CanBuild
.. Я думаю, ясно , що я хочу висловити.
Але я не дуже добре почуваюся з цією ідеєю. Це звучить як роздутий базовий клас із занадто великою функціональністю.
Я використовую C # як мову програмування. Тож багаторазове успадкування тут не є варіантом. Засоби: мати додаткові базові класи, як, наприклад Fisherman : Farmer, Attacker
, не вийде.