Типы существуют по определенной причине: если бы они не добавляли никакой выгоды, мы бы их не имели и не использовали бы, а у нас был бы просто «тип», и все было бы так. Они не только удобны, они также добавляют безопасность и эффективность. Ниже приведен список причин, по которым вы всегда должны сохранять типы в их собственном формате, а не в виде строк . DateTime
Большую часть времени я использовал в качестве примера, но те же принципы применимы к любому примитивному типу, такому как целые, десятичные, двоичные и т. Д.
Хранилище данных
Ограничения
Тип Ограничение
Почти все хранилища данных позволяют указывать ограничения на данные, в том числе ограничения типов. Одним из основных преимуществ указания DateTime
экземпляра является то, что хранимые данные будут ограничены этим типом. Никогда нельзя будет вводить что-либо, кроме даты и времени, независимо от того, как данные были вставлены в хранилище. Последнее важно для больших систем, где есть несколько процессов, которые напрямую взаимодействуют с магазином. Сюда также входит попытка добавить ошибочные даты, например, 30 февраля (любого года), поскольку в феврале может быть только 29 дней в високосном году и 28 дней в течение не високосных.
Ограничения валидации
Существуют также ограничения проверки, которые могут быть реализованы в хранилище данных, например, обеспечение того, чтобы вставленная дата не превышала текущую дату или чтобы дата начала наступала раньше даты окончания.
операции
Большинство хранилищ данных также имеют встроенные операции / функции, такие как DateAdd
или DatePart
в MS Sql Server. Это позволяет начать фильтрацию или выбор определенных данных, пока они еще находятся в хранилище (еще не загружены в приложение).
Универсально принятый формат
При использовании нативного типа другие разработчики или системы, которые также взаимодействуют с хранилищем, не должны быть проинформированы о мельчайших деталях того, как хранится этот примитивный тип. Это не тот случай, если этот тип был сохранен как строка, тогда вы должны убедиться, что все понимают формат этого DateTime
представления строки. Эта система становится хрупкой при работе с данными, которые охватывают локали, регионы и культуры в источнике данных, физическое местоположение приложения и атрибуты конечного пользователя / системы, взаимодействующей с этими данными. Пример: формат даты в одной стране может быть ММ / дд / гггг (как в США), но в другой это может быть дд / мм / гггг, обнаружение такой разницы становится практически невозможным.
скорость
Скорость поиска, скорость проверки, скорость операций и эффективность хранения также являются важными факторами. Пример скорости извлечения: хранилища данных позволяют использовать индексы для столбцов, и эти индексы, как правило, могут использоваться более эффективно, если тип хранится в его собственном формате.
заявка
Доступ к данным
Выполнение запросов к хранилищу упрощается при использовании системы собственных типов, поскольку разработчикам, опять же, не нужно угадывать формат хранения. Почти все поставщики приложений хранилища данных ( пример: ado.net ) предоставляют механизмы для создания правильных параметризованных запросов на основе переданных собственных типов. Вот пример добавления части Date в запрос ado.net для хранилища Sql Server. делать то же самое со строками было бы очень громоздким и хрупким / подверженным ошибкам.
command.Parameters.Add(new SqlParameter("@startDate", SqlDbType.Date) {Value = myDateInstance.Date});
операции
Собственные типы в коде также обеспечивают стандартные операции, такие как тип .net System.Date
. Операции обычно имеют математическую природу, такие как добавление дат, поиск различий между датами и т. Д. Опять же, это невозможно сделать для строковых типов.
Уровень представления
место действия
Когда примитивный тип окончательно преобразуется в строку на уровне представления ( правильное расположение в программном стеке, чтобы сделать это ), у программиста теперь есть различные опции, чтобы правильно отобразить его в соответствии с контекстом, в котором он представлен. Этот контекст обычно состоит из фактического значения данных и языкового стандарта пользователя.
Пример 1
Экземпляр datetime может быть автоматически отформатирован в зависимости от локали пользователя.
DateTime.Now.ToString("D", CultureInfo.GetCultureInfo(userContext.Culture))
Пример 2
Десятичный экземпляр может представлять сумму (валюту), и языковой стандарт пользователя должен также отображать сумму в соответствии с их предпочтениями. Приложение C # может затем отобразить значение с помощью
amount.ToString("C", CultureInfo.GetCultureInfo(userContext.Culture))
Это может иметь решающее значение, так как разные культуры показывают цифры по-разному. В США период (.) И запятая (,) имеют точное обратное значение, как в Нидерландах.
Место расположения
Это очень характерно для DateTime
случаев. Дата и время представляют происшествие в определенный момент времени, но обычно это должно быть передано / представлено пользователю в зависимости от его собственного часового пояса. Пример: DateTime
экземпляр 2016-09-21T23:38:21.399Z
может отображаться как 9/21/2016 5:21 PM
для пользователя в восточном часовом поясе в США. Есть много способов сделать это, но это становится практически невозможным, если экземпляр даты и времени хранится в памяти как строковый тип или в хранилище данных как строковый тип.
Главное правило
Общие 2 правила для приложения следуют, когда дело доходит до преобразования любого примитивного типа в строковое представление, как они
- Принимая входные данные, преобразуйте эти входные данные в правильный тип примитива как можно раньше в программном стеке (обычно на уровне представления)
- При извлечении данных для отображения преобразуйте эти данные в строковое представление как можно позже в программном стеке (опять же, обычно на уровне представления)