关于javascript:初始化日期时间值的最佳实践,同时避免代码重复

Best practices on initializing datetime values while avoiding code duplication

在我的项目中,我有许多调度任务函数依赖于许多日期时间值的方便变量,例如,假设10+行如下:

1
2
3
4
let today = moment(),
  yesterday = moment().subtract(1, 'days'),
  startOfToday = moment(today).startOf("day"),
  endOfToday = moment(today).endOf("day");

我不能把这种初始化代码放在mycode.js文件的顶部,因为它会导致一个bug——mycode.js中的函数将引用过时的日期时间。例如,今天将始终引用节点服务器启动的日期时间。

目前,我正在初始化每个函数中的日期,但这会导致代码重复。

有更干净的方法吗?

我正在考虑的选项:

a)创建一个初始化所有常用日期的函数,并在函数顶部调用该函数。

b)内联moment.js日期时间值,并完全去掉方便变量(有效,但使代码更难读取)。

感谢小费,

谢谢,

- S. Arora


这样做的一种方法是创建一个包含所有这些方便方法的util模块,然后您可以将这些方法导入到您需要的任何文件中。

由于您的输出总是日期,因此您可以使用一个接受字符串的getDate方法:

1
2
getDate('yesterday')
getDate('endOfToday')

这样,您就可以很容易地阅读您要做的事情,在这个utils模块中,您可以简单地使用一个switch语句,它基于您返回正确日期输出的字符串:

1
2
3
4
5
6
7
switch(dateString) {
  case 'today':
     return moment()
  case 'yesterday':
     return moment().subtract(1, 'days')
...
}

如果您不喜欢传递strings(尽管moment做了很多),您可以在es6中创建一个冻结类来模拟枚举并传递/使用它。

您还可以创建一个singleton类,其中包含这些类并使用它…主要的想法是有一个方法来返回你的日期…工厂模式。