【问题标题】:asX vs toX prefixes for type conversions in libraries用于库中类型转换的 asX 与 toX 前缀
【发布时间】:2021-04-16 22:19:50
【问题描述】:

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

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

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

String.toByteArrayFromHex 与 String.asByteArrayFromHex

ByteArray.toHexString 与 ByteArray.asHexString

【问题讨论】:

    标签: java kotlin android-library


    【解决方案1】:

    我认为 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()呢?

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多