方法应该放在哪里?

3
我有一些带有加载、保存、更新数据方法的数据对象。然后我有用于更复杂操作此数据的对象,为此它们需要从数据对象中获取详细信息。
因此,我开始为数据对象添加方法以回答操纵对象需要了解的特定问题。操纵对象仅具有严格与操作或某些功能相关的方法,而有关数据对象的信息则由其进行详细说明。操纵对象提问,被操纵对象回答。这是我最初想象的方式。然后我意识到它们也可以成为操纵对象或扩展方法的方法。
我感觉数据对象开始有太多与特定功能相关的方法,而且还有更多要来。由于这些功能主要由操纵对象管理,因此它们可以在它们之间移动和分配。问题是其中一些方法被不同的操纵对象使用,而操纵对象已经充满了与操作特定相关的方法。因此,另一个选项是将它们实现为静态扩展方法,并将它们放置在执行此类工作的命名空间中(因此它们仅在工作区域中可见,但如果需要,其他对象可以调用它们)。
问题是应该把这些方法放在哪里:
- 给出从数据对象信息中详细说明的公共信息,没有任何操作。 - 仅供一个或多个其他对象使用的特定功能(主要是操作,但也包括查询和演示)。 - (有些使用辅助业务对象,有些仅依赖于数据对象并且不需要其他内容)
它们应该属于:
- 数据对象 - 操纵对象 - 业务命名空间中的静态辅助类?
我想答案很大程度上取决于我们所讨论的方法,应用程序的设计等等。因此,我了解到具体建议可能很难给出,但我会感激任何有助于我在这种和其他情况下做出决策的提示。
简而言之: 选择将方法放在哪里的标准是什么,或者说我应该问自己哪些问题?

我相信你真正想问的是面向对象设计。如果是这样,那就是一个非常大的话题。建议:谷歌搜索“S.O.L.I.D.编程原则”。或者获取《敏捷原则、模式与实践(C#版)》一书,作者是Martin & Martin。 - paulsm4
@paulsm4 谢谢。是的,你说得对。我正在考虑如何让我的问题更具体,但我觉得它也涉及面向对象设计原则。 - Dil
1
只是个人意见。一个操作数据而不保存数据的对象应该是一个静态方法。你对特定用途的评论让我相信你可能有基础数据对象,并需要添加继承的特定数据对象。至于从数据对象中详细阐述方法的位置 - 答案根本不是方法 - 而是数据对象上的公共属性。 - paparazzo
@Blam,您是指如果方法不修改对象的数据,它们就不适合于该对象,而应该放在静态方法中吗?或者,如user1494所说,放在另一个类中,比如InfoFoo或FooInspector? - Dil
1
这只是一个观点,接受或者放弃都可以。我的意思很明确。如果类本身没有数据,那么最好将其作为静态方法。 - paparazzo
@Blam,我明白了,这都是头脑风暴的一部分。 - Dil
1个回答

2
根据我的个人经验,将每个对象(或类)的单一职责/功能/特性等分配一个非常有效。
因此,我建议您: 为需要处理的每种类型的数据对象创建1个类。 示例:DataObjectA,DataObjectB 为需要在这些数据对象上执行的每个操作创建1个类(或者根据它们的相似程度为每个操作x数据对象类型创建1个类)。 示例:DataObjectLoader,DataObjectASaver,DataObjectAUpdater,以及可能还有DataObjectALoader和DataObjectBLoader。 为该数据的每个更复杂的操作创建1个类: 示例:DataObjectAComplexThing
如果所需的详细数据具有“意义”,并且这是您在域中识别出的问题,并且您可以轻松命名,则也应为其创建1个类: 示例:ObtainDataRequiredForComplexThing
DataObject应仅回答“定义”该对象所需的基本查询…所有其他内容都应在ObtainDataRequiredForComplexThing或DataObjectAComplexThing等类中。
我的决定放置事物的标准是...物品应仅具有绝对必要的方法、字段等。您可以拿走任何您可以拿走的东西,并将其放在其他地方(在另一个类中或其他地方[当然,在合理范围内])。 如果您可以使用单个类或使用多个类来解决问题,并且每个较小的类本身都有“意义”,并且您可以在域中识别出该问题,并为其命名...您应该使用多个较小的类... 组合对象(或类)比拆分它们要容易得多。因此,每当您有机会时,几乎总是将它们拆分成更小的构建块...
大多数人说您应该为域中的每个名词创建对象(或类),并为每个动词创建方法... 根据我的经验,为每个名词创建对象和每个动词创建对象更好。 示例:new SomeVerbThatRepresentsDoingSoething(aDataObject).ExecuteThisVerb(); //实现执行该动词

谢谢您的建议,我可以使用更小的Doer类。至于ObtainDataRequiredForComplexThing,如果没有自己持有数据,像@Blam建议的那样将其设置为静态,这样会更合理吗? - Dil
对象和类不仅仅用于保存数据。您可以使用它们来组织知识,并从小部分组成它...如果您将像ObtainDataRequiredForComplexThing这样的东西实现为类,您可以做很多有趣的事情并生成更干净、更好的代码,如果您知道自己在做什么。请查看此链接:http://blogs.southworks.net/dgeffner/2011/08/08/object-oriented-algorithms/. - user1494736
再次感谢。我已经将一些东西重构为新的Doer类,看起来更加清晰。 - Dil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接