关于在哪里填充数据,我有一个进退两难的境地。
以下是计算报价总价的两种方法:
// 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);我问过我的同龄人,并收到了不同的意见。
你对我该走哪条路线有什么建议吗?
发布于 2015-05-10 14:16:03
如果应用德米特定律 (也称为“最少知识原则”)和单一责任原则,则需要编写如下代码:
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = q.getTotalPrice(); //Computation inside it如果计算有点复杂,而且不只是在报价中添加各种项的值,则可以使用单独的方法:
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = PriceHelper.getTotalPrice(q); //Computation inside it两种方法都是相同的可测试性(需要适当的模拟/存根)
如果你仍然感到困惑,那么,问你自己一个问题--“哪种方法给了我很容易理解的代码”--每当我面临这样的困境时,我发现“清洁代码”这本书真的很有用。
发布于 2015-05-11 08:00:19
您正在为数据填充方法QuotationDao.populateItems(quotation);使用糟糕的方法结构。为什么是坏的?
我的建议是有两个不同的猎犬或你所说的道:
quotationDao.getQuotation = function(){
var quotation = {};
// populate quotation
return quotation;
}
itemDao.getItems = function(quotation){
var items = {};
// get items
return items;
}接下来,您可以跟踪Wand关于SRP和Law of Demeter的答案。然而,他的回答仍然打破了Law of Demeter。它指出:
在您当前的实现中,价格计算中最亲密的朋友将仅为项目。他们不应该知道报价。所以不要用
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = q.getTotalPrice(); //Computation inside it
//or
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = PriceHelper.getTotalPrice(q); //Computation inside it相反,请使用:
Quotation q = dao.fetchQuotation(someCondition);
Items i = itemDao.fetchItem(quotation);
totalPrice = i.getTotalPrice(); //Computation inside it
//or
Quotation q = dao.fetchQuotation(someCondition);
Items i = itemDao.fetchItem(quotation);
totalPrice = PriceHelper.getTotalPrice(i); //Computation inside ithttps://stackoverflow.com/questions/30152377
复制相似问题