У меня есть несколько наборов действий (например, копирование, вставка, отмена, повтор, отображение прикрепляемого окна XYZ, масштабирование и т.д.), которые я не хочу дублировать в нескольких местах, но которые разделяются разными частями GUI, как главное меню, панель инструментов и контекстное меню.
Каков наилучший способ поделиться ими? Я использую Qt 5.3 с С++, но это в основном не зависит от какой-либо конкретной инфраструктуры GUI или языка.
Некоторые возможности:
-
Назначьте одно центральное место, скажем, в главном окне, чтобы создать все из них с их текстом, значком и обратным вызовом. Тогда:
-
Передайте действия конструктору при создании подкомпонентов графического интерфейса. Это может сделать списки параметров конструктора довольно длинными.
-
Вызывающие вызовы для подкомпонентов графического интерфейса после того, как подкомпонент сконструирован и прошел все необходимые действия. Это делает конструктор короче, но в конце концов он не намного красивее.
-
Поставьте получателей из главного окна и подкомпоненты получат нужные им действия. Подкомпоненты обычно имеют указатель на главное окно. Это делает так, что главное окно не знает, кто заботится о каком-либо действии, но также предоставляет множество публичных членов (если я не использую идиому Адвокат-Клиент или аналогичную).
-
Добавьте их в отдельный глобальный-хэш-репозиторий, где основное окно добавляет их, и пользователи по мере необходимости находят их по имени или ключу или что-то в этом роде. Это похоже на другие варианты, но немного облегчает проблемы и предоставляет только один параметризованный геттер, а не пучок конкретных геттеров. Даунсайд: добавляет объект global-ish, к которому все обращаются.
-
-
Определите действия в "основном" прецеденте, скажем, в главном меню, а затем получите геттеры для всех остальных. Это находит их в одном месте и будет означать, что главное окно должно будет снабжать только одну функцию геттера для главного меню. Но он по-прежнему раскрывает кучу внутренних членов как общедоступных.
Какой лучший подход? Есть ли что-то лучшее, что я не перечислял здесь?