【问题标题】:Code smell - passing boolean control argument to function代码气味 - 将布尔控制参数传递给函数
【发布时间】:2016-05-02 18:27:23
【问题描述】:

下面是代码片段,有一些我不喜欢的地方:

function insert(el, child, before){
  if ( before ) {
    el.insertBefore(child, el.childNodes[0]);
  } else {
    el.appendChild(child);
  }
}

为什么不使用insertBeforeinsertAfter 等两个单独的方法呢?这种方法和其他方法的优缺点是什么?

更新:

我得到了这个很好的article 解释我想要什么。

【问题讨论】:

  • 这个问题的目的是什么?你有一个你不喜欢的代码??改变它!
  • @Amit 这个问题的目的是编写更好的代码。更好的定义是易于理解和测试。我认为问题与标签一起正确地阐明了意图。
  • 这个函数的目的是什么?例如,您为什么不简单地使用 appendChild?这是某个库的一部分吗?
  • @Thomas 是的,它是一个公共库 here

标签: javascript dom refactoring readability


【解决方案1】:

此函数的全部目的是避免在调用该函数的所有地方都放置if 语句。所以如果你有很多地方看起来像:

if (something) {
    foo.insertBefore(bar, foo.childNodes[0]));
} else {
    foo.appendChild(bar);
}

您可以将它们全部简化为:

insert(foo, bar, something);

用你的两种方法,它会变成:

if (something) {
    insertBefore(foo, bar);
} else {
    insertAfter(foo, bar);
}

这比原版好不了多少。

【讨论】:

  • 但是它需要客户端代码记住每次调用该方法时都要传递该标志,而且我会知道我是否必须在客户端代码之前或之后插入,如果条件分散在各处,则不需要我的代码。
  • 只有在需要动态确定选择时才使用此方法。这就像为什么 jQuery 同时拥有 hideshowtoggletoggle 在动态时使用,hide/show 在先验已知时使用。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 2015-12-26
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多