为什么将一个类拆分为两个可提高可测试性?

时间:2018-02-01 16:53:41

标签: scala functional-programming

我正在读一本书' Scala中的函数编程'作者:Paul Chiusana。

它给出了一个不纯函数的例子:

class Cafe {
   def buyCoffee(cc: CreditCard, p: Payments): Coffee = {
    val cup = new Coffee()
    p.charge(cc, cup.price)
    cup
   }
}

作者认为cc.charge()调用有副作用,因此代码很难测试。

然后建议采用更好的方法:

;
(function($, win) {
  $.fn.inViewport = function(cb) {
    return this.each(function(i, el) {
      function visPx() {
        var H = $(this).height(),
          r = el.getBoundingClientRect(),
          t = r.top,
          b = r.bottom;
        return cb.call(el, Math.max(0, t > 0 ? H - t : (b < H ? b : H)));
      }
      visPx();
      $(win).on("resize scroll", visPx);
    });
  };
}(jQuery, window));


$(function() { // DOM is now ready
  $(".animateinview").inViewport(function(px) {
    if (px) $(this).addClass("triggeredCSS3");
  });
});

作者认为:&#34;虽然当我们打电话给p.charge(cc,cup.price)时仍会出现副作用,但我们有 至少恢复了一些可测试性。付款可以是一个界面,我们可以写一个模拟 适用于测试的此接口的实现。&#34;

但我们也可以采用类似的基于接口的方法进行首次实施。那么第二种方法如何更好呢?

1 个答案:

答案 0 :(得分:3)

我认为你获得的只是粒度。如果角色完全分开,那么只为需要模拟的东西编写模拟更容易 - 如果CreditCard类型都代表信用卡信息并且执行收费,那么你必须模拟一半它的责任,似乎有点尴尬。相反,当你分开类型时,CreditCard可能只是一个愚蠢的案例类,而Payments可能是你完全嘲笑的东西。