LINUX.ORG.RU

Разделяю один объект на два. Как правильно сделать их взаимодействие?

 , ,


0

1

Дошли у меня руки поковыряться с застаревшим кодом. Надо его потихоньку приводить в более удобоваримое состояние. Проект - это простой WYSIWING редактор, используемый в составе программы MyTetra.

Основной файл - editor.cpp (класс Editor).

https://github.com/xintrea/mytetra_dev/tree/editorModification/src/libraries/...

Сий редактор был сделан на скорую руку на основе стандартного примера из Qt. И все объекты кнопок управления ранее находились прямо в классе Editor.

Сейчас я выделяю из класса Editor класс панели с кнопками, называемый EditorToolBar. И вот вопрос. После выделения кнопок в отдельный класс, внутри этого нового класса нужны обращения к вышестоящему виджету (т. е. к классу Editor) для следующих действий:

1. Получение конфига редактора (от нескольких переменных конфига зависит расположение кнопок и прочих элементов управления, размещенных на EditorToolBar)

2. Текущий режим отображения редактора (от режима зависит видимость и действия кнопок и прочих элементов EditorToolBar)

3. Enum допустимых режимов редактора (чтобы было с чем сравнивать при действиях в пункте 2)

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

А я не могу придумать, как же мне не обращаться к parent-виджету для получения нужных мне данных. Как поступить в случае, когда есть главный объект редактора, и второстепенный объект тулбара? Как сделать такой тулбар, чтобы он не требовал данных от редактора? Да и нужно ли такой делать?

★★★★★

Если я правильно понял проблему, то можно ввести третью сущность, о которой будут знать и Editor и EditorToolBar. Эта сущность будет ответственна за хранение конфига редактора, у нее будет слот «изменитьРежим» и сигнал «режимИзменен», ну и т.п.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

за хранение конфига редактора

Конфиг редактора - это отдельный объект, хранится как свойство редактора.

у нее будет слот «изменитьРежим» и сигнал «режимИзменен»

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

Xintrea ★★★★★
() автор топика

Не понял, а зачем их получать из EditorToolbar?

EditorToolbar содержится внутри Editor? Так пускай Editor и сообщает EditorToolbar'у всю инфу.

jeuta ★★★★
()
Ответ на: комментарий от jeuta

EditorToolbar содержится внутри Editor?

Да.


Так пускай Editor и сообщает EditorToolbar'у всю инфу.

То есть:

1. сообщает указатель на конфиг (это я могу понять)
2. Сообщает возможные режимы редактора (это как-то неудобно, EditorToolbar должен на этапе компиляции знать какие режимы бывают, потому что в коде разное поведение для разных режимов).
3. Ретранслирует изменения режимов редактора (а вот это уже хуже, что-то мне подсказывает, что так делать нехорошо)

Xintrea ★★★★★
() автор топика

ЭЭх! Анонiмуса зобанили. Щас бы он тебе рассказал про сообщения снизу «готовнах» и сообщения сверху «натебеконфигнах» :(

anonymous
()
Ответ на: комментарий от Xintrea

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

Тебе там виднее что с чем связанно, я не пытаюсь вникнуть в твою архитектуру. Тем не менее, у тебя стоит задача для двух объектов получить доступ к конфигу. Вполне очевидно, что этот конфиг можно хранить либо в одном из этих двух объектов, либо в каком-то третьем. Какой вариант в твоем случае более прямой - решай сам. Лично я не вижу проблемы в том, что EditorToolBar знает о существовании Editor и взаимодействует с ним. Посредством сигналов/слотов или того же паттерна «наблюдатель» - в данном случае это детали. Лучше скажи, чем тебя не устраивает тот же «наблюдатель»? Передать указатель на Editor в конструктор EditorToolBar'у и потом его использовать - вполне прямое решение. EditorToolBar будет обращаться не к какому-то там parent'у, а к вполне себе конкретному объекту.

m0rph ★★★★★
()

1. Получение конфига редактора (от нескольких переменных конфига зависит расположение кнопок и прочих элементов управления, размещенных на EditorToolBar)

Передавай конфиг при создании объекта. Если он (конфиг) может меняться динамически, просовывай сигналом или прямым вызовом из основного виджета.

2. Текущий режим отображения редактора (от режима зависит видимость и действия кнопок и прочих элементов EditorToolBar)

Аналогично.

3. Enum допустимых режимов редактора (чтобы было с чем сравнивать при действиях в пункте 2)

В общих заголовочных файлах ничего плохого нет.

staseg ★★★★★
()

внутри этого нового класса нужны обращения к вышестоящему виджету (т. е. к классу Editor) для следующих действий

Да там у тебя через строчку обращение к другим компонентам. А не только эти три «действия».

ИМХО если класс отображается на экране он и должен только отображаться. А всю логику спрячь в класс-контроллер, который будет в обоих классах.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.