我正在读一本书' 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;
但我们也可以采用类似的基于接口的方法进行首次实施。那么第二种方法如何更好呢?
答案 0 :(得分:3)
我认为你获得的只是粒度。如果角色完全分开,那么只为需要模拟的东西编写模拟更容易 - 如果CreditCard
类型都代表信用卡信息并且执行收费,那么你必须模拟一半它的责任,似乎有点尴尬。相反,当你分开类型时,CreditCard
可能只是一个愚蠢的案例类,而Payments
可能是你完全嘲笑的东西。