我的新工作是使用Google Closure库编写面向组件的JavaScript.我喜欢活动,组件,服务和模块.但由于需要编写混乱使用命名空间的代码,因此工作非常苛刻.以下代码是典型的:
goog.provide(com.bin.slash.dot.closure.widget.SuperForm);
goog.require(com.bin.slash.dot.closure.widget.Avatar);
// ... ten require calls more...
com.bin.slash.dot.closure.widget.SuperForm = function() {
goog.base(this);
this._internal = new com.bin.slash.dot.closure.widget.Avatar(
com.bin.slash.dot.closure.widget.Avatar.SRC_PATH);
};
Run Code Online (Sandbox Code Playgroud)
我无法相信这是真的.我并不害怕输入所有这些,但我只是觉得逻辑在这个符号地狱中消失了.扫描非常困难,因此需要更多时间来了解正在发生的事情.我的老板说,不鼓励写下以下快捷方式:
var SF = com.bin.slash.dot.closure.widget.SuperForm = function(){};
Run Code Online (Sandbox Code Playgroud)
因为所有这些都将在编译后绑定到全局命名空间(窗口),因此它们可能会干扰其他内容.
问题是如何避免这个符号地狱?
更新:我改进了我的开发人员流程,解决了地狱的问题.现在我编写了甜蜜的JavaScript,然后由Grunt使用sweet.js宏自动编译:
// For each file I define three macros which are replaced
// in the compile time with hell of a long paths.
macro dir { rule { $x } => { my.very.very.long.namespace $x } }
macro class { rule { $x } => { dir.NameOfMyClass $x } }
macro …Run Code Online (Sandbox Code Playgroud) 运行到ZonedDateTime格式化的问题。它将 2020 年 12 月的结束日期格式化为 2021 年的日期。Java 片段
ZonedDateTime z1 = ZonedDateTime.of(LocalDateTime.of(2020, 12, 31, 0, 0), ZoneId.of("America/New_York"));
z1.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))
// yields "2021-12-31"
Run Code Online (Sandbox Code Playgroud)
12 月 28 日、29 日、30 日也是如此。不同时区的结果相同。重复 2019 年 12 月 30 日(格式为 2020-12-30)。
原始 Clojure 片段
(let [zdt (ZonedDateTime/of (LocalDateTime/of 2020 12 31 0 0) (ZoneId/of "America/New_York"))
f (DateTimeFormatter/ofPattern "YYYY-MM-dd")]
(.format zdt f))
; => "2021-12-31"
Run Code Online (Sandbox Code Playgroud)
我能够重现: