【发布时间】:2012-06-26 14:37:39
【问题描述】:
我有三种可能的设计,我正在尝试确定哪一种更好,以及在哪些情况下它们会更好。所有设计的总体思路是有一个数据对象来存储一些数据,还有一个分析器对象来分析数据。
我需要在这些设计之间做出选择,我最喜欢设计 2。但是,与我一起工作的开发人员正在推动设计 3,我认为这是最糟糕的。对于任何设计,我是否缺少任何优点或缺点?让我知道是否需要澄清。
设计 1
在设计 1 中,DataAnalyzer 有一个在构造期间提供的 Data 对象。当客户端调用dataAnalyzer.analyze()时,数据被分析。在这个设计中,每个对象的职责是明确的; Data 对象只保存数据,DataAnalyzer 对象分析数据。更改存储的数据只会更改 Data 类,添加分析方法类型只会更改 DataAnalyzer 类。这种设计的一个问题是DataAnalyzer对象只能用于构建时传入的Data对象,所以如果数据对象很多,就需要创建很多DataAnalyzer。另一个缺点(从设计 3 中会更清楚)是客户端需要知道两个类,而不仅仅是一个。如果有更多类与 Data 关联,则客户端将必须使用所有这些类。
设计 2
设计 2 与设计 1 非常相似,只是现在 DataAnalyzer 是可重用的(用于不同的数据对象)。客户端仍然需要使用两个类,而不是设计 3 中的一个类。职责仍然非常明确,维护也很容易。
设计3
Design 3 允许客户使用一个对象。客户可以说data.analyze(),但对DataAnalyzer 一无所知。我不确定这是否违反单一责任规则; Data 对象有一个允许分析的接口,但责任实际上委托给了 DataAnalyzer。另一个问题是,无论数据是否需要分析,都会为每个创建的 Data 对象创建一个 DataAnalyzer。现在,如果添加更多功能,很多事情都会改变。如果创建了 DataPrinter 类(假设这比让数据打印数据本身更好),客户端不必担心创建 dataPrinter 对象并调用dataPrinter.printData(),它可以只调用data.print()。但是,通过添加这个类,我不得不改变 Data 的接口。向任何 DataXX 类添加更多方法会导致向 Data 类添加方法。
【问题讨论】:
-
如何让 design2 变得“可重用”?
-
可重复使用,因为一台 DataAnalyzer 可以分析多个 Data 对象。
-
是方法重载还是 Data 对象现在是通用的?
-
我不确定你的意思。本质上,如果我创建了一堆 Data 对象,我可以为每个 Data 对象调用
dataAnalyzer.analyze(data)。在设计 1 中,我必须为每个 Data 对象创建一个新的 DataAnalyzer。 -
不同的数据对象有没有可能有共同的功能?
标签: oop design-patterns uml class-design