Действительно ли глобальные константы являются антишаблоном?

Далекий от исчерпанного списка в http://www.franz.com/success/all_customer_apps.lhtml

11
задан aberrant80 12 August 2009 в 02:40
поделиться

7 ответов

Глобальные константы - неплохая практика, если они являются ...

  1. ... неизменяемыми - глобальная, final / только для чтения ссылка на изменяемый объект (например, Java ArrayList или C # List ) является не константой, а глобальным состоянием.
  2. ... требуется> 1 классу. Если ваши константы нужны только одному классу, поместите константы непосредственно в класс. (Предупреждение: балансируйте СУХОЙ и ЯГНИ соответствующим образом. )

Блох рассматривает проблему «постоянного интерфейса» и «постоянного класса» в Effective Java и защищает подход «постоянного класса». Причина, по которой вам не нужны константы в интерфейсе, заключается в том, что это побуждает клиентские классы «реализовать» этот интерфейс (чтобы получить доступ к константам без префикса с именем интерфейса). Однако вам не следует этого делать - интерфейс на самом деле не является интерфейсом к возможностям объекта, а является удобством времени компиляции, укоренившимся во внешнем типе класса. Примите во внимание следующее:

interface C { public static final int OMGHAX = 0x539; }
class A implements C { ... }
class B { private A a; }

Класс B теперь излишне зависим от C . Если реализация A изменится так, что ей не нужны константы из C , вы можете ' t remove реализует C из него, не нарушая его внешний интерфейс - кто-то (возможно, очень глупый человек, но таких людей много) может ссылаться на объект A через C ] ссылка!

Помещая константы в класс и делая этот класс неинтересным, вы информируете клиентов, что константный класс на самом деле просто функционирует как подпространство имен. В C # вы помечаете класс как static , в Java вы хотите сделать его final и указать недостижимый конструктор:

final class C { 
    private C() { throw new AssertionError("C is uninstantiable"); }
    public static final int OMGHAX = 0x539; 
}

Если вы программируете на Java и хотите, чтобы константы были без добавив к ним префикс имени константного класса, вы можете использовать функцию import static .

И да, это немного избыточно, когда нужно создавать новый тип только для того, чтобы было куда поместить ваши константы, но это ' в таких языках, как Java и C #, с которыми нам приходится иметь дело - у нас есть , чтобы поместить наши константы где-нибудь , и наш лучший вариант - это класс, не поддерживающий создание экземпляров.

14
ответ дан 3 December 2019 в 00:46
поделиться

Глобальные константы в порядке.

Глобальные (непостоянные) переменные - дело рук дьявола.

27
ответ дан 3 December 2019 в 00:46
поделиться

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

Я бы сказал, что истинно глобальные константы также проблематичны по той же причине, поэтому вместо того, чтобы иметь синглтон с именем MyGlobals, содержащий константу типа MyGlobals.HTTP_SUCCESS_OK, упакуйте как константы вместе в свои собственные классы, например HttpStatus.SUCCESS_OK.

10
ответ дан 3 December 2019 в 00:46
поделиться

Я считаю, что проблема глобальных переменных в том, что они создают глобальное состояние. Глобальные константы этого не делают, но они действительно отвечают за некоторые бесконтекстные константы, что может быть плохо.

Что я бы посоветовал, если вам нужны такие вещи, так это создание перечислений (если у вас есть константы int) или static классы для констант, чтобы вы могли дать им некоторый контекст (например, Math.PI)

5
ответ дан 3 December 2019 в 00:46
поделиться

Я полагаю, что одна вещь, о которой не упоминается, - это более прагматические вопросы. Если вы используете скомпилированный язык, имейте в виду, что вам придется перекомпилировать, чтобы изменить значение константы. Если это значение, возможно, вы захотите часто менять, вы также можете рассмотреть конфигурационный файл.

4
ответ дан 3 December 2019 в 00:46
поделиться

В некоторых случаях глобальные константы - идеальный способ пойти, когда они действительно постоянны (не только постоянны для одной сборки программы, но предположительно в течение всего срока службы программного продукта и далее. ).

Например, вы не хотели бы иметь несколько классов, каждый из которых объявлял бы свою собственную константу для pi, e или HTTP_SUCCESS.

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

2
ответ дан 3 December 2019 в 00:46
поделиться

Глобальные переменные широко признаны плохими, и их обычно следует избегать. Вот почему так много людей имеют проблемы с паттерном синглтон. Проблема с глобальными переменными в том, что они транзитивны.

0
ответ дан 3 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: