我对OO设计没有足够的把握来确定我是否设计好应用程序。
这是一个简单的想法:
我想编写一个在Metro上旅行的应用程序。
我开始定义以下内容:
定义一些方法的Trainline接口。 然后我创建一个名为Lines的具体类。 Lines类根本不做什么。 它有像getNumberOfStations()这样的方法,但它不知道任何数量的站,所以只返回null。
然后我有一个CentralLine类来完成实际工作,这扩展了Lines,这提供了真正的实现。
问题:
谢谢!!!!
答案 0 :(得分:1)
为什么不制作Lines
班abstract
?你不会有“返回null”的问题=>非常非常难看。
在这种情况下,您将不再拥有TrainLines
界面。
TrainLines
如果您计划处理许多不同类型的Lines
,其实现真的不同,那么界面会很有趣。通过使用TrainLines
类型引用代码中的不同类,您可以获得更好的多态性。
总结一下,两种解决方案:
Lines
因为抽象类遵循具体的类。TrainLines
作为接口后跟Lines
(或其他类型),抽象类遵循具体类。请记住,实现接口的抽象类不需要实现这些方法。实际上,抽象类可以将这种责任推迟到具体的阶级。因此,无需实现虚拟return null
;)
答案 1 :(得分:1)
根据你到目前为止所展示的内容,你真的应该只有一个类:Line
类。
有几个原因(回答1-4):
你应该谨慎使用继承。很难简单地说明为什么这只是继承,特别是在Java中(我们没有特性或多重继承和可变性是猖獗的)通常不是好的设计。您可以使用Google Gang of four composition over inheritance
。
课程不应该是具体的事情。那就是你不会使你的名字来自Human
。类是一类东西。
如果您确实需要更多类型的Line
,那么您只需重构。特别是在Java中,重构非常简单。我认为他们从根本上教授软件工程/设计错误的现实世界中发生的事情。在现实世界中,您不了解整个域(或分类法),因此您始终从最简单的模型开始,然后重构。
回答问题#5:
OO能为我做些什么事情会很酷吗?我应该用OO设计做些什么?
如果你不了解单元测试,你应该研究一下(如果你不能测试它,一个好的设计就没有意义......事实上如果你不能测试你的代码或者它很难测试=坏设计)。
使用OOP,您应该决定如何管理状态。 OOP非常善于管理内存状态。它的最大好处是可以建模诸如视频游戏或UI之类的东西,其中你有很多内存状态。
答案 2 :(得分:0)
在你的情况下,我没有看到任何真正的界面需求。 我会将Lines作为一个抽象类,并在Lines类中提供所有常见的实现。 CentralLine和CircleLine可以使用该默认实现,并为其余方法提供实现。
Thumb规则是,无论何时你有一些常见的实现,然后去抽象类,这适用于你的情况。
当您希望跨层次结构实现时,接口可能非常有用,同样的类可以实现多个有用的接口。 但是接口总是需要注意的是,如果必须添加新方法,则整个层次结构可能会中断,而在抽象类的情况下,您可以简单地将该默认实现放在Abstract类中而不更改其他任何内容。