flutter 如何编写Dart惯用的实用函数或类?

kh212irz  于 2023-02-09  发布在  Flutter
关注(0)|答案(1)|浏览(108)

我正在考虑几种不同的编写实用类/函数的方法。我所说的实用是指在项目中许多地方重用的代码的一部分。例如,一组用于日期和时间处理的格式化函数。
我有Java背景,有写

class UtilsXyz {
  public static doSth(){...};
  public static doSthElse(){...};
}

我发现很难进行单元测试,因为它们的 * static * 性质。另一种方法是在这里和那里注入没有 * static * 成员的实用程序类。
在 dart 游戏中,你可以使用这两种态度,但我发现其他的技巧更惯用:
1.混合素
在许多articles中被广泛使用和推荐的实用函数。但是我发现它们的本质是解决臭名昭著的钻石问题,而不是实用类。而且它们不是很可读。虽然我可以想象更集中的实用函数,只适合小部件,或只适合演示者,只适合用例等。它们看起来很自然。
1.可拓函数
编写'2023-01-29'.formatNicely()是很自然的,但是我想对一些实用函数进行单元测试,而您不能测试扩展函数,因为它们是 * static * 的。
1.全局函数
最后,到目前为止,我发现它们是提供实用程序的最自然的方式(就惯用的Dart而言)。我可以对它们进行单元测试,它们可广泛访问,而且看起来不像mixins那样奇怪。我还可以使用as关键字导入它们,以便为阅读器提供当前使用的函数实际来自的一些输入。
是否有人拥有公共事业最佳实践的经验并愿意分享?我是否遗漏了什么?

mwg9r5ms

mwg9r5ms1#

要以惯用的方式为Dart编写实用函数,可以选择 * 扩展方法***或***全局函数 *。
你可以看到他们有一个linter规则引用这个问题:

    • 避免**定义只包含静态成员的类。

创建类的唯一目的是提供实用程序或静态方法是不被鼓励的。Dart允许函数存在于类之外 * 正是因为这个原因*。
https://dart-lang.github.io/linter/lints/avoid_classes_with_only_static_members.html.

    • 扩展方法。**

但是我想对一些实用函数进行单元测试,你不能测试扩展函数,因为它们是静态的。
我没有找到任何资源指出扩展方法是静态的,无论是在StackOverflow还是Dart extension documentation中。尽管扩展可以有static methods themselves。此外,有一个open issue关于支持静态扩展成员。
所以,我认为扩展也是可测试的。
要测试扩展方法,您有两个选项:

  • 导入扩展名并在测试中使用扩展语法。
  • 编写一个等价的全局实用函数来测试它,并让扩展方法调用这个全局函数(我不推荐这样做,因为如果有人更改了扩展方法,测试将无法捕获)。
    • EDIT**:正如jamesdlin提到的,扩展本身可以被测试但是不能被模仿,因为它们需要在编译时被解析。
    • 全局函数**。

要测试全局函数,只需导入并测试即可。
我认为全局函数非常简单:

  • 这是编写实用函数的最简单、最惯用的方法,当有人读你的代码(比如mixin)时,即使是Dart初学者,也不会触发任何"wtf"标志。
  • 这也利用了 * Dart顶级函数 * 功能。

这就是为什么我更喜欢这种方法来处理不附加到任何其他类的实用函数。
而且,如果您正在编写库/包,注解@visibleForTesting可能会对您有所帮助(此注解来自https://pub.dev/packages/meta)。

相关问题