问题描述
我主要是一名 Android 开发人员,但我想同样的规则也应该适用于标准 Java 和 Kotlin。
-
选择as(例如asLiveData、asstateFlow)或to(例如toString)从一种类型转换为另一种类型的标准是什么?
-
现在是我真正的问题。我制作了几个扩展函数,可以将 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()
怎么样?