Re[4]: Refactoring: Extract Class
От: A.J. Россия CintaNotes
Дата: 11.11.04 14:02
Оценка:
Здравствуйте, Аноним, Вы писали:

Предлагаю на "ты", несмотря на автоматическое "Вы писали", тут принято /местный парадокс/

Не уверен что правильно понял, но все-таки...

А>Именно так я и сделал. Сначала все было в одной куче, много данных и много методов, все в одном классе. Затем, логически сгруппированные методы переехали в собственные классы, соот-но прихватив с собой данные, которые они интенсивно юзают.


Что значит "логически сгруппированные методы"? Класс должен представлять собой какую-то абстракцию. У тебя, насколько я понимаю, есть класс, который чем-то управляет — СontrolObject. Есть контуры управления (выделены как AlgOne, AlgTwo и т.д.). Работа контуров зависит от каких-то параметров. Непонятно, то ли это параметры управляемого объекта, то ли это параметры самих контуров.

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


А>И если раньше я мог получить любой параметр через:

..
А>то теперь я могу такое делать лишь с оставшимися данными. Чужие просто в карту нельзя добавить, т.к. они private.

Если тебе нужна какая-то информация от объекта, делай ее доступной через get-метод.


AJ>>Или вынести эти методы в общий базовый класс, а данные получать через виртуальные set/get?

А>"Эти" это какие?
Которые любят к параметрам обращаться.

А>Если получать через вирт. set/get, то их надо реализовывать в каждом классе (и соот-но городить карту параметров тоже в каждом классе). Получается вариант 3 опять же.


Почему бы не вынести все, что "будет в каждом классе", в базовый класс? тогда в классах, представляющих конкретные реализации контуров, надо будет только определить то, что отличается. И никакого дублирования кода.

Например, как в паттерне Template Method. Или еще можно посмотреть в сторону паттерна Strategy.

Lyric: А вообще, никак без карты параметров нельзя обойтись? зачем она вообще нужна? Разве это задача ControlObject, знать параметры каждого контура? Нельзя сделать что-то вроде
aControlObject->getAlg(0)->getParam(1)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.