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

Posted

技术标签:

【中文标题】初始化日期时间值同时避免代码重复的最佳实践【英文标题】:Best practices on initializing datetime values while avoiding code duplication 【发布时间】:2019-03-11 05:48:10 【问题描述】:

我有许多调度任务函数,它们依赖于我项目中日期时间值的许多便利变量,例如想象一下这样的 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。阿罗拉

【问题讨论】:

如何创建一个自定义对象并将这些变量公开为类变量,然后在构造函数中初始化它们?类似 var convenienceVariables = new ConvenienceVariables();便利变量.昨天,便利变量.startOfToday,等等等等。 为什么不创建 thunk 并将便利变量转换为便利函数?让今天 = ()=>moment(), 昨天 =()=> moment().subtract(1, 'days'), startOfToday = ()=> moment(today()).startOf("day") 和等等? 是的,这就是我在下面的 stackblitz 参考中所做的。接受的答案建议这样做等等。 【参考方案1】:

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

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

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

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

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

如果您不喜欢传递 strings(尽管 moment 经常这样做),您可以创建一个 frozen class in ES6 来模拟 enumeration 并传递/使用它。

您还可以创建一个具有这些的单例类并使用它...主要思想是有一种方法可以返回日期...factory pattern。

【讨论】:

谢谢!在你写它的时候,我在这里玩了一个类似的解决方案:stackblitz.com/edit/js-krggdi。因为我想避免在每个可能只需要几个日期的函数中一遍又一遍地重新初始化所有 10 个日期,所以我朝着创建仅在调用时返回所需值的便利函数的方向前进。您的解决方案非常干净,并且也依赖于功能,所以很乐意接受它! 太棒了!很高兴它有帮助。是的,有很多方法可以实现这一目标,所以一切都是最适合你的。

以上是关于初始化日期时间值同时避免代码重复的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

如何避免重复代码初始化 hashmap 的 hashmap?

NSDate 创建没有时间元素的日期的最佳实践

查找两个日期之间的日期(最佳实践)

当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳实践

bson.json_util 日期时间编码和解码最佳实践

查询日期:“dateval LIKE '2014-01-01%'”是最佳实践吗? [复制]