库中类型转换的 asX 与 toX 前缀
asX vs toX prefixes for type conversions in libraries
我主要是一名 Android 开发人员,但我想同样的规则也应该适用于标准 Java 和 Kotlin。
选择 as(例如 asLiveData、asStateFlow)或 to(例如 toString)的标准是什么从一种类型转换为另一种类型?
现在是我真正的问题。我做了几个扩展函数,将 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()
怎么样?
我主要是一名 Android 开发人员,但我想同样的规则也应该适用于标准 Java 和 Kotlin。
选择 as(例如 asLiveData、asStateFlow)或 to(例如 toString)的标准是什么从一种类型转换为另一种类型?
现在是我真正的问题。我做了几个扩展函数,将 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()
怎么样?