Далекий от исчерпанного списка в http://www.franz.com/success/all_customer_apps.lhtml
Глобальные константы - неплохая практика, если они являются ...
final
/ только для чтения
ссылка на изменяемый объект (например, Java ArrayList
или C # List
) является не константой, а глобальным состоянием. Блох рассматривает проблему «постоянного интерфейса» и «постоянного класса» в 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 #, с которыми нам приходится иметь дело - у нас есть , чтобы поместить наши константы где-нибудь , и наш лучший вариант - это класс, не поддерживающий создание экземпляров.
Глобальные константы в порядке.
Глобальные (непостоянные) переменные - дело рук дьявола.
Глобальные переменные проблематичны, потому что они вводят в значительной степени ненужные зависимости между модулями. Эти зависимости затрудняют отладку проблем и повторное использование кода.
Я бы сказал, что истинно глобальные константы также проблематичны по той же причине, поэтому вместо того, чтобы иметь синглтон с именем MyGlobals, содержащий константу типа MyGlobals.HTTP_SUCCESS_OK, упакуйте как константы вместе в свои собственные классы, например HttpStatus.SUCCESS_OK.
Я считаю, что проблема глобальных переменных в том, что они создают глобальное состояние. Глобальные константы этого не делают, но они действительно отвечают за некоторые бесконтекстные константы, что может быть плохо.
Что я бы посоветовал, если вам нужны такие вещи, так это создание перечислений (если у вас есть константы int) или static классы для констант, чтобы вы могли дать им некоторый контекст (например, Math.PI)
Я полагаю, что одна вещь, о которой не упоминается, - это более прагматические вопросы. Если вы используете скомпилированный язык, имейте в виду, что вам придется перекомпилировать, чтобы изменить значение константы. Если это значение, возможно, вы захотите часто менять, вы также можете рассмотреть конфигурационный файл.
В некоторых случаях глобальные константы - идеальный способ пойти, когда они действительно постоянны (не только постоянны для одной сборки программы, но предположительно в течение всего срока службы программного продукта и далее. ).
Например, вы не хотели бы иметь несколько классов, каждый из которых объявлял бы свою собственную константу для pi, e или HTTP_SUCCESS.
С другой стороны, глобальные константы могут создать многие проблемы глобальных переменных, если они - произвольные значения, которые могут быть изменены, например, из-за меняющихся требований. Т.е. если помещение этих констант в файл конфигурации кажется разумным вариантом, это не должно быть глобальной константой.
Глобальные переменные широко признаны плохими, и их обычно следует избегать. Вот почему так много людей имеют проблемы с паттерном синглтон. Проблема с глобальными переменными в том, что они транзитивны.