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
你不会有任何问题。
如果包所有者决定在不触及其原型的情况下完全更改方法内部结构,您仍然会受到这些更改的影响。
如果包所有者决定以向后不兼容的方式更改方法的原型,这具有重大更改,您也会受到这些更改的影响。
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?
正如我所说,我什至看不出包装小吃店的合理动机。但是撇开这件事不谈,您的每个解决方案对我来说似乎都同样公平(只要您将函数的第一个取消大写)。在这种情况下,您可能想使用您觉得更舒服的那个。
我想围绕第三方包 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
你不会有任何问题。
如果包所有者决定在不触及其原型的情况下完全更改方法内部结构,您仍然会受到这些更改的影响。
如果包所有者决定以向后不兼容的方式更改方法的原型,这具有重大更改,您也会受到这些更改的影响。
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?
正如我所说,我什至看不出包装小吃店的合理动机。但是撇开这件事不谈,您的每个解决方案对我来说似乎都同样公平(只要您将函数的第一个取消大写)。在这种情况下,您可能想使用您觉得更舒服的那个。