![](https://techblog.lycorp.co.jp/static/a6a8a3ee98a7050022978fe7c1c79088/7d66e/1718761837610.png)
你好。我的名字是 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
}
在这个数据模型中,LatLon
和 Place
共同的属性(例如 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