首页 > 解决方案 > 初始化日期时间值同时避免代码重复的最佳实践

问题描述

我有许多调度任务函数,它们依赖于我项目中日期时间值的许多便利变量,例如想象 10 + 行这样的:

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

我不能将这种初始化代码放在 myCode.js 文件的顶部,因为它会导致错误——myCode.js 中的函数将引用过时的日期时间。例如,今天总​​是指节点服务器启动的日期时间。

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

有没有更清洁的方法来做到这一点?

我正在考虑的选项:

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

b)内联 moment.js 日期时间值并完全摆脱便利变量(有效但使代码更难阅读)。

提示赞赏,

谢谢,

-S。阿罗拉

标签: javascriptmomentjs

解决方案


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

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

getDate('yesterday')
getDate('endOfToday')

这样,您尝试执行的操作非常易读,并且在该 utils 模块中,您可以简单地使用一个 switch 语句,该语句基于返回正确日期输出的字符串:

switch(dateString) {
  case 'today':
     return moment()
  case 'yesterday':
     return moment().subtract(1, 'days')
...
}

如果你不喜欢传递(虽然 moment 经常这样做),你可以在 ES6strings中创建一个冻结类来模拟枚举并传递/使用它。

您还可以创建一个具有这些的单例类并使用它……主要思想是有一种方法可以返回日期……工厂模式


推荐阅读