【发布时间】:2014-05-21 10:20:45
【问题描述】:
问题是为员工/经理系统设计一个结构。
1) 员工属于经理。
2) 一位经理有多名员工。
3) 经理也可能属于经理。
4) 员工只有一名经理
设计数据结构,使其支持以下操作:删除员工/经理,晋升(员工成为经理)。
任何编程语言都可以。
注意:我不想要代码。口头解释就好了。
【问题讨论】:
问题是为员工/经理系统设计一个结构。
1) 员工属于经理。
2) 一位经理有多名员工。
3) 经理也可能属于经理。
4) 员工只有一名经理
设计数据结构,使其支持以下操作:删除员工/经理,晋升(员工成为经理)。
任何编程语言都可以。
注意:我不想要代码。口头解释就好了。
【问题讨论】:
我的第一个想法是使用 employee 作为基类,并使用属性 manager 作为指向经理对象(以及其他必要的属性,如“id”)和类的指针manager,继承自 employee 并带有指向员工的指针列表。
这可以包装在一个模型中,该模型包含所有员工/经理的列表以及“提升(员工)”等方法。 Employee 也可以有一个像“promote”这样的方法,它返回一个经理对象。经理类可以有一个带有员工参数的构造函数...
更新(C# 代码):
public class Employee
{
public string ID;
public Manager Manager;
public Manager promote() { return new Manager(this); }
public Employee() { }
}
public class Manager : Employee
{
public List<Employee> Employees;
public Manager() { }
public Manager(Employee employee) {...}
}
public class EmployeeModel
{
private List<Employee> employees;
public List<Employee> Employees { get { return this.employees; } }
public void addEmployee(...) {...}
public void removeEmployee(...) {...}
public void promoteEmployee(...) {...}
}
好像是这样的……
【讨论】:
您只需要一张桌子:
CREATE TABLE employees (
id integer NOT NULL,
name varchar(50) DEFAULT NULL,
manager_id integer DEFAULT NULL,
PRIMARY KEY (id)
)
这个表有一个对自身的引用(manager_id->id)。
如果记录在“manager_id”字段中的值为 NULL,那么它是一个顶级经理。所有其他记录在“manager_id”字段中应该有一些值,这是对 PrimaryKey 字段“id”的引用
【讨论】:
从设计的角度来看,我会使用复合设计模式。 【复合图】:http://en.wikipedia.org/wiki/File:Composite_UML_class_diagram_(fixed).svg。每个员工(可能是经理)都持有指向其经理的指针,并且每个经理都持有指向其员工的指针列表。但只有一个类( Employee )。
【讨论】:
我会说首先找出实体(您已经拥有,员工和经理)。 现在根据您的约束找出关系:
经理对员工(一对多)
员工到经理(一对一)
员工可以是经理。
选项
Class 员工,其中“有”(关联)List of Employee
Employee reportsTo)的引用。以上两个选项中的疼痛区域: 选项#1 如果您删除经理,那么员工列表将成为孤儿(没有经理的员工) 选项#2 如果您想查看单个经理下的所有员工,那么您需要遍历所有员工以获取经理的员工 ID。
期待其他答案。
【讨论】: