Правильный способ использования констант Globals - PullRequest
21 голосов
/ 22 июня 2010

Почти в каждом проекте я не могу решить, как поступить с определенными глобальными постоянными значениями.В прежние времена, когда я писал программы на C ++, в которых не использовались dll, это было легко.Просто создайте и .h файл с номером const, который описывает определенные постоянные значения для моего проекта.Тогда у меня был каждый файл, включающий его, и та-да!Это сработало.Чистота, соблюдение принципа СУХОЙ и простота.

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

  1. Создайте сборку, единственной целью которой является сохранение постоянных значений для моего проекта.Затем каждая другая Ассамблея должна ссылаться на этот .Я уважаю DRY и KISS, поскольку добавить ссылки достаточно просто.Основная проблема здесь заключается в том, что мне нужно перекомпилировать весь исходный код для обновления этих значений.

  2. Используйте файл app.config, и все другие сборки получат константу во время инициализации. Поэтому я добавляю издержки на инициализацию всего, чтобы получить доступ к глобальному значению.Он более гибкий, но и более болезненный.

  3. Использование ресурсов. Я думаю, что это то же самое, что и с app.config.

Итак, я знаю, что есть лучший способ сделать это объявление констант.Но я не знаю и до сих пор не смог найти, как это сделать.Можете ли вы помочь?У меня есть конфеты!

Спасибо всем

Ответы [ 9 ]

8 голосов
/ 22 июня 2010

Э-э, если предположить, что ваши константы невелики, вы должны просто иметь возможность объявить их как public const в классе по вашему выбору:

namespace MyProject
{
    public class Awesome
    {
        public const int SomewhatAwesome = 1;
        public const int ExtraAwesome = 2;
        /* etc */
    }
}

Вы должны включить своих const членовв классах, к которым они относятся, т.е. если SomewhatAwesome и ExtraAwesome используются для класса Awesome, то они должны быть константами, объявленными в этом классе. Не создавайте дополнительную сборку только для хранения константных значений, а не создайте выделенный статический класс или пространство имен для ваших констант, если на самом деле нет ничего другого, что группирует константы вместе.

Файл app.config предназначен для настроек, которые могут быть изменены конечным пользователем во время выполнения.Не помещайте константы, которые не должны изменяться в этом файле.Ресурсы предназначены для «больших» объектов, таких как текстовые файлы и изображения, которые было бы утомительно или невозможно включить в качестве буквальных членов класса.Не кладите в ресурсы простые вещи, такие как целые числа и короткие строки.

7 голосов
/ 22 июня 2010

Вы можете использовать ключевое слово readonly вместо const, чтобы избежать необходимости перекомпилировать все, когда значения изменяются.

Выдержка из MSDN:

Хотя поле const является константой времени компиляции, поле readonly может использоваться для констант времени выполнения

См ссылка для более подробной информации.

2 голосов
/ 22 июня 2010

Для проектов C #, если вам нужны константы, возможно, лучше всего использовать файл настроек, предоставляемый в Visual Studio, в настройках вашего проекта. Он поддерживает пользовательские типы и AFAIK все, что помечено как сериализуемый.

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

1 голос
/ 22 июня 2010

Похоже, использование класса является рекомендацией Microsoft. http://msdn.microsoft.com/en-us/library/bb397677.aspx

0 голосов
/ 22 июня 2010

Старайтесь избегать классов God и статических классов 'helper', если можете помочь.Вы должны приложить все усилия, чтобы переместить постоянные данные в соответствующие классы.

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

Вы можете использовать шаблон Singleton, когда данные используются во многих объектах.Хотя это не обязательно лучшая практика.В последнее время я стал больше использовать внедрение зависимостей IoC в таких ситуациях с Unity и MEF.

0 голосов
/ 22 июня 2010

константы времени компиляции зависят от вселенной, в которой вы живете. Так что пи и е - константы времени компиляции.

Константы времени выполнения могут потенциально меняться с каждой новой версией.

параметры могут потенциально меняться при каждом запуске приложения (или чаще в зависимости от того, как реализованы параметры, например, диск db, файл конфигурации и т.д.).

0 голосов
/ 22 июня 2010

У меня есть несколько проектов, над которыми я работаю, и мы решили создать статический класс для наших глобальных значений и функций:

namespace MyNamespace
{
    public static class MyGlobalClass
    {
        //Global stuff here
    }
}

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

0 голосов
/ 22 июня 2010

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

При этом я действительно не думаю, что вы должны относиться к этим константам иначе, чем к другим данным, они должны жить в dll. Это также имеет дополнительное преимущество, заключающееся в возможности создания версии dll в случае изменения «констант».

0 голосов
/ 22 июня 2010

Если вы хотите, чтобы значения можно было изменять во время выполнения, используйте app.config.

Если вы хотите, чтобы они были исправлены во время выполнения, вам придется (и вы хотите, чтобы пользователи не возились с ними) перекомпилировать каждый раз, когда вы хотите изменить их, поэтому используйте все, что подходит для вашего языка. В случае C # это какой-то класс / сборка GlobalValues.

Не используйте файл ресурсов для глобальных значений или настроек, если вы не хотите поменять местами наборы значений в виде группы (например, при компиляции для другого языка).

...