为了活动小家电-kotlin清洁代码(二)

96 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的21天,点击查看活动详情

为了活动小家电,接着上篇搞!

  1. 警告:直接使用参数命名,避免频繁使用。

“不洁”

users.filter{ it.job == Job.Developer }
    .map{ it.birthDate.dayOfMonth }
    .filter{ it <= 10 }
    .min()

“干净的”

users.filter{ user -> user.job == Job.Developer }
    .map{ developer -> developer.birthDate.dayOfMonth }
    .filter { birthDay -> birthDay <= 10 }
    .min()

此外,我们可以说,使用 Kotlin 的次数越多,不变性越受欢迎,原因如下。

  • 更喜欢使用 val 而不是 var
  • 更喜欢只读属性而不是可变属性
  • 喜欢只读集合而不是可变集合
  • 更喜欢使用提供 copy() 的数据类

功能

在 Kotlin 中使用函数的规则是什么?

  • 规则一:函数必须很小。
  • 第二条规则:函数必须小于那个。

你为什么说长功能不好?
因为长函数

  • 难以测试
  • 阅读困难
  • 难以重复使用
  • 造成冗余
  • 有很多改变的理由(因为有很多代码)
  • 难以调试

因为它确实

此外,在 Kotlin 中编写函数时还有其他规则:

  • 许多参数被分组到对象或使用列表中(前提是它们属于同一类型)。
  • 函数不得有副作用(副作用是 GRADA)
  • 函数的最大缩进级别为 2 深度。
  • if/else/while 语句包含单行块
  • 长的描述性名称比简短的神秘名称更好。
  • 您需要更改代码以使其更易于阅读和重建。
  • 应用命令查询分离原则。*

*通常称为命令查询分离(CQS),它是命令式计算机编程的一个原则。每个方法都应该是执行操作的命令或将数据返回给调用者的查询,但不能同时是两者。

查询:返回结果并且不改变系统的可观察状态(无副作用)。
命令:更改系统状态,但不返回值。

例子

  1. 使用 when 子句时

“不洁”

fun parseProduct(response: Response?): Product? {
    if (response == null) {
        throw ClientException("Response is null")
    }
    val code: Int = response.code()
    if (code == 200 || code == 201) {
        return mapToDTO(response.body())
    }
    if (code >= 400 && code <= 499) {
        throw ClientException("Invalid request")
    }
    if (code >= 500 && code <= 599) {
        throw ClientException("Server error")
    }
    throw ClientException("Error $code")
}

“干净的”

fun parseProduct(response: Response?) = when (response?.code()){
    null -> throw ClientException("Response is null")
    200, 201 -> mapToDTO(response.body())
    in 400..499 -> throw ClientException("Invalid request")
    in 500..599 -> throw ClientException("Server error")
    else -> throw ClientException("Error ${response.code()}")
}

为了活动小家电,下篇继续搞!