Дата начала должна быть меньше даты
TL;DR: есть интервалы. Зачем использовать простые даты?
Проблемы
- Отсутствует абстракция
- Дублированный код
- Не принудительные инварианты
- Первобытная одержимость
- Ошибка биекция
- Нарушение принципа Fail Fast
Решения
- Создание и использование объекта Interval
Контекст
Ограничение Дата начала должна быть меньше даты окончания означает, что начальная дата определенного интервала должна быть раньше конечной даты того же интервала.
Дата начала должна быть датой, которая наступает во времени раньше, чем дата завершения.
Это ограничение введено для того, чтобы гарантировать, что определяемый интервал имеет логический смысл и что даты, используемые для его определения, расположены в правильном порядке.
Мы все это знаем. Но мы пропускаем создание объекта Interval.
Вы бы создали дату как пару из 3 целых чисел? Конечно, нет.
Это тоже самое.
Образец кода
Неправильный
val from = LocalDate.of(2018, 12, 9) val to = LocalDate.of(2022, 12, 22) val elapsed = elapsedDays(from, to) fun elapsedDays(fromDate: LocalDate, toDate: LocalDate): Long { return ChronoUnit.DAYS.between(fromDate, toDate) } // We need to apply this short function // Or the inline version many times in our code // We don't check from Date to be less than toDate // We can make accounting numbers with a negative number
Верно
// We reify the Interval Concept data class Interval(val fromDate: LocalDate, val toDate: LocalDate) { init { if (fromDate >= toDate) { throw IllegalArgumentException("From date must be before to date") } // Of course the Interval must be immutable // By using the keyword 'data' } fun elapsedDays(): Long { return ChronoUnit.DAYS.between(fromDate, toDate) } } val from = LocalDate.of(2018, 12, 9) val to = LocalDate.of(2002, 12, 22) val interval = Interval(from, to) // Invalid
Обнаружение
[Х] Руководство
Это примитивный запах одержимости.
Это связано с тем, как мы моделируем вещи.
Теги
- Примитивный
Заключение
Если вы обнаружите программное обеспечение с отсутствующими простыми проверками, оно, безусловно, нуждается в овеществлении.
связи
Больше информации
Отказ от ответственности
Code Smells — это всего лишь мое мнение.
Кредиты
Фото автора Towfiqu barbhuiya на Unsplash
В любой конкретный момент времени функции, предоставляемые нашими языками программирования, отражают наше понимание программного обеспечения и программирования.
Р. Э. Фэрли
Эта статья является частью серии CodeSmell.