提高代码质量的技巧:第31部分同锅的属性

你好。我的名字是 Ishikawa,我正在为通讯应用“LINE”开发移动客户端。

本文是我们每周四发布的“周报”系列的第 31 篇。 周报请见第一篇文章。

相同锅属性

假设您正在实现一项使用“纬度/经度”或“位置 ID”注册位置信息的服务。该位置信息的数据模型是 GeoLocationPinModel 假设它被表示为一个类。在这种情况下,通过使用直接求和类型,您可以安全地保证“位置信息始终表示为纬度/经度或位置 ID”。 在 Kotlin 和 Java 中,直接求和类型是 sealed class 或者 sealed interface 这可以通过以下方式实现 (sealed 为了获得 的子类的属性,需要进行向下转型,但这种向下转型通常是没问题的。另一方面 sealed 最好尽可能避免贬低除此之外的任何事情。 )

以下 GeoLocationPinModel 牙齿 sealed interface ,但属性的结构不合适。

sealed interface GeoLocationPinModel {
    data class LatLon(
        val userId: ULong,
        val timestampInMillis: Long,
        val comment: String,
        val latitudeE6: Long,
        val longitudeE6: Long,
    ) : GeoLocationPinModel

    data class Place(
        val userId: ULong,
        val timestampInMillis: Long,
        val comment: String,
        val placeId: ULong,
    ) : GeoLocationPinModel
}

在这个数据模型中,LatLonPlace 共同的属性(例如 userId)也需要沮丧。结果,检索公共属性的代码变得复杂。

fun caller(pinModel: GeoLocationPinModel) {
    val userId: ULong
    val creationTimestampInMillis: Long

    when (pinModel) {
        is GeoLocationPinModel.LatLon -> {
            userId = pinModel.userId
            creationTimestampInMillis = pinModel.timestampInMillis
        }
        is GeoLocationPinModel.Place -> {
            userId = pinModel.userId
            creationTimestampInMillis = pinModel.timestampInMillis
        }
    }

    ... // snip
}

因此,将公共属性提取到父类中,如下所示。

1719773645
#提高代码质量的技巧第31部分同锅的属性
2024-06-27 02:00:00

Leave a Reply

Your email address will not be published. Required fields are marked *

近期新闻​

编辑精选​