2

我对 OO 设计没有足够的了解,无法确定我是否在设计应用程序。

这是一个简单的想法:

我想编写一个在地铁上旅行的应用程序。

我开始定义以下内容:

定义了一些方法的 Trainline 接口。然后我创建了一个名为 Lines 的具体类。Lines 类什么也没做。它有 getNumberOfStations() 之类的方法,但它不知道任何数量的站,所以只返回 null。

然后我有一个 CentralLine 类来完成真正的工作,它扩展了 Lines 并提供了真正的实现。

在此处输入图像描述

问题:

  1. 我需要“线条”具体类吗?我不应该让 CentralLine 和 CircleLine 实施 TrainLines(这些都是伦敦地铁上的火车线)吗?
  2. 或者我应该删除 TrainLines 接口并只使用 Lines 具体类?
  3. 还是应该 TrainLines 是一个抽象类?
  4. 除了漂亮的类映射图之外,接口或 Lines 超类是否提供任何价值...见上文 :)
  5. OO 可以为我做哪些很酷的事情?我应该对 OO 设计做什么?

谢谢 !!!!

4

3 回答 3

1

为什么不让你的Linesabstract?你不会有“返回null”的问题=>非常非常难看。

在这种情况下,您将不再有TrainLines界面。

TrainLines如果您打算处理许多不同类型的Lines实现真正不同的接口,那么接口会很有趣。TrainLines通过在代码中使用类型引用不同的类,您将因此受益于良好的多态性。

总结一下,两种解决方案:

  • Lines因为抽象类后面是具体类。
  • TrainLines正如接口后面跟着Lines(或其他类型)抽象类后面跟着具体类。

请记住,实现接口的抽象类不需要实现方法。实际上,抽象类可以将此责任推给具体类。因此,无需实现 dummy return null;)

于 2013-03-31T16:14:44.083 回答
1

根据您迄今为止所展示的内容,您实际上应该只有一个类:Line类。

几个原因(回答 1-4):

您应该谨慎使用继承。很难简要说明为什么会这样,但继承,特别是在 Java 中(我们没有特征或多重继承并且可变性很猖獗)通常不是好的设计。你可以谷歌Gang of four composition over inheritance

类不应该是具体的东西。那就是你不会创建一个你的名字来自的类Human。类是事物的一个类别。

如果您确实需要更多类型的Lines,您只需重构. 特别是在 Java 中,重构非常容易。我认为他们从根本上教软件工程/设计错误的现实世界中发生的事情。在现实世界中,您不了解整个领域(或分类),因此您总是从最简单的模型开始,然后进行重构。

要回答问题 #5:

OO 可以为我做哪些很酷的事情?我应该对 OO 设计做什么?

如果你不了解单元测试,你应该研究一下(如果你不能测试一个好的设计就没有任何意义......事实上,如果你不能测试你的代码或其难以测试=糟糕的设计)。

使用 OOP,您应该决定如何管理状态。OOP 非常擅长管理内存状态。它最大的好处是对视频游戏或 UI 之类的东西进行建模,其中你有很多内存状态。

于 2013-03-31T16:46:59.647 回答
0

在您的情况下,我认为对接口没有任何真正的需求。我会让 Lines 成为一个抽象类,并在 Lines 类中提供所有常见的实现。CentralLine 和 CircleLine 可以使用该默认实现并为其余方法提供实现。

经验法则是,只要您有一些通用的实现,就选择抽象类,这对您的情况来说是正确的。

当您想要跨层次结构实现时,接口可能非常有用,同样因为同一个类可以实现多个接口,它也很有用。但是对于接口总是有一点要注意,如果必须添加新方法,那么整个层次结构可能会中断,而对于抽象类,您可以简单地将默认实现放在抽象类中而无需更改任何其他内容。

于 2013-03-31T17:28:22.763 回答