每个类的责任以及它们如何在UML中相互作用

时间:2018-06-17 13:59:12

标签: php oop uml encapsulation ooad

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

  • 项目
  • 管理器
  • 员工

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

为上述要求创建了此类图 enter image description here

并使用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 - 另一个是糟糕的练习类访问另一个类setter,getters(调用setter,getter方法的一个来自另一个类)?

1 个答案:

答案 0 :(得分:2)

在你的类图中,跳出来的两件事是你已经填充了箭头(这些在UML类图中没有意义 - 它们要么是开放箭头,要么是根据含义未填充的封闭箭头 - - 在下图中我添加了依赖(虚线箭头)和基本关联(实线箭头),这可能是你的意思)。另外,中间的钻石 - 这不是UML类图元素。这是一张纸条吗?

enter image description here

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