【问题标题】:In need of critique for UML overview of project structure需要对项目结构的 UML 概述进行批评
【发布时间】:2014-03-27 07:31:54
【问题描述】:

注意:我无法在斜体和其他内容的代码块中进行格式化,因此有一些临时标记来尝试传达含义。填充菱形的 html 转义字符也不起作用。希望它仍然有意义

我的 Java 类中有一个项目,我需要在其中创建一个 GUI 程序,该程序基本上对小型库存数据库进行建模。主要重点是以面向对象的方式创建它。所以基本上在开始之前,我已经绘制了一个简化的 UML,它只指定类、组合和继承,而不定义变量或方法——实现这些将很容易,但我想确保我有一个良好的面向对象设计的可靠层次结构在我开始添加细节之前。

因此,如果您可以花点时间查看我的项目结构,并让我知道是否有任何我应该更改、省略或添加的内容。

该项目基本上将是一个临时的视频游戏商店应用程序,它只是简单地将记录读取和写入文本文件,管理数据库的管理员应该有一个图形界面来导航、添加、删除和编辑记录。我会用一些很棒的功能很好地修饰它,但是现在,我只专注于确保我的结构是好的。

**list of classes**

DatabaseRecord <abstract>
VideoGameDatabaseRecord
DatabaseNavigator
Database <abstract>
VideoGameDatabase
Game <abstract>
VideoGame <abstract> (superclass for platform-specific video games)
XBoxGame
PlaystationGame
NintendoGame
etc for all subclasses that would pertain to the needs of the inventory

我对 UML 建模还有些陌生,所以我希望我已经正确使用了约定,并且在基于文本的 UML 导致无法遵循约定的地方,我希望用“a”和菱形中的“c”表示聚合或组合,大写的“A”表示抽象类(斜体不会在代码降价中显示)

------A-----           0..*   ----------A--------                           ----A---             
| Database | <c>------------- |  DatabaseRecord |                           | Game |
------------                  -------------------                           -------- 
      ^                              ^                                          ^
      |                              |                                          |
      |                              |                                          |
---------------------      0..*  -----------------------------          1  ------A------
| VideoGameDatabase | <c>------- |  VideoGameDataBaseRecord  | <a>-------- | VideoGame |
---------------------            -----------------------------             -------------
         <a>                                                                ^   ^   ^  
          |                                                                 |   |   |  
        1 |                                                                 |   |   |  
-----------------------                                        -------------|   |   |  
|  DatabaseNavigator  |                                        |  XBoxGame  |   |   |
-----------------------                                        --------------   |   |
                                                                   -------------|   |
                                                                   |  PS2Game   |   |
                                                                   --------------   |
                                                                                    |  
                                                                            --------|
                                                                            | etc.  |
                                                                            ---------

再次,我只是在寻找有关我的程序结构的层次结构、OOP 设计、组合等方面的指导。即这应该是抽象的,应该是接口,我应该添加更多/更少的子类级别等。我对可靠地编写代码很有信心,但我对 OOP 设计原则的掌握和掌握仍然不够好。

提前感谢您的帮助!

【问题讨论】:

  • 你真的需要抽象类型Game吗?在您的图中,它与其他实体没有关系。 (顺便说一句,如果你附上类图的图像可能会更清楚,那里有免费和好的建模师,比如 Astah)。
  • 我同意,但我想我可能会把它留在那里,只是为了将来的可扩展性 - 也许这个库存计划所针对的虚构商店想要扩展 他们的 库存以包括棋盘游戏,它将继承所有游戏将拥有的东西,例如String title;float/double price;,它们的访问器和突变器,toString(),也许还有更多。但我完全明白 - 关于这个项目 - 类 Game 除了语义价值之外基本上毫无意义
  • 为了可扩展性,您可以使用 Sellable 接口来表示任何可以出售的物品。使用获取标题、价格的方法......但除非你与 VideoGameDataBaseRecord 有关系,否则不会有太大的好处

标签: java oop inheritance uml composition


【解决方案1】:
  • “我会用一些很棒的功能很好地修饰它,但是目前,我只专注于确保我的结构良好。”这意味着,您应该确保它可以轻松实现您的强大功能。 :-)
  • Aggregation 可以是三种类型 - 无、共享或复合。说 aggregation 而不是 sharedshared aggregation 是一个严重的错误。唉,从 VP-UML 工具广泛传播。
  • 对于摘要,通常使用斜体来书写名称。
  • 这是一个更严重的问题:associationsgeneralizations 没有不同的行。因此,几乎不可能理解您的图表。但是,如果我认为所有箭头都是generalizations,……这是有道理的!但实际上,最好使用一些免费的绘图工具。例如,VP-UMP 的社区版本。或在 Eclipse 上免费提供 Papyrus。
  • 你的shared aggregations(请允许我正确命名它们)都很奇怪:
    • 左边的完全无法理解 - 允许在一端写菱形,在另一端写 1-multiplicity(共享聚合在 UML 标准中没有严格定义),但应该解释这种不寻常的用法。如果您的数据库导航器与许多数据库一起使用,则钻石应该正常结束。
    • 右边的写法一般,但我不明白它下面的意思——一个VideoGameDataBaseRecord怎么会有很多游戏?我没有理解逻辑。你能修复它或解释一下吗?我认为,应该有正常的关联,noneaggregation,单面或双面,末端为 0..1。
  • 非常抱歉,但我不明白etc. 中的内容是什么,如果里面有未知的东西,你怎么确定它应该是从Game 类派生的?通常情况下,你还没有足够形式化的东西,会被简单地排除在图表之外。

【讨论】:

  • 对不起,我基本上是在尝试创建一个只有文本的临时 UML 图...基本上我的图打算显示如下(我还没有完全学习 UML 图表如果图表具有误导性,我深表歉意:基本上我的程序将有抽象类 Database has-an ArrayList abstract class VideoGameDatabase extends Database 和 has-an ArrayList 并且还有 -a DatabaseNavigator(GUI) VideoGameDataBaseRecord has -a VideoGame(库存中的游戏记录)VideoGame 可以子类化
  • 到控制台特定的类,例如 PS2Game、XBoxGame 等。
  • @Justin 我知道了,谢谢,您对我发现的可能问题有何看法?
  • 好吧,对于初学者来说,您对 VideoGameDatabaseRecord 和 VideoGame 的关系是绝对正确的 - 每条记录应该只有一个 VideoGame,这是我的一个愚蠢的错误。至于免费工具,我尝试过 ArgoUML 和 NetBeans UML 插件,但发现两者都很笨重。
  • @Justin 查看图表stackoverflow.com/a/22009701/715269stackoverflow.com/questions/18813549/…。这些是由社区 VP-UML 制作的。不理想,但它可以工作并且是免费的。 NetBeans UML 插件已经有几年不支持了 - 你勇敢地尝试了!
【解决方案2】:

我认为您已经在一张图中混合了逻辑和模型视图。说到核心/业务逻辑术语,您的图表应该只包含实体StoreVideoGame... 在更深的层次上,您将模拟如何持久化它,您会谈到数据库、记录...

所以,首先你的商业模式可以这么简单:

当您拥有商店、通用可售类型和视频游戏(具体可售物品)的概念时。一般来说,组合比继承更可取,因此我没有将 NintendoGame、PS2Game... 作为子类型,而是使用 console 属性对其进行建模。

然后是当您将模型持久化(到文件、数据库等)时。为此,您的应用程序中有一个单独的层。该层将负责将VideoGame 序列化到寄存器中,反之亦然。你也可以有另一个类图,或者只有几个类负责 IO。

ps:我不知道DatabaseNavigator 的目的是什么,所以我在回答中忽略了。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多