1

使用接收对象并在方法内设置该对象的属性而不是返回结果的方法是一件好事吗?

在某些情况下,返回结果需要两种类似的方法,但有一些区别。

从技术上讲,on way 不需要“代码重复”并且会更快地完成工作,但我认为当没有返回结果时代码不清楚。

HTML 分析器示例

void parseLinks(Page page){
    //processing
    page.setLinks(links);
    page.setEmails(emails);
    //page.set...;
}

或者

List<Link> getLinks(SomeParameter parameter){
    //same processing
    return links;
}

List<Email> getEmails(SomeParameter parameter){
    //same processing
    return emails;
}

page.setLinks(getLinks(parameter));
page.setEmails(getEmails(parameter));
//page.set...
4

4 回答 4

3

好的做法是明确区分以某种方式修改域对象的方法和不以任何方式修改它们的方法。当您知道您使用的某些方法不会产生副作用时,在复杂系统中工作会更容易(一般来说,在计算机科学中,所有改变某些对象状态的方法都是非无副作用的)。

将尽可能多的程序逻辑放入函数中,即返回结果且没有明显副作用的操作。将命令(导致修改可观察状态的方法)严格隔离为不返回域信息的非常简单的操作。当适合职责的概念出现时,通过将复杂的逻辑移入 VALUE OBJECTS 来进一步控制副作用。

(领域驱动设计:解决软件核心的复杂性,Eric Evans)

于 2012-04-05T11:16:11.197 回答
1

一旦被调用者完成了一些工作,您是否强烈认为该方法的调用者需要一些信息?

如果是,那么你应该返回一些东西。

*unit testing will be easy if callee returns something*
于 2012-04-05T10:56:24.023 回答
0

对象数据是封装的。在代码中与对象交互的位置无关紧要。

干杯

于 2012-04-05T10:48:30.223 回答
0

您的示例看起来像函数编程,而不是 OOP。parseLinks 应该是 Page Class on 的一个方法,应该在“this”实例上工作,此外-如果您在任何页面上以任何方式执行此操作-我建议在构造函数中执行此操作。完成之后 - getLinks 和 getEmails 看起来像该对象的常规 getter 方法。

这就是我在这个例子中看到的,但这真的取决于你想要做什么。

好的,现在在您为问题添加一些上下文后,我更了解它: 我会像这样实现它 - 在解析方法中我将返回一个的Page 实例(使用克隆或将正确的参数添加到构建新的方法中),并将其字段设置为 1。像这样的东西:

Page parse(String content){
    Page page = new Page()
    //processing
    page.setLinks(getLinks(content));
    page.setEmails(getEmails(content));
    //page.set...;
}
于 2012-04-05T11:04:30.540 回答