请原谅标题,很难正确解释我需要帮助的内容,但我会试一试。
我正在做一个Java项目,一个订单管理应用程序。我有几个类用于应用程序中不同类型的功能,例如Order类、Client类、Task类等。这些任务中的每一个都有与它们所做的事情相关的方法,例如,Order类有一个名为newOrder()
的方法。
现在有一个变化,我需要在应用程序中添加一些新内容:应该有三种不同类型的帐户可以访问应用程序:管理员、项目经理或开发人员。这些帐户中的每一个都将具有对应用程序功能的不同类型的访问权限。管理员和项目经理将拥有类似级别的访问权限,但开发人员只能访问管理员授予他们访问权限的项目(订单)。
我正处于为此绘制UML图的阶段,我真的很难理解如何将其可视化。我的第一个想法是创建一个User类和三个子类(Admin、ProjectManager&Developer),它们都扩展到User类。这三个类中的每一个都将包括允许它们做什么的方法,例如Admin和Project Manager类将具有方法newOrder()
,而Developer类则没有。
我相信你可以看出我在这方面是个新手,但在这一点上你能给我的任何帮助都是非常感激的!
首先,让我们消除一个歧义:OOP语言通常称之为访问级别、访问修饰符、访问说明符的东西在UML中被称为可见性。它在类成员的左侧显示了一个额外的字符:+
表示public,#
表示protected,-
表示private,~
表示package。
但很快就会发现,您对OOP意义上的访问级别不感兴趣,而是对应用程序中的授权和访问控制感兴趣。并且没有通用的UML解决方案。这完全取决于您的需求和您的设计:
- 您可能确实对更通用的
User
有不同的专业化,并在编译时定义什么子类可以执行什么操作。你的方法将是一个良好的开端。不幸的是,同一用户不可能同时拥有多种类型的访问 - 或者,您可以只拥有一个
User
类,但也可以拥有一个类别Role
,并且每个User
都可以拥有一或多个角色。这使用组合而不是继承,并且更灵活 - 或者,每个业务实体,如
Order
,都可能受到AccessControlGroup
的影响(例如,用户部门?子公司代码?或只是访问代码?):Role
将与一个或多个AccessControlGroup
相关 - 或者,如果您想将数据组与操作组相结合,以便更好地控制谁可以对哪些数据执行什么操作,您甚至可能需要更复杂的访问控制组
正如您所看到的,不同的需求可能需要非常不同的设计。
最后,还有一个问题:newOrder()
:应该放在哪里
- 它本身在
Order
类中吗?然后,该方法可以将User
作为参数,动态检查用户是否被授权 - 它在
User
类中吗?但是,具有相同权限的不同类别的用户是否应该实现相同的newOrder()
方法 - 它是代表业务事务还是用例的某个类
正如您所看到的,有很多解决方案。这不仅仅是需求,还涉及体系结构的选择、类责任和关注点的分离。如果你想进一步挖掘的话,已经写了关于这些主题的完整的书。
结论:UML不会告诉你你的解决方案应该是什么样子:你需要做出选择,然后你会在UML中显示你已经决定了什么:-)
这是面向对象思想的基础。您已经确定了所需的对象,即将确定"特性"one_answers"操作"。你需要从不同的来源获得正确的需求,然后确定开发人员、PM&Admin对象(Actor)。现在,当然,一组常见的操作可以移动到User(Parent)。
我觉得,你们的想法正朝着正确的方向发展,只需要更加明确要求,确定一套正确的行动,这些行动将转化为一系列方法。
进行UML设计的步骤可以是。。。
- 识别用例/流
- 识别物体(你已经做了)
- 识别每个对象的可能操作
- 识别对象的可能属性以保持对象的状态
- 提出序列图,显示用例
注意,从简单和最少的细节开始,然后从那里开始发展。你们已经步入正轨了。