Dart - Snackbar 服务 - 全局函数与静态 class 函数与单例

Dart - Snackbar service - global function vs static class function vs singleton

我想围绕第三方包 Snackbar(第三方 Snackbar 简称为:Get.snackbar(title, body, snackPosition: SnackPosition.BOTTOM);)创建一个包装器,以便将我的应用程序与包分离并能够轻松地交换另一个 Snackbar 实现。

出于性能原因,我认为它应该是单例。我想理想地称它为 VpSnackBar(title, body);。我找到了如何在 dart 中制作单例(Vp 是我的应用程序前缀,用于识别它是在我的应用程序中制作的):

这里我创建了这个单例

class VpSnackBar {

  VpSnackBar._privateConstructor();

  static final VpSnackBar instance = VpSnackBar._privateConstructor();

  static void show(String title, String body) {
    Get.snackbar(title, body, snackPosition: SnackPosition.BOTTOM);
  }
  
}

我不得不这样称呼它 VpSnackBar.show(title, body);。但是我想我是否应该只用静态方法制作一个普通的 class 来完成它的工作,而无需实例化?实例化有用吗?

另一个选项是具有大写名称的全局函数,因此它的用法类似于 class:

void VpSnackBar(String title, String body) {
  Get.snackbar(title, body, snackPosition: SnackPosition.BOTTOM);
}

这是我唯一知道如何称呼它的方式 VpSnackBar(title, body);。这是我喜欢的称呼方式。但是,全局函数是一种不好的做法吗?我可以在没有全局函数的情况下像 VpSnackBar(title, body); 那样调用它吗?哪种方式是最佳做法?

So that I can be safe against any potential changes to the package

你不会有任何问题。

  1. 如果包所有者决定在不触及其原型的情况下完全更改方法内部结构,您仍然会受到这些更改的影响。

  2. 如果包所有者决定以向后不兼容的方式更改方法的原型,这具有重大更改,您也会受到这些更改的影响。

I figure it should be a singleton for performance reasons.

我看到您在实例化 class 时没有 运行 任何繁重的进程(如 IO),所以我不明白您为什么要关注性能。考虑到,对于每个小部件 build() 调用,它在一秒钟内发生很多次,数百个 classes 被实例化,它们不会影响应用程序的性能。

However, is a global function a bad practice?

完全没有。您的方法的实际问题是将函数的第一个字母大写。这是一种不好的做法,因为它会让正在阅读的人相信您的函数调用实际上是构造函数调用。

Which way is the best practice?

正如我所说,我什至看不出包装小吃店的合理动机。但是撇开这件事不谈,您的每个解决方案对我来说似乎都同样公平(只要您将函数的第一个取消大写)。在这种情况下,您可能想使用您觉得更舒服的那个。