我正在尝试为我的项目管理软件绘制一个类图,描述以下场景。 它包含
经理可以创建项目
经理可以改变项目截止日期
经理可以更改项目名称
经理可以将员工分配给项目(单个项目只有一个分配的员工)
员工可以提交项目
并使用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方法的一个来自另一个类)?答案 0 :(得分:2)
在你的类图中,跳出来的两件事是你已经填充了箭头(这些在UML类图中没有意义 - 它们要么是开放箭头,要么是根据含义未填充的封闭箭头 - - 在下图中我添加了依赖(虚线箭头)和基本关联(实线箭头),这可能是你的意思)。另外,中间的钻石 - 这不是UML类图元素。这是一张纸条吗?
在面向对象方面 - 我假设你知道的一般原则 - 封装,抽象,多态等。通常,访问器(getter)和mutator(setter)方法是OO原则被打破的标志,因为它们倾向于意味着另一个类正在操纵(或被鼓励操纵)所讨论的类的内部(即打破封装)。 SetEmployee可能更多的是要求Project分配一个 - 所以像Project.Allocate(Employee)或Employee.AllocateTo(Project)这样的东西可能更有意义,并且不太可能鼓励封装被破坏。