首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪里填充数据?内法还是外法?

在哪里填充数据?内法还是外法?
EN

Stack Overflow用户
提问于 2015-05-10 14:08:29
回答 2查看 59关注 0票数 1

关于在哪里填充数据,我有一个进退两难的境地。

以下是计算报价总价的两种方法:

代码语言:javascript
复制
// 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);

另一种写作方式是:

代码语言:javascript
复制
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. 方法1是正确的,因为它允许单元测试。
  3. 方法2是正确的,因为在调用该方法之前不需要任何外部依赖,该方法具有很高的内聚性。
  4. 所有方法都是不完整的,QuotationDao.populateItems(引号)应该在一个单独的方法中,如QuotationDao.getComputePriceData(引号),其结果传递给computePrice类computePrice(computePriceData);

你对我该走哪条路线有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-10 14:16:03

如果应用德米特定律 (也称为“最少知识原则”)和单一责任原则,则需要编写如下代码:

代码语言:javascript
复制
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = q.getTotalPrice(); //Computation inside it

如果计算有点复杂,而且不只是在报价中添加各种项的值,则可以使用单独的方法:

代码语言:javascript
复制
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = PriceHelper.getTotalPrice(q); //Computation inside it

两种方法都是相同的可测试性(需要适当的模拟/存根)

如果你仍然感到困惑,那么,问你自己一个问题--“哪种方法给了我很容易理解的代码”--每当我面临这样的困境时,我发现“清洁代码”这本书真的很有用。

票数 1
EN

Stack Overflow用户

发布于 2015-05-11 08:00:19

您正在为数据填充方法QuotationDao.populateItems(quotation);使用糟糕的方法结构。为什么是坏的?

  1. 它破坏了不变性。对于一个简单的方法,如填充数据或生成数据,接受输入和返回结果将是更有益的,因为它可以被重新调用,结果将是一致的。
  2. 这种方法不是自我记录的。您不知道数据类型引号是什么,事先需要对引号执行什么,填充什么,填充参数是什么。
  3. 它不能在静态类型的语言中工作,比如java/C#。它们需要有特定的对象类型作为参数传递。

我的建议是有两个不同的猎犬或你所说的道:

代码语言:javascript
复制
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。它指出:

  • 每个单位对其他单位的知识应当有限:只有与当前单位“密切”相关的单位。
  • 每个单位只应与其朋友交谈,不要与陌生人交谈。
  • 只和你的直属朋友谈谈。

在您当前的实现中,价格计算中最亲密的朋友将仅为项目。他们不应该知道报价。所以不要用

代码语言:javascript
复制
Quotation q = dao.fetchQuotation(someCondition);
totalPrice = q.getTotalPrice(); //Computation inside it

//or

Quotation q = dao.fetchQuotation(someCondition);
totalPrice = PriceHelper.getTotalPrice(q); //Computation inside it

相反,请使用:

代码语言:javascript
复制
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 it
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30152377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档