【发布时间】:2013-02-18 15:46:39
【问题描述】:
在学习 D3.js 时,我遇到了 blog post,它解释了可重用代码单元背后的主要设计模式。我已经复制了下面的相关代码。下面展示的模式正是它在 D3 代码库和插件中使用的方式 (example)。
我对这段代码的一个问题是它有太多的属性复制粘贴。 JavaScript 作为一种函数式语言,我认为我可以将样板代码重构出来,但我想不出办法来做到这一点。 arguments 和 value 参数很容易传递给通用函数,但我找不到保留对 width 和 height 属性的引用的方法。
function chart() {
var width = 720, // default width
height = 80; // default height
function my() {
// generate chart here, using `width` and `height`
}
my.width = function(value) {
if (!arguments.length) return width;
width = value;
return my;
};
my.height = function(value) {
if (!arguments.length) return height;
height = value;
return my;
};
return my;
}
事实上,这是在实际 D3 代码库中完成的,这让我想知道重构是否可能,但我希望这只是这不是一个高优先级问题的问题(新的贡献者是这样做,因为以前就是这样做的)。
我正在寻找的基本上是将每个访问器的主体替换为:
my.height = function(value) {
return getSet(arguments, value, whatever);
};
调用仍有一些样板,但至少逻辑是集中的,如果需要,可以只在一个地方更新。
【问题讨论】:
-
您到底在寻找什么?听起来你想要 php 的“神奇”getter/setter 之类的东西:一个可以照顾或获取/设置任何属性的函数。是这样吗?
-
@bfavaretto 更新了我的问题以澄清。
-
嗯,你可能需要this之类的东西。
标签: javascript design-patterns d3.js functional-programming refactoring