【问题标题】:responsibility of each class and how they interact each other in UML每个类的职责以及它们如何在 UML 中相互交互
【发布时间】:2018-11-26 14:02:19
【问题描述】:

我正在尝试为我的项目管理软件绘制一个描述以下场景的类图。 它包含

  • 项目
  • 经理
  • 员工

经理可以创建项目
经理可以更改项目截止日期
经理可以更改项目名称
经理可以将一名员工分配给项目(单个项目只有一名分配的员工)
员工可以提交项目

针对以上需求创建了这个类图

并使用php在代码中实现它,如下所示

Class Manager {
private $Id;
private $name;
private $selectedProject;

public function __construct($name){
    $this->$name = $name;        
}

//manager create a project
    public function createProject(){            
        $project       = new Project('Web Dev','incomplete','2018/6/18');
        $this->selectedProject = $project;
    }

//manager can change project deadline
    public function updateProjectDeadline($projectDeadline){
        $this->selectedProject->SetProjectDeadline($projectDeadline);
    }

//manager can change project name
    public function updateProjectName($projectName){
        $this->selectedProject->SetProjectDeadline($projectName);
    }

//manager can assign a employee To Project
    public function assignEmployeeToProject(Employee $employee){
        $this->employee = $employee;
        $this->selectedProject->SetProjectEmployee($this->employee);
    }

}

Class Project {
    private $Id;
    private $projectName
;
    private $projectStatus
;
    private $deadline
;
    private $assignedEmployee;

    public function __construct($projectName
,$projectStatus
,$deadline
){
        $this->$projectName
 = $projectName
;
        $this->$projectStatus
 = $projectStatus
;
        $this->$deadline
 = $deadline
;
    }

    public function SetProjectDeadline($deadline
)
{
        $this->$deadline
 = $deadline
;    
    }
    public function SetProjectEmployee(Employee $employee)
{
        $this->$assignedEmployee = $employee;
    }
    public function setProjectStatus($projectStatus
)
{
        $this->$projectStatus
 = $projectStatus
;    
    }
    public function setProjectName($projectName
)
{
        $this->$projectName
 = $projectName
;    
    }
}

Class Employee {
    private $empName;
    private $assignedProject;

    public function __construct($empName){
        $this->$empName = $empName;
    }

    //employee can submit project
    public function submitProject(Project $project){
        $this->assignedProject = $project;
        $this->assignedProject->setProjectStatus('submit');
    }
}

我想知道
我的类图正确吗?
我的实施正确吗?

以下方法的特别实现涵盖了良好的 OO 设计?

经理更改项目截止日期 - updateProjectDeadline()
经理更改项目名称 - updateProjectName()

我觉得代码有异味,因为在上面下面唯一要做的就是调用另一个类的 setter ....

P.S - 另一个是不好的做法类访问另一个类设置器,获取器(调用另一个类的设置器,获取器方法)?

【问题讨论】:

  • 这对于 SO 来说有点太宽泛了(恕我直言),codereview.stackexchange.com 可能会更好?
  • 您的类图和实现都不正确。特别是,您没有以正确的方式将员工分配给项目。您的单值 Project::employee 属性没有意义。
  • 我使用的假设项目只能分配一个员工
  • @Susantha7:您打算在 Manager::createProject 和 Employee::submitProject 中使用 $this->project = $project 实现什么目标?这两个类都没有project property。
  • @GerdWagner 为这两个类 Manager、Employee 添加了私有属性项目

标签: php oop uml encapsulation ooad


【解决方案1】:

在你的类图中,跳出来的两件事是你已经填充了箭头(这些在 UML 类图中没有意义——它们要么需要是开放箭头,要么是根据含义未填充的闭合箭头 - - 在下图中,我添加了一个依赖(虚线箭头)和一个基本关联(实线箭头),这可能就是您的意思)。此外,中间的菱形——这不是 UML 类图元素。是笔记吗??

在面向对象方面——我假设你知道的一般原则——封装、抽象、多态等。通常访问器(getter)和修改器(setter)方法是 OO 原则被破坏的标志,因为它们倾向于意味着另一个类正在操纵(或被鼓励操纵)相关类的内部结构(即破坏封装)。 SetEmployee 可能更多的是要求项目分配一个 - 所以像 Project.Allocate (Employee) 或 Employee.AllocateTo (Project) 这样的东西可能更有意义,不太可能鼓励破坏封装。

【讨论】:

  • 菱形可能是一个 n 元关联。对我来说似乎有效。
  • @muszeo 然后将 manager 类中的 assignEmployeeToProject 修改如下 public function assignEmployeeToProject(Employee $employee){ $this->employee = $employee; $this->project->Allocate($this->employee); } 我想知道可以从 manager 类访问项目类 Allocate 方法是破坏封装还是其他面向对象的良好设计原则
  • 我认为这很好,考虑是每个类都应该对自己的数据和行为负责,我认为调用 Project.Allocate(Employee) 或 Employee.AllocateTo(Project) 没有问题Manager 类,在这两种情况下,这些类都对其行为和数据负责。
  • 谢谢 Geert,好吧,你每天都能学到新东西。我从来没有遇到过 n 元关联,尽管我可能只是不记得了,但很高兴知道它。我注意到它在 UML1.1 规范中,所以你去...
猜你喜欢
  • 2016-02-08
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多