У JavaScript есть хороший объект Date. Он может делать всевозможные интересные вещи, например сообщать текущую дату и время и т. Д. Многие языки имеют аналогичные возможности.

И вы не должны его использовать.

Я имею в виду, что вы не должны использовать его напрямую.

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

Потому что дата и время - это взаимодействие с внешней системой. Из-за того, как языки включают их в базовую функциональность, нам трудно это увидеть, но вы должны рассматривать это так же, как вы просматриваете HTTP-вызов, который списывает средства с кредитной карты. Смогли бы вы получить доступ к объекту XMLHTTPRequest непосредственно из вашего кода и жесткого кода в URL-адресе для списания средств с кредитной карты? Нет. Вы абстрагируете это до его собственной функциональности.

Мы делаем это по двум причинам. Во-первых, код сложный, и мы хотим извлечь его в более простой интерфейс. Это действительно не относится к получению даты и времени. Но вторая причина применима. Причина в том, что извлечение функциональности в другое место позволяет нам быстро тестировать и создавать нашу систему, создавая ложные ситуации.

Давайте рассмотрим простое приложение, которое в среду вечером в 20:00 отправляет вам электронное письмо с напоминанием о том, что нужно вынести мусор. Как вы можете протестировать эту функцию, чтобы убедиться, что она работает? Подождать целую неделю до вечера среды в 8 вечера? Точно нет. Не могли бы вы изменить системную дату / время на своей машине для разработки? Пожалуйста, из любви ко всему доброму, святому и свободному от ошибок, не делайте этого. Возможно, вы можете настроить дату / время триггера и при тестировании продолжать устанавливать его на 1 минуту с этого момента. Даже это не лучшая идея. Для тестирования вам придется постоянно менять настройки в своем хранилище данных разработки.

Вместо этого представьте, что вы закодировали свою систему примерно так (я воспользуюсь псевдокодом):

Игнорируйте мой абстрактный псевдокод, чтобы сделать его более читабельным (даты JavaScript ужасно нечитаемы). Ключевым моментом здесь является объект «myDateClass». Я бы не стал называть это так, но вы поняли. Это не функция Date (). Это другое дело. Этот класс является оболочкой для объекта / функции Date (). Точно так же, как вы обернули бы собственный объект XHR или любую другую функцию, которая обращается к внешней системе. Таким образом, вы можете легко протестировать свою систему, предоставив альтернативную реализацию, которая сделает «сейчас» именно таким, каким вы хотите его видеть.

Есть и другие способы заставить эту работу работать. Вы можете рассматривать IsTimeToSendEmail как абстракцию, которую вы подделываете. Вам не нужно переносить все функции встроенного объекта Date в оболочку. Но что бы вы ни делали, используйте абстракцию.

Это правильный способ использовать текущие функции даты / времени в системе.

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

Удачного кодирования!

Подпишитесь на мою рассылку здесь.

Приходите к нам: thinkster.io | Facebook: @gothinkster | Twitter: @GoThinkster