我正在考虑几种不同的编写实用类/函数的方法。我所说的实用是指在项目中许多地方重用的代码的一部分。例如,一组用于日期和时间处理的格式化函数。
我有Java背景,有写
class UtilsXyz {
public static doSth(){...};
public static doSthElse(){...};
}
我发现很难进行单元测试,因为它们的 * static * 性质。另一种方法是在这里和那里注入没有 * static * 成员的实用程序类。
在 dart 游戏中,你可以使用这两种态度,但我发现其他的技巧更惯用:
1.混合素
在许多articles中被广泛使用和推荐的实用函数。但是我发现它们的本质是解决臭名昭著的钻石问题,而不是实用类。而且它们不是很可读。虽然我可以想象更集中的实用函数,只适合小部件,或只适合演示者,只适合用例等。它们看起来很自然。
1.可拓函数
编写'2023-01-29'.formatNicely()
是很自然的,但是我想对一些实用函数进行单元测试,而您不能测试扩展函数,因为它们是 * static * 的。
1.全局函数
最后,到目前为止,我发现它们是提供实用程序的最自然的方式(就惯用的Dart而言)。我可以对它们进行单元测试,它们可广泛访问,而且看起来不像mixins
那样奇怪。我还可以使用as
关键字导入它们,以便为阅读器提供当前使用的函数实际来自的一些输入。
是否有人拥有公共事业最佳实践的经验并愿意分享?我是否遗漏了什么?
1条答案
按热度按时间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关于支持静态扩展成员。
所以,我认为扩展也是可测试的。
要测试扩展方法,您有两个选项:
要测试全局函数,只需导入并测试即可。
我认为全局函数非常简单:
这就是为什么我更喜欢这种方法来处理不附加到任何其他类的实用函数。
而且,如果您正在编写库/包,注解
@visibleForTesting
可能会对您有所帮助(此注解来自https://pub.dev/packages/meta)。