我的“Ms. Pac-Man”实现中可能过度使用了Java接口

3
我过去六年一直是一名Java程序员,但今年年初我开始对游戏编程感兴趣。因此,我认为从一个流行的游戏开始是个好主意,于是我用Java实现了游戏Ms. Pac-Man。我可以说,我的实现看起来与原始游戏相似度约为90%,而且我尽可能多地使用了设计模式和最佳实践,因为这只是一个个人项目,旨在学习编写基本的2D游戏。
现在我完成了编码后,我意识到我有19个接口和仅有17个类!所以我开始想知道是否可能我过度使用了接口。
以下是我使用的几个类/接口示例:
- 类 - FullGame(实现FullGameInterface和FullGameObservable) - 类 - View1(实现FullGameObserver) - 接口 - FullGameInterface(基本功能方法:resume、pause、play等) - 接口 - FullGameObservable(允许视图注册以接收更新通知) - 接口 - FullGameObserver(由游戏的两个不同视图实现以接收通知)
我是否过度使用了接口?
你的意见是什么?

“过度使用”接口是一个主观的问题 - 可以参考https://dev59.com/NnNA5IYBdhLWcg3wcdhk和http://stackoverflow.com/questions/90851/is-it-just-me-or-are-interfaces-overused这两个例子。 - Nate
4个回答

9
如果您想更改实现,则可以使用接口。
对于像FullGame对象这样的东西,您可能不需要接口。
如果您将来要更改FullGame的功能,则可以考虑制作一个接口,以便您可以切换要为FullGameInterface实例化的对象。
编辑2:只有在需要时才使代码更复杂。 如果您认为需要接口,请先停止。 使用已经存在的类。 (但是,在使用它时,请尝试将调用者排除在实现细节之外。)一旦您有第二个类似的类,那么您就可以弄清楚什么是接口和什么是实现。 如果您的调用者仍然需要难以放入公共接口的实现细节,则您没有保持它们完全分离。
编辑以获取更完整的答案:
接口对于将要访问对象的方法(接口)与实际对象(实现)进行解耦非常有用。 这对于几种情况很有好处:
1.您有多个实现这些方法的实现,具有相同的语义和一般操作,但具有不同的底层实现。 例如,List,ArrayList和LinkedList。 List是允许许多基于集合的方法接受ArrayList或LinkedList的通用接口。 Collection接口为所有集合提供了类似的安排。
2.出于架构原因,您需要将接口与实现分离。 例如,您可以在一台机器上拥有调用对象,在另一台机器上拥有实现对象。 调用机器上的代理实现接口以通过网络调用真实对象。 接口意味着调用者不必知道差异。 Java RMI就是这样做的。
3.您需要能够修改调用对象的方式。 例如,使用接口Image和两个实现者FileImage和FileImageProxy。 代理按需加载FileImage并将调用传递到实际对象的Image接口。 客户端永远不知道或关心它们如何获取图像,或者它是否真正加载; 它们只知道有一个Image,并且可以使用它。

1
这里的关键词是“实现”。使用接口来抽象出“实现变更”。 - Don Cheadle

4

如果您掌控代码并且只有一种实现方式,那么这是一个好的信号,表明接口是没有意义的(尽管如果您想进行测试,它可能会很有用)。

请记住,内部类也是类。

通常情况下,接口和实现都不应该使用多重继承。


2
多个接口的实现可以实现关注点分离,使得客户端能够指定对象表面的哪一部分是它们所依赖的。多个接口没有多个实现继承的缺点。 - PanCrit
1
冗余。多重子类型倾向于意味着类正在做多件事情,而不是很好地完成一件事情。 - Tom Hawtin - tackline

2

接口是好的。拥有很多接口并不是问题。

特别是当你只实现了第一个游戏时。如果你重复使用代码库来构建更多游戏,你可能会得到更多的多态性,因为你将重复使用接口。但是,在这个点上,如果在实现中的方法比在接口中的方法多,那么接口就有了作用——它们隐藏了实现细节,使客户端强制符合接口,从而实现了真正的OO的多态性。


如果实现中的方法数量比接口中的方法数量多,那么接口就有其存在的意义。我找到了4个实现,它们的方法数量与接口中的方法数量相同,所以我刚刚删除了这些接口,现在看起来好多了。 - David Robles
1
我认为仅仅因为一个类没有向其实例添加私有方法就将其删除有点奇怪...两个类可能具有相同数量的代码,但它们是不同的实现。这是接口的有效用法。 - Don Cheadle

1

我经常使用接口来完善我的设计。我会对它们进行详细的文档记录,这迫使我仔细思考我的类的职责。API和类的内部始终存在一些区别,因此即使您还没有多个实现,指定一个接口通常也不会有害。


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