Реестр реестра: использовать или не использовать - PullRequest
5 голосов
/ 24 марта 2011

Я рассматриваю возможность использования шаблона Registry в своем приложении для хранения слабых указателей на некоторые окна и панели приложения.Общая структура приложения показана ниже.

Application diagram

Приложение имеет одно окно верхнего уровня MainFrame с несколькими дочерними панелями в нем.Может быть много вкладок на основе типа TabPane.Мне нужно сослаться на панель ParamsPane со всех моих вкладок TabPane, поэтому мне нужен указатель на объект ParamsPane для хранения где-нибудь.Вариантов может быть много, но наиболее очевидными являются (1) хранение указателя в одноэлементном объекте Application или (2) создание простого класса реестра.Что-то вроде:

class Registry {
public:
    static MainApp* application;
    static MainWindow* mainWindow;
};

Это хорошая практика?Каковы преимущества и недостатки такого подхода?

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

Это зависит от того, почему вы хотите сослаться на ParamsPane. Я могу придумать две причины и два разных решения.

Вы хотите обновить данные в ParamsPane, поскольку данные в TabPane изменились.

Если эти данные полностью отделимы от представления, вероятно, вам следует отделить их. Это означает следование шаблону Model-View-Controller . Оба экземпляра ParamsPane и TabPane могут обращаться к модели по отдельности. Так что между ними нет прямой ссылки.

Между этими двумя понятиями существует сильная связь, не имеющая отношения к данным.

Если предыдущий упомянутый пункт не имеет значения, и между двумя панелями существует действительно сильная связь, вы можете рассмотреть возможность написания определенного класса TabPane, который хранит ссылку на класс ParamsPane.

Мне кажется, что оба эти решения лучше, чем подход Singleton или Registry. Остерегайтесь, что я не слышал об этой модели прежде, но я полагаю, что понимаю ее намерения. Более подробную информацию о том, почему глобальные объекты состояния (в частности, синглтоны) являются плохой практикой , можно найти здесь .

0 голосов
/ 24 марта 2011

Ваш класс Registry и Singleton являются OO-способами глобальных переменных. Предпочитаю создавать панель параметров в главном блоке и передавать ее в качестве ссылки на панели вкладок.

0 голосов
/ 24 марта 2011

С точки зрения тестируемости, может быть не очень хорошая идея использовать шаблон реестра.Чтобы сделать репост из этой статьи :

Модульное тестирование основано на предположении, что вы тестируете небольшие дискретные блоки кода, которые не имеют зависимостей.Это требует, чтобы разработчики сделали все возможное, чтобы либо удалить зависимости, либо издеваться над ними таким образом, чтобы зависимости были нейтрализованы как факторы, способствующие отказу тестируемого модуля.В PHP 5 объекты не копируются при назначении;вместо этого их адрес в хеш-таблице копируется.Это означает, что если вы извлекаете объект из реестра, а затем изменяете его, каждый последующий поиск в реестре будет отражать это изменение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...