我有两种方法来编写append函数,它根据布尔值附加两个数组。下面是两个编码范例虽然听起来很自然,但我相信其中一个会提供更多优势。布尔逻辑是应该附加还是应该在代码中尽快完成?
选项1
append(foo1, foo2, boolean) {
if (boolean) {
foo1.append(foo2);
} else {
foo2.append(foo1);
}
}
function (boolean){
append(foo1, foo2, boolean);
}
或 - 选项2
append(foo1, foo2) {
foo1.append(foo2);
}
function (boolean){
if (boolean) {
append(foo1, foo2);
} else {
append(foo2, foo1);
}
}
答案 0 :(得分:2)
我认为这取决于
如果你总是想为你的追加函数提供一个布尔值,我会选择第一个。
但通常我会建议第二个选项,因为它实现了“通用”追加函数。
答案 1 :(得分:0)
为什么不利用重载?
// Used when ordering is unknown or generic append foo2 to foo1
append(foo1, foo2) {
foo1.append(foo2);
}
// Used when order is known
append(foo1, foo2, boolean) {
if (boolean) {
foo1.append(foo2);
} else {
foo2.append(foo1);
}
}
通过这种方式,您可以获得通用函数的灵活性和精度,前提是您了解了附加顺序。
答案 2 :(得分:0)
第二种方法更通用,更干净。 Append应对给定输入执行追加操作。在追加电话之前可以进行检查。
答案 3 :(得分:0)
我会使用选项二,然后只需删除自定义append函数,该函数仅用于包装本机String.append方法 - 即没有理由。因此,您只需要一个函数/方法:
// no need to write an append function which does what String.append already does...
function (boolean)
{
if (boolean) {
foo1.append(foo2);
} else {
foo2.append(foo1);
}
}
答案 4 :(得分:0)
根据您的示例,问问自己是否真的有必要创建一个接受两个append()
实例的新Foo
方法。对我来说,通过调用与append()
类关联的Foo
方法,API更加简单。比较以下用法:
示例1
foo1.append(foo2);
// alternatively
foo2.append(foo1);
示例2
append(foo1, foo2);
// alternatively
append(true);
// or
append(foo1, foo2, true);
在第一个例子中,附加了哪个对象的意图是明确的。在第二个示例中,您必须记录方法,或者必须查看实现以了解发生的情况。
答案 5 :(得分:0)
我选择选项2,因为它是一个更清晰,更直观的实现。
我们应该尝试以一种不言自明的方式设计一个函数的签名(名称+参数),并清楚地表明它的作用。为了达到这样的清晰度,我们应该遵循的一个原则是使功能 DO JUST ONE THING 。即:如果函数返回没有任何副作用的值,则返回值单一用途。如果有任何副作用,请将其设为仅一个副作用。
基于上述推理,选项2显然是赢家。 append(A, B)
具有单一副作用,可以在更广泛的背景下重复使用。 append(boolean)
要求来电者只决定一件事:附加订单。