1

这是一个设计问题。我正在尝试在两种实现之间做出决定。

为了正确解释这一点,我需要一个例子。因此,为了举例:

我有一个类可以生成关于特定日期的某些股票市场价值的报告。我创建一个StockMarketReportGenerator对象,将今天的日期传递给它,它会根据今天的市场价值生成一份报告。

StockMarketReportGenerator有一个”StockMarketData对象。该对象的StockMarketData目的是包含存储在数据库中的表(可能称为 StockMarket :))中的所有股票市场值,以及从表数据计算的一些进一步的值。它具有与数据库连接、检索数据、进行必要计算并将最终值存储在对象的成员变量中的私有方法。(然后它具有公开这些值的 getter 方法,但没有 setter 方法。)StockMarketData该类基本上是股票市场数据值的“持有者”。我有一个名为“calculateStockMarketData()" 调用所有这些私有辅助方法并设置对象。(我知道所有这些处理都可以通过 Hibernate 等框架更轻松地处理;但决定手动进行,因为它非常小,有点临时项目,不值得设置。)

我的问题是——在我的ReportGenerator课堂上,我只需要该StockMarketData对象即可访问它的属性/成员变量——后处理和后计算。这意味着真的,我想让对象预先填充数据。所以我保持calculateStockMarketData方法私有,并从StockMarketData 构造函数中自动调用它。但是我对在构造函数中完成所有处理然后没有任何公共方法感到有些不安。这是设计缺陷吗?或者这真的是最合乎逻辑的方式吗?基本上,以下两种实现中哪一种更好?

1)(我当前的实现)将中心calculateStockMarketData()方法设为私有并从StockMarketData方法构造函数中调用它(传递今天的日期),这样每当你有一个StockMarketData对象时,它就已经被填充了。所以ReportGenerator在我开始使用对象属性之前,我需要的只是这行:

StockMarketData myData = new StockMarketData(someDate);

2) 将中心calculateStockMarketData()方法公开,以便设置StockMarketData对象需要显式调用该方法。所以从ReportGenerator课堂上我会编码:

StockMarketData myData = new StockMarketData(someDate);
myData.calculateStockMarketData();

第一个给我的印象是更好的设计,特别是因为在初始化之前不可能使用对象属性。但我也不确定关于从构造函数执行大量代码的标准......我应该选择哪个?

4

4 回答 4

7

Martin Fowler 写了一篇关于依赖注入(Constructor vs. Setter injection)的好文章。他的建议是“尽可能在构建时创建有效的对象”。

IMO,如果可能,最好构造有效的对象,因为它可以更容易地阅读/观察代码的行为,因为您可以假设对象构造正确,并且与未正确填充的对象相关的错误更少. 但是,setter 与构造函数注入的问题与您所询问的不同,这是在哪里执行业务逻辑的问题。我认为最好使用构造函数来创建一个有效的对象,然后在另一个公共方法(你的#2)中执行实际的业务逻辑,这样对象的构建就可以在与实际业务逻辑不同的时间发生。

于 2010-03-10T18:23:20.397 回答
1

我会选择 2 号,特别是如果有可能向类中添加不依赖该数据的方法。

另一方面,如果您认为类在没有填充数据的情况下处于无效状态,则应该在构造时进行。

于 2010-03-10T18:19:41.633 回答
1

我总是在构建后显式加载。

从构造函数调用数据库可能会导致调试困难、代码更脆弱、不灵活,并且如果您对对象的使用发生变化,还会导致性能问题。

于 2010-03-10T18:21:32.863 回答
0

一个好的做法是不要在构造函数中执行大量代码。

于 2010-03-10T18:18:06.147 回答