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

asX vs toX prefixes for type conversions in libraries

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

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

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

String.toByteArrayFromHex 对比 String.asByteArrayFromHex

ByteArray.toHexString 对比 ByteArray.asHexString

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

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

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

  • <verb>()就地改变对象。 (通常不会 return 任何东西。)例如:reverse().

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

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

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

(并非所有库方法都遵循这些约定;例如,map()filter() 是动词,但不会改变它们的接收者。但是,它们早于 Kotlin,所以它是他们坚持使用众所周知的现有名称是可以理解的。JetBrains 似乎更严格地遵守这些约定;例如,在 Kotlin 1.4 中,他们弃用了 max() function in favour of the new maxOrNull()。)


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

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