首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >设计/应用结构和关注点分离问题

设计/应用结构和关注点分离问题
EN

Stack Overflow用户
提问于 2019-05-23 00:10:02
回答 2查看 0关注 0票数 0

所以这个问题是从这里开始的(如何处理多个事件args)。这个问题让我想到了这一点,但又足以保证自己的线索。

我正在创建一个游戏(用于娱乐和学习目的),并想知道我是否使用了良好的设计标准。我想我可能已经将OTT分离出来了,或者只是把整件事弄错了,但我希望事实并非如此。我没有问题重写它,因为我想学习“最佳实践”及其实际应用。

编辑

让我解释一下游戏的更多内容,它基于Jawbreaker在许多手机上发现的游戏(这里有快速演示)。目标是选择成组的球以将其从比赛中移除并且尽可能多地得分。

我试图扩展它一点,有不同类型的板,球以不同的方式移动,不同的球类型,球可能只是去他们被告知的地方,或者他们可能会做一些事情。

所以这是我创建的对象的结构,顶行显示DLL的对象,第二行显示这些对象引用的内容:

旧文本
旧文本

(来源:ggpht.com

这是我尝试做UML的尝试:

旧文本http://yuml.me/3279d2ac

单击此处链接到UML的完整页面,使其更大,希望更容易阅读

Objects DLL包含游戏,Balls和Board中使用的基本对象。它们不包含任何关于它们如何对情况起作用/做出反应的逻辑(球确实实现了CompareTo和Equals方法)。可能有多个IBall的实现(对于IBoard也是如此,尽管我想不到那么多)。

InstanceManager DLL用作创建对象的一种方式,不确定它是否可以在对象DLL中完全消失。工厂是静态类,具有各种重载方法来创建IBall对象。BallFactory可以采用BallType Enum,Drawing.Color对象等.BoardFactory非常相似。Jawbreaker是一个单例对象,它处理诸如持有随机对象之类的事情,因为它经常使用和一些GameConfiguration数据(与本主题不太相关)。

Engine DLL是大多数工作发生的地方。LogicFactories采用BallType和BoardType对象来创建相关的逻辑对象。逻辑对象用于控制IBall和IBoard对象的工作方式。BallLogic告诉球,当它的事件发生时它能做什么。例如,当选择Ball时,在Ball Logic上调用一个方法,即选择了Y上的球X. 球可以做任何类型的球应该/可以做的任何事情。BoardLogic非常相似,涉及董事会的行为方式。

引擎对象是另一个单例,是GUI与整个游戏交互的方式。GUI不会直接实例化任何其他对象。

因此,总结一下IBall和IBoard类只包含有关它们的数据,Logic类处理所有功能。

我想知道的是:

1)这是一种明智的做法吗?

2)(通常)逻辑应该与对象/数据分开吗?

3)我是否因为关注点的分离而走得太远了?

4)关于设计/结构的任何其他评论

编辑

我使用几个单例的原因部分是为了简单地在一个地方访问数据,而不是一直保持对象,也只是因为它是单个游戏而且不会扩展到高端或跨多个机器。我确实理解他们不是很好,而不是我经常使用的东西,但感谢评论。

感谢您的想法和反馈。

EN

回答 2

Stack Overflow用户

发布于 2019-05-23 08:29:38

如果不更好地了解你想要做什么,就很难批评你的设计。我知道它涉及球和板,但除此之外,我不知道。

尽量避免单身人士。是的,我知道GoF书中列出了它,我知道这是一种常见的模式,但根据我的经验,它最终成为一种反模式。

你提到IBall和IBoard没有关于它们如何交互的任何逻辑。这是否意味着他们没有任何方法?他们的方法是否只是私人数据的吸引者和设定者?如果IBall和IBoard只是结构(或它们的等价物),那么它们不需要是接口。你可以充实你的描述来谈谈你可以发送到IBall和IBoard的消息类型吗?

2)(通常)逻辑应该与对象/数据分开吗?

有时。如果你有普通的旧数据,那么将逻辑与普通数据分开就可以了。当然,那时你不再做OOP了 - 你正在编写程序代码。我认为你正在努力不想将任何行为硬编码到Ball中。也许其他一些实体应该负责决定球如何相互作用,但是你仍然有空间让Ball参与决定。这就是战略模式(以及其他模式)将发挥作用的地方。想想现实世界中的事物是如何运作的 - 物理球和物理板如何协调它们的相互作用?如果他们互相交谈,他们会说什么?看看你是否可以在代码中实现它。

最后,关于设计的一个词。我认为想要“正确设计”是件好事。另一方面,这是成为宇航员建筑的道路。考虑一下您目前在代码库中遇到的问题。

  • 重构难吗?
  • 添加新类型的东西难吗?
  • 太多“硬连线”?

设计并不存在于真空中 - 它是根据当前的世界状况得出的。只要看看人们提出的一些疯狂的手机概念艺术,你就会看到糟糕设计的好例子。手机受到当前技术的限制,忽视现实世界限制的设计只不过是梦想。软件也是如此。注意代码告诉你需要什么,你会做得很好。

您编写(完成)的软件越多,您拥有的体验就越多,您的审美感就会越好。不要害怕“做错了”会阻止你完成软件。坚持不懈,让它发挥作用,然后看看你从过程中学到了什么。

票数 0
EN

Stack Overflow用户

发布于 2019-05-23 10:03:48

你的故障看起来正朝着正确的方向发展。但是,我不确定您是否试图将数据从演示文稿中从逻辑中分离出来。看看MVC、观察者和策略模式。

记住这一点:当您设计一个应用程序时,需要进行权衡。您可以用较少的精力扩展应用程序,但是性能和内存使用会比较松散。而且,我不想这样说,但不要创建不必要的接口。如果您知道现在或以后要扩展对象的功能,在创建接口时,如果没有在实现之前考虑它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100009050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档