#c_sharp
Допустим, у меня есть программа, которая использует некоторые данные, такие как зависимость ускорения свободного падения от широты. Я создаю статический класс, со статическим словарём, в котором "вбиты" все эти данные. Является ли такой подход правильным и рациональным? Если нет, как лучше хранить данные в таком случае?
Ответы
Ответ 1
Подходов для хранения данных немало, в том числе справедлив и тот, что указали вы. Но на самом деле хорошей практикой считается отделение кода от данных, т.е. данные отдельно, а программа отдельно. Основная и самая весомая причина для этого - если вдруг у вас поменяются данные, а они зашиты (захардкоджены) в программу, то в случае изменения данных программу придется перекомпилировать. Если же данные хранятся отдельно, то их можно поменять тоже отдельно, без перекомпиляции программы. Смотрите сами на характер ваших данных - если это преимущественно константы, т.е. значения по типу числа пи, ускорения свободного падения и т.д., то да, вероятно, имеет смысл объявить их в коде. Либо можно записать их в ресурсы программы, в этом случае они будут как бы отдельно, но вшиты в тело сборки (в бинарник ваш). В противном случае вы можете хранить данные в XML-файле, в файле App.config, в простом текстовом или INI-файле, даже в реестре Windows, или в таблице (таблицах) базы данных (например, в SQLite). Рекомендуемый способ - XML и App.config (тоже XML по сути), но вы вольны выбрать то, с чем вам проще и удобнее работать. UPD. Уже после ответа отыскалась статья на Хабре, посвященная хранению настроек приложения.Ответ 2
На первых порах подход хороший, и вам не нужно предусматривать заранее все возможные случаи. (Попытка учесть вообще всё на начальном этапе называется overengineering.) Я бы всё же посоветовал использовать не статический класс, а экземпляр, доступный в статическом месте, потому что это позволит легче изменять код, если нужно (и не стоит практически ничего). Возможные направления развития: У вас появятся разные планеты? Тогда у вас будут несколько таких классов, по одному для планеты. Вам нужно конфигурировать это на машине клиента? Тогда нужно будет считывать данные из конфигурационного файла. Но не делайте это сейчас. Не пытайтесь предусмотреть возможные пути развития в начале разработки, подождите, пока это потребует заказчик.Ответ 3
Если по данными вы подразумеваете некоторые относительно постоянные физические величины и законы (относительно постоянные, потому что иногда вносятся уточнения в константы, да и законы иногда пересматривают, в истории науки примеров достаточно) то в принципе вы на правильном пути, но я делал немного иначе в проекте по моделированию вакуумных процессов. Статический класс по аналогии System.Math, это у вас уже есть. Константы задаются в виде свойств, не констант или полей, а именно свойств, почему станет понятно позже. Этот класс или набор классов, для логической группировки величин и законов, компилируются в виде отдельной библиотеки, которую подключаем к программе. Теперь о константах заданных свойствами. На первый взгляд, разницы между константным свойством и константой нет, но это только на первый взгляд. Вспоминаем что свойство это метод, в случае с константами один, условно get. Это дает одно, но существенное преимущество. Константа при компиляции намертво встраивается в код в тех местах, где вы к ней обращаетесь. Поэтому даже если вы замените константу в библиотеке, то для того, чтобы она попала в код, использующий эту библиотеку, придется его повторно компилировать. В случае со свойствами перекомпиляция не потребуется, вы можете безболезненно заменить устаревшую библиотеку на обновленную, если сигнатуры публичных методов и список методов остались неизменными (список методов может быть расширен в новой версии). Т.о. у вас появляется возможность вносить уточнения в точность констант и алгоритмы вычисления величин, а также заменить константное свойство на вычисляемое, без необходимости пересобирать всю программу. Вариант хранить подобные величины в БД или файле конфигурации конечно можно применить, но не думаю что давать пользователю возможность править физические законы будет хорошей идеей, особенно если последний плохо знаком с предметной областью. Другие возможные варианты уже описаны в соседних ответах.
Комментариев нет:
Отправить комментарий