一个类应该在内部处理它自己的数据吗?

Posted

技术标签:

【中文标题】一个类应该在内部处理它自己的数据吗?【英文标题】:Should a class internally handle its own data? 【发布时间】:2014-09-01 22:41:14 【问题描述】:

我有一个 Flight 类,它目前除了保存许多包含给定商业航班详细信息的变量之外什么都不做。

这些细节大部分只是通过构造函数传递,但其中一些需要计算或格式化。例如,我将航班到达时间格式化为字符串 "6th June",有时初始航班数据中缺少机场名称,因此我使用 airportcodesairportnames 的数组来查找机场名称。

计算这些附加信息的方法是否应该位于航班类或一系列其他模型中,例如DateProcessorAirport

【问题讨论】:

试金石是,当你需要做出改变时;您需要在多少个地方进行更改。 @Blacklight 我正在考虑的替代方案将涉及 Activity/Viewcontroller,它计算在类中存储此数据的数据。它的缺点是我必须跟踪哪个控制器首先访问该类,但阻止我的类变得太笨重,因为我将它保存在数据库中并使其可序列化。 @Deco 对不起,我删除了我的评论,因为它是多余的。克里斯 K 是完全正确的,集中你的代码并干燥。直觉上我会说你描述的任务可能属于飞行类,除非它们可能特定于某个视图。 【参考方案1】:

Chris K 正确地指出了试金石,即当您需要做出改变时;您需要在多少个地方进行更改。

OOP 概念鼓励解耦和modular programming 以最大化代码重用。

key is high cohesion and low coupling。参考这个Cohesion & Coupling

如果您认为您获得的其他航班详细信息 来自 Flight 类的变量将只需要在一个活动中,现在 在哪里。那么在我们的活动中拥有这些功能就可以了。

但是,如果其他活动或类可能需要这些功能 当前或将来可能需要。然后,将这些功能放在您的 飞行等级

理想情况下,最好的 OOP 是将这些从 Flight 类变量中派生细节的函数保留在飞行类本身中。因为,如果不是现在,您将能够重用代码,以后再使用。我也会建议相同。

另外,如果您使用 Flight 类的多个实例,您应该将所有访问和修改类变量的函数放在 Flight 类中,以保持每个实例的数据一致性。

如果您坚持使用 OOP 编程技术,代码的维护会更容易,因为代码重用率会更高,并且不会出现重复代码。

面向对象编程有四大原则:

数据抽象

封装

继承

多态性

P.S : 可以参考http://en.wikipedia.org/wiki/Object-oriented_programming

【讨论】:

这应该是评论而不是答案。 @Sanjeev 虽然这可能是真的,但评论太长了。 移动应用程序遵循的 MVC 设计模式与我所学的 OOP 似乎相互矛盾。 只是为了添加到这个答案中,使该函数virtual(overridable) C# 术语将为子类提供更好的控制,以用它们自己的功能覆盖它。另一个用例可以是模板模式oodesign.com/template-method-pattern.html【参考方案2】:

将登录、数据和 UI 分开是完全正常的。例如,JavaBeans 是具有存储数据的类的约定。阅读更多here。 MVC 采用类似的逻辑,即视图是从数据创建的,从模型中获取,控制器更新数据。

【讨论】:

【参考方案3】:

良好的类设计封装数据并提供访问该数据的方法。在您的情况下,您应该问自己“所有数据是否相关”......想想如果我有一群员工,我会将这些数据提供给其中一个以记住还是将数据分区并给出部分更有意义它与不同员工的数量有关。

您已经确定了应该进入一个类的数据,因此将作用于该数据的方法也放在该类中似乎是合乎逻辑的。

我认为 MCV 设计模式很灵活,但在这里有点矫枉过正。

【讨论】:

以上是关于一个类应该在内部处理它自己的数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

类应该能够通过 XML 保存和加载自己吗?

JVM 如何在内部处理竞争条件?

数据库提交如何在内部工作

mllib 如何在内部对不平衡数据集的类进行加权?

Java int[ ] 数组是如何在 JVM 内部实现的?

Java 分析器在内部是如何工作的?