Должны ли переменные-члены глобальных объектов быть также глобальными? - PullRequest
0 голосов
/ 26 декабря 2010

Я разрабатываю плагины в Eclipse, которые предписывают использование одноэлементного шаблона для класса Plugin для доступа к плагину времени выполнения.Класс содержит ссылки на такие объекты, как конфигурация и ресурсы.

В Eclipse 3.0 объекты среды выполнения подключаемых модулей не управляются глобально и поэтому не являются общедоступными.Скорее, каждый плагин может свободно объявлять API, который предоставляет объект времени выполнения плагина (например, MyPlugin.getInstance ()

, чтобы другие компоненты моей системы могли получить доступ к этим объектам,Я должен сделать следующее:

MyPlugin.getInstance().getConfig().getValue(MyPlugin.CONFIGKEY_SOMEPARAMETER);

, который является слишком многословным IMO.

Поскольку MyPlugin предоставляет глобальный доступ, мне было бы проще просто предоставить глобальный доступ кобъекты, которыми он также управляет?

MyConfig.getValue(MyPlugin.CONFIGKEY_SOMEPARAMETER);

Есть какие-нибудь мысли?

(на самом деле я спрашиваю, потому что читал обо всех дискуссиях «Доступ к глобальным переменным и синглтоны - зло»)

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

Есть мысли?

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

Но подумайте о потенциальных недостатках использования статики:

  • Что если в будущей версии Eclipse Plugin объекты будут иметь глобальное управление?
  • Что если вы хотите повторно использовать ваши классы конфигурации в связанном плагине?
  • Что если вы хотите использовать фиктивную версию вашего класса конфигурации для модульного тестирования?

Кроме того, вы можете сделать код менее подробным путем рефакторинга; например,

... = MyPlugin.getInstance().getConfig().getValue(MyPlugin.CONFIGKEY_P1);
... = MyPlugin.getInstance().getConfig().getValue(MyPlugin.CONFIGKEY_P2);

становится

MyConfig config = MyPlugin.getInstance().getConfig();
... = config.getValue(MyPlugin.CONFIGKEY_P1);
... = config.getValue(MyPlugin.CONFIGKEY_P2);
0 голосов
/ 26 декабря 2010

Вы предлагаете

MyPlugin.getInstance().getConfig().getValue(MyPlugin.CONFIGKEY_SOMEPARAMETER);

слишком многословно и

MyConfig.getValue(MyPlugin.CONFIGKEY_SOMEPARAMETER);

может быть лучше. По этой логике, не будет:

getMyConfigValue(MyPlugin.CONFIGKEY_SOMEPARAMETER):

быть еще лучше (может быть, не короче, но проще)? Я предлагаю вам написать локальный вспомогательный метод.

Это дает вам преимущество читабельности без обхода концепций, созданных людьми, которые пытались исправить код, который был сделан простым / коротким / простым способом.

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

Подумайте, как вы будете издеваться над таким классом. Макетирование публичной статики удивительно раздражает. Извлекать одиночные игры сложно (вы должны переопределить свой метод получения в каждом методе, который его использует). Внедрение зависимостей является следующим уровнем, но это может быть сенсорный вызов между DI и несколькими простыми синглетонами.

...