Здравствуйте, A.J., Вы писали:
AJ>Предлагаю на "ты"...
Согласен.
AJ>Что значит "логически сгруппированные методы"? Класс должен представлять собой какую-то абстракцию. У тебя, насколько я понимаю, есть класс, который чем-то управляет — СontrolObject. Есть контуры управления (выделены как AlgOne, AlgTwo и т.д.). Работа контуров зависит от каких-то параметров. Непонятно, то ли это параметры управляемого объекта, то ли это параметры самих контуров.
Все так.
Логически сгруппированные методы — это методы, которые совместно реализуют некий алгоритм управления отдельным контуром (с заданной периодичностью включают исполнительные механизмы, отслеживают изменение параметров объекта, выдерживают определенные временные интервалы).
Насчет параметров. Есть общие параметры (уставки, значения измеренных величин) которые используются всеми/несколькими контурами управления. Кроме этого, каждый контур управления имеет свой набор параметров, которые определяют состояние исключительно этого контура (таймера, счетчики, внутренние режимы работы).
AJ>Нужно сначала анализ предметной области провести, что как с чем соотносится. Тогда все намного проще станет. Проблема в том, что ты пытаешься программу, написанную в процедурном стиле, перевести в ОО-программу без анализа сущностей и назначения ответственностей.
Пытаюсь, это верно. Ответственность ControlObject — обеспечение согласованной работы всех контуров управления и инкапсуляция в себе состояния самого объекта. Ответственность AlgOne, AlgTwo ..... — обеспечение работы конкретных контуров управления.
Отношение м-у ControlObject и AlgOne(Two,...) один к одному. Один ControlObject имеет один контур AlgOne, один контур AlgTwo, .....
Alg* не связаны между собой общим предком и не наследуют от ControlObject.
AJ>Почему бы не вынести все, что "будет в каждом классе", в базовый класс? тогда в классах, представляющих конкретные реализации контуров, надо будет только определить то, что отличается. И никакого дублирования кода.
Потому что инстансы же разные. А каждому классу нужно использовать вполне конкретный экземпляр другого класса.
AJ>Lyric: А вообще, никак без карты параметров нельзя обойтись? зачем она вообще нужна? Разве это задача ControlObject, знать параметры каждого контура? Нельзя сделать что-то вроде AJ>aControlObject->getAlg(0)->getParam(1)?
Какова будет реализация getParam(1)? Ведь нужно в соответсвие "1" привести какой-то конкретный параметр. Не switch-ем же перебирать.
С картой параметров очень удобно "вынимать" значения параметров, зная только их Id.
Грубо говоря, с верхнего уровня приходит запрос "дай мне значение параметра N 67". Вот я и должен иметь возможность любому параметру (как общему, так и параметру какого-то конкретного контура) назначить этот номер и по запросу без лишнего геммороя достать его значение.
Вот завел я в каком-нибудь из контуров новый параметр, дал ему Id и теперь хочу на ВУ системы (без переделок самого ВУ) поглядеть этот параметр. Ввел я в поле его Id нажал кнопочку и улетел запрос. Как это лучше сделать если параметры разбросаны по классам?