首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最优Kotlin的重构

最优Kotlin的重构
EN

Stack Overflow用户
提问于 2019-12-04 09:49:35
回答 3查看 74关注 0票数 0

我有一段验证代码,不认为它符合好的科特林的精神,

在这段代码中,我比较数据类的内容:网络工作者:网络工作者工作者:网络工作者

代码语言:javascript
复制
    if (networker.name != worker.name && networker.name != null) {
        worker.name = networker.name
    }
    if (networker.lastName != worker.lastName && networker.lastName != null) {
        worker.lastName = networker.lastName
    }
    if (networker.phone != worker.phone && networker.phone != null) {
        worker.phone = networker.phone
    }
    if (networker.email != worker.email && networker.email != null) {
        worker.email = networker.email
    }

我如何用更好更优雅的Kotlin代码来改进这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-04 09:54:08

如果你最关心的是优雅,那么你可以这样写。

代码语言:javascript
复制
worker.name = networker.name ?: worker.name
worker.lastName = networker.lastName ?: worker.lastName
worker.phone = networker.phone ?: worker.phone
worker.email = networker.email ?: worker.email

这个结果与您的代码相同(将值从一个网络工作者复制到另一个工作人员,除了空值),但我认为它更好看。

票数 8
EN

Stack Overflow用户

发布于 2019-12-04 09:59:18

因为下面的条件赋值是没有意义的

代码语言:javascript
复制
if (X != Y) {
    Y = X
}

由于没有此检查,赋值的结果将是相同的,因此您可以省略它,并且只能通过.let {}保留空检查。

代码语言:javascript
复制
networker.name?.let { worker.name = it }
networker.lastName?.let { worker.lastName = it }
networker.phone?.let { worker.phone = it }
networker.email?.let { worker.email = it }
票数 2
EN

Stack Overflow用户

发布于 2019-12-04 11:43:02

除了在其他答案中提到的低级改进之外,我还会考虑将这些代码放在哪里。

由于所有这些行都在完成单个任务--从另一个对象中更新--将它们绑定到一个函数中是有意义的;这不仅清楚地关联了它们,而且还允许您给它们一个描述性的名称。

其中最明显的地方是数据类本身;可能是一个名为updateFrom(other: Networker)的方法,它更新了调用对象的对象,这将使调用者清楚地看到对象正在发生变异。

但是,有时您希望将数据类保持为简单的数据持有者,或者对它们没有控制权。在这种情况下,它可能是一个扩展函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59173101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档