Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема "раздутого" класса (http://www.flasher.ru/forum/showthread.php?t=215614)

ZergMaster 27.06.2018 16:01

Цитата:

Сообщение от RedHead90 (Сообщение 1205640)
Как мне кажется, если решать "проблему раздутого класса" чисто с помощью цепочки наследования, то мы получим некое разросшееся дерево

Честно говоря, на мой взгляд, решать проблему раздутого класса наследованием вообще не верно, ибо оно не для того придумано. Наследование предназначено для полиморфизма и модульности архитектуры, а также для избавления от копипасты кода. Наследование имеет смысл, когда детей больше, чем один. Даже в Чистом коде об этом есть - каждый следующий узел потомков в наследовании должен представлять из себя дерево, то есть разветвляться. Иначе наследование просто не имеет смысла и создавать кучу родителей и потомков на пустом месте - избыточно. Поэтому решать проблему раздутого класса надо, конечно же, через композицию.

Wolsh 28.06.2018 00:28

Цитата:

Сейчас попробовал сделать SkillManager и загнать туда все скиллы, а также методы, связанные с моделью их увеличения.
Ну и вот на досуге как-нибудь подумай: может не обязательно хранить ссылку на него как свойство Героя и тем более обеспечивать доступ к его свойствам и методам через геттеры Героя (о чем говорит RedHead90). Может, этот менеджер скиллов может существовать "сам по себе" там, где он собственно и нужен? Ну, конечно, если у всех других персонажей нет никаких скиллов.

Appleman 28.06.2018 10:53

Не, скиллы у неписей учитываются, с этим даже отдельная геймплейная механика связана, где они не все изначально известны и игроку требуется по ходу прояснять их для повышения общей эффективности.

В любом случае, я очень всем признателен за комментарии. Тема началась ни шатко ни валко, но по итогу раскрутилась-таки. Много чего почерпнул.

Добавлено через 1 минуту
Цитата:

Сообщение от ZergMaster (Сообщение 1205643)
Даже в Чистом коде об этом есть - каждый следующий узел потомков в наследовании должен представлять из себя дерево, то есть разветвляться.

ZergMaster, чистый код - имеется в виду книга Боба Мартина?

ZergMaster 28.06.2018 15:01

Appleman да. Но это не точно

RedHead90 29.06.2018 00:48

Цитата:

Но в случае если число свойств, различных для Player и NPC, невелико, то проблему раздутого класса не решает, а геморроя добавляет.
Проблему раздутого класса это точно решит. Но если слепо следовать такому подходу, может появиться проблема большого количества очень маленьких классов.

Цитата:

Я сам изначально вводил приватные переменные в классы-наследники (т.е. делал всё то же, но не в форме отдельного класса, а просто свойствами в имеющийся)
Тут я не совсем понял. Если ты про тот код, что я привел, то там все компоненты - это публичные свойства. Я просто опустил модификаторы доступа. Это классы-узлы, в которых вообще нет никакой логики, а только публичные поля, указывающие на компоненты. Это тупо списки полей, которые потом автоматом инициализируются с помощью интроспекции или еще как-то.

Appleman 19.07.2018 01:14

Послушайте, други,печальную и поучительную историю об импульсивном программировании. Я наконец добрался до Entity-Component-System, пяток статей прочитал (RedHead90, спасибо за наводку), и так меня этот подход вставил, ну просто не по-детски! По крутизне почти MVC, имхо. И загорелся я если не целиком под него переписать, то хотя бы свою частную проблему с раздутым классом персонажа решить. И рефакторил я хрен знает сколько часов на кураже. Выделил отдельные компоненты, схожие по области и логике, кое-где от них ещё унаследовался для реализации специфики, задвинул в них методы обработки данных. На первый взгляд получилось шикарно. Вполне компактный класс Character, к которому подключаются блоки Personality, Parameters, Skills, Statuses и т.п. И все они ни хрена не инкапсулированы. Надо кому со стороны, например, условие проверить - не вопрос! Обращаемся: character.personality[PropID] и вперёд с песней!

Но вот один момент я, блин, не учёл. А он по ходу самый важный. Почему-то мне было невдомёк, что в "чистом" виде все свойства, забитые в Personality и Sexuality, никому не нужны. Причём совсем. Получая, например, значение интеллекта, нужно ещё посмотреть, не надет ли шутовской колпак (WearManager), и не контужен ли наш герой (StatusManager). Короче, тянуть что-то в обход самого "узлового" Character ни фига не получается. А если через него, то теперь у нас не "одно окно" в форме character[PropID], а ещё бухгалтерия с определением, к какому компоненту обращаться.

В общем, сижу-горюю. И обратно к бардаку откатывать неохота, и как это хозяйство без крови организовать не придумывается.


Часовой пояс GMT +4, время: 08:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.