Дата начала должна быть меньше даты

TL;DR: есть интервалы. Зачем использовать простые даты?

Проблемы

Решения

  1. Создание и использование объекта 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.