我对在哪里填充数据感到进退两难。
下面是两种计算报价单总价的方法:
// example in javascript
function computePrice(quotation) {
var totalPrice = 0.00;
var items = quotation.getItems();
for (var i = 0; i < items.length; i++) {
totalPrice += items[i].getPrice();
}
return totalPrice;
}
QuotationDao.populateItems(quotation);
computePrice(quotation);
另一种写法是:
function computePrice(quotation) {
var totalPrice = 0.00;
// Populate items in the quotation from database
QuotationDao.populateItems(quotation);
var items = quotation.getItems();
for (var i = 0; i < items.length; i++) {
totalPrice += items[i].getPrice();
}
return totalPrice;
}
computePrice(quotation);
我问过我的同行并收到了不同的意见。
方法 #1 是正确的,因为代码不应在函数中检索数据,除非该函数纯粹是为了检索目的而创建的。
方法 #1 是正确的,因为它允许进行单元测试。
方法#2是正确的,因为调用该方法之前不需要外部依赖,该方法具有高内聚性。
所有方法都不完整,QuotationDao.populateItems(quotation) 应该像 QuotationDao.getComputePriceData(quotation) 一样在单独的方法中,结果像 computePrice(computePriceData); 一样传递给 computePrice;
您对我应该走哪条路线有什么建议吗?
最佳答案
如果有人申请Law of Demeter ,也称为“最少知识原则”,以及Single Responsibility Principle ,然后有人想写这样的代码:
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = q.getTotalPrice(); //Computation inside it
如果计算比较复杂,不只是将报价单中的各个项目的值相加,那么,可以采用单独的方法:
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = PriceHelper.getTotalPrice(q); //Computation inside it
这两种方法同样可测试(需要适当的模拟/ stub )
如果您仍然感到困惑,那么问自己一个问题 - “哪种方法可以让我编写易于理解的代码” - 当我遇到这种困境时,我发现《整洁代码》这本书非常有用
关于javascript - 在哪里填充数据?内部方法还是外部方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30152377/