用于库中类型转换的 asX 与 toX 前缀

问题描述

我主要是一名 Android 开发人员,但我想同样的规则也应该适用于标准 Java 和 Kotlin。

  1. 选择as(例如asLiveData、asstateFlow)或to(例如toString)从一种类型转换为另一种类型的标准是什么?

  2. 现在是我真正的问题。我制作了几个扩展函数,可以将 ByteArray 转换为十六进制字符串,反之亦然。什么命名法更有意义?

String.toByteArrayFromHex vs String.asByteArrayFromHex

ByteArray.toHexString vs ByteArray.asHexString

解决方法

我不认为 Kotlin 标准库中的这些命名约定是正式记录的,但我注意到一些相当常见的模式。例如:

  • to<Type>()将对象转换为所需的类型,并返回它。 (原版没有变化,独立于新版。)toString() 当然是最常见的例子。

  • as<Something>() — 返回对象的视图。 (不会立即更改原始状态;但是,稍后对对象状态的更改将反映在视图中,如果合适,反之亦然。)例如:asReversed()

  • <verb>() — 就地改变对象。 (通常不返回任何内容。)例如:reverse()

  • <verb>ed() — 返回对象的变异副本。 (原件不变,独立于新件。)例如:reversed()

  • <xxx>OrNull() — 表示如果没有要返回的有效值,方法将返回 null(而不是抛出异常或返回其他一些默认值)。

与所有约定一样,没有什么会强迫您使用这些命名模式——但如果您这样做了,它们将更自然地融入现有代码中,人们会发现它们使用起来更直观。

(并非所有库方法都遵循这些约定;例如,map()filter() 是动词,但不会改变它们的接收器。然而,它们早于 Kotlin 出现,因此可以理解他们坚持使用众所周知的现有名称。而且 JetBrains 似乎更强烈地遵守这些约定;例如,在 Kotlin 1.4 中,他们弃用了 max() 函数而支持新的 maxOrNull()。)


在您的示例中,ByteArray.toHexString() 将是一个非常好的名称,因为它将数组转换为新类型,而不与原始类型保持任何连接。我想任何人看到这个名字都会立即知道它的作用。 (无论如何,或多或少;参数或文档必须指定详细信息,例如使用的分隔符(如果有)以及使用大写还是小写。)

同样,String.toByteArrayFromHex() 比替代方案更清晰,但我不确定它读起来是否好。 String.hexToByteArray()怎么样?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...