TL;DR: Use arrays for rapid prototyping, use object for serious business

Проблемы

  • Связь
  • Сокрытие информации
  • Дублирование кода
  • Быстрая ошибка
  • Честность

Решения

  1. Овеществление объектов
  2. Создавайте связные небольшие объекты
  3. Избегайте анемичных объектов и определяйте их связные отношения.

Образец кода

Неправильный

// Array with some raw data, what can go wrong?
val coordinates = arrayOf(1000.0, 2000.0)

Анемичный

data class GeographicCoordinate(
    val longitude: Double,
    val latitude: Double 
)

// An error should be thrown since these values don't exist on Earth
val coordinates = GeographicCoordinate(1000.0, 2000.0)

Утверждено

class GeographicCoordinate(
    val longitude: Double,
    val latitude: Double
) {
    init {
        if (!isValidLatitude(latitude))
            throw InvalidLatitudeException(latitude)
        if (!isValidLongitude(longitude))
            throw InvalidLongitudeException(longitude)
    }

    private fun isValidLatitude(latitude: Double) =
        latitude in -90.0..90.0
    private fun isValidLongitude(longitude: Double) =
        longitude in -180.0..180.0
}

// An error should be thrown since these values don't exist on Earth
val coordinates = GeographicCoordinate(1000.0, 2000.0)

Верно

Степени заслуживают овеществления…

data class Latitude(val degree: Double) {
    init {
        if (degree !in -90.0..90.0)
            throw InvalidLatitudeException(degree)
    }
}

data class Longitude(val degree: Double) {
    init {
        if (degree !in -180.0..180.0)
            throw InvalidLongitudeException(degree)
    }
}

data class GeographicCoordinate(
    val longitude: Longitude,
    val latitude: Latitude
)

// An error should be thrown since these values don't exist on Earth
val coordinates = GeographicCoordinate(
    Longitude(1000.0),
    Latitude(2000.0)
)

Многие люди страдают примитивной одержимостью и считают, что это чрезмерный дизайн. Разработка программного обеспечения — это принятие решений и сравнение компромиссов. Аргумент производительности в настоящее время недействителен, поскольку современные виртуальные машины могут эффективно работать с небольшими недолговечными объектами.

Заключение

При создании объектов мы не должны думать о них как о данных. Это распространенное заблуждение.

Мы должны оставаться верными нашей Биекции и открывать объекты реального мира.

Большинство ассоциативных массивов связаны и представляют объекты реального мира, и мы должны обращаться с ними как с объектами первого класса.

Будьте в курсе моих последних мыслей и идей, подписавшись на мою рассылку новостей. Свяжитесь со мной в LinkedIn или Twitter. Оставайтесь на связи и продолжайте общение!

Кредиты

Первоначально опубликовано на https://yonatankarp.com.