Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 基于角色的面向对象控制器设计_Oop_Design Patterns_Object Oriented Analysis - Fatal编程技术网

Oop 基于角色的面向对象控制器设计

Oop 基于角色的面向对象控制器设计,oop,design-patterns,object-oriented-analysis,Oop,Design Patterns,Object Oriented Analysis,我想实现一个实际上包含3个的系统,每个系统的功能根据用户角色类型而有所不同。即,允许用户根据其角色类型执行不同任务的系统;角色类型在用户创建时正确确定。用户不能使用其角色访问系统的其他组件/功能,并且UI对于每个用户都是唯一的* 我需要这些“系统”彼此独立运作,但我发现了一些普遍的行为(通常是组合的机会) 目前,我有3个控制器,因为这是我设计的初衷-RoleType1控制器,RoleType2控制器,RoleType3控制器。显然,这些分支是独立的,并且触及到它们需要触及的类 我正在准备一些非常

我想实现一个实际上包含3个的系统,每个系统的功能根据用户角色类型而有所不同。即,允许用户根据其角色类型执行不同任务的系统;角色类型在用户创建时正确确定。用户不能使用其角色访问系统的其他组件/功能,并且UI对于每个用户都是唯一的*

我需要这些“系统”彼此独立运作,但我发现了一些普遍的行为(通常是组合的机会)

目前,我有3个控制器,因为这是我设计的初衷-RoleType1控制器,RoleType2控制器,RoleType3控制器。显然,这些分支是独立的,并且触及到它们需要触及的类

我正在准备一些非常大的功能增强,一旦我开始工作,就需要考虑这些增强,因为其中一些将是系统的共同驱动点。也就是说,我希望系统能做一些同样重要的事情,但此时只能实现一个主要功能

关于OOD,我认为这种“三位一体”的方法可能最适合即将到来的变化。然而,这些组合的机会以及保持单一控制者标准的愿望对我的决策过程产生了重大影响

有没有人有过类似的经验,或者,如果没有,有过OOD经验,可以为我指出正确的方向?我是从头开始构建的,所以(显然)系统的框架是在第一次迭代中定义的。我希望它尽可能健壮灵活

任何帮助都将不胜感激


*我没有使用UI来驱动我的设计过程……我只是觉得这额外的信息可能会有所帮助。

在这种情况下,答案是有多个控制器。不一定按角色划分(尽管我的域模型目前是这样形成的);这些应该通过授权用例控制器职责的过程来定义。我通过设计定义SSD和类图的初始阶段发现了这一点

Craig Larman在《应用UML和模式:面向对象分析和设计及迭代开发导论》(这是一本从各种经验证的最佳实践定义及其作者中提取其上下文的令人难以置信的入门书)中指出,定义控制器有两种方法:

将责任分配给代表以下选项之一的类:

•表示整个“系统”、“根对象”、软件在其中运行的设备或主要对象 子系统这些都是门面控制器的变体

•表示发生系统事件的用例场景,通常命名为Handler, 协调器或会话(用例或会话控制器)

•对相同用例场景中的所有系统事件使用相同的控制器类

•非正式地说,会话是与参与者对话的实例。会话可以是任意长度的,但是 通常按照用例(用例会话)进行组织

以前的经验总是引导我找到第一个解决方案,因为我帮助设计的系统的复杂性要低得多。然而,我遇到了这个问题:臃肿的控制器

根据同一文本,Larman提出以下建议:

问题和解决方案

设计不当的控制器类将具有低内聚性、不集中和处理过多责任区域; 这称为膨胀控制器。腹胀的症状有:

•只有一个控制器类接收系统中的所有系统事件,其中有许多。 如果选择了facade控制器,有时会发生这种情况

•控制器本身执行完成系统事件所需的许多任务,而无需授权 工作这通常涉及违反信息专家和高内聚性

•控制器具有许多属性,它维护有关系统或域的重要信息,这些信息本应分发给其他对象,或者复制在其他地方找到的信息。 治疗臃肿控制器的方法有以下两种:

  • 添加更多控制器-系统不必只需要一个控制器。使用用例控制器代替外观控制器。 例如,考虑一个具有许多系统事件的应用程序,例如航空订票系统。它可能包含以下控制器:
  • 用例控制器

    MakeReservationHandler

    用例控制器

    管理调度程序

    谢德勒经理

  • 设计控制器,使其主要代表每个系统运行职责的履行 到其他对象
  • 2) 它本身并不能帮助我,因为我有演员在同一个班级里讲话,但他们以自己的方式……我已经把尽可能多的责任委托给了其他班级,同时试图为用户保持简单一致的互动。如前所述,这导致了“控制器臃肿”问题

    因为OOA/D是一个不断发展的过程,在它真正实现之前,我不能说这是我的最终解决方案。事实上,这些用例控制器可以引导我走上一条不同的道路…而不是每个(相似)用例的(相似)控制器,我可以最终得到3个(或4个或5个或6个),这可能只是一种达到目的的方法。但现在,事情比以前顺利多了——我很高兴