LCJ*_*LCJ 7 c# oop ooad domain-driven-design solid-principles
我有为HR系统开发的系统.有会计员工和程序员员工.在加入公司的第一个月,员工没有任何角色.一名员工可以同时是会计师和程序员.我有一个由以下代码显示的设计.
现在,我需要通过实现新功能来增强系统:
终止所有会计师.(终止表示将员工的状态设置为IsActive = false).问题是我不能在没有检查的情况下将所有会计师直接设置为非活动状态.我需要检查一下他是否还有其他角色.
如何重新构造这些类以使终止函数更自然OO?
UPDATE
我正在寻找一个有@AlexDev答案的EF Database First解决方案模型和数据库架构的答案.
C#代码
List<Accountant> allAccountants = Get All accountants from database
public class Employee
{
public int EmpID { get; set; }
public DateTime JoinedDate { get; set; }
public int Salary { get; set; }
public bool IsActive { get; set; }
}
public class Accountant : Employee
{
public Employee EmployeeData { get; set; }
}
public class Programmer : Employee
{
public Employee EmployeeData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

@AlexDev答案
public class Employee
{
...
IList<Role> Roles;
bool isActive;
public void TerminateRole(Role role)
{
Roles.Remove(role);
if(Roles.Count == 0)
{
isActive = false;
}
}
}
public class Role
{
abstract string Name { get;}
}
public class ProgrammerRole : Role
{
override string Name { get { return "Programmer"; } }
}
Run Code Online (Sandbox Code Playgroud)
参考
要使用您正在使用的结构,除了可能会将新角色添加到系统中以及C#中不存在的新角色之外,还需要为会计师和程序员进行多重继承.你应该考虑不同的设计.一种可能性:
public class Employee
{
...
IList<Role> Roles;
bool isActive;
public void TerminateRole(Role role)
{
Roles.Remove(role);
if(Roles.Count == 0)
{
isActive = false;
}
}
}
public class Role
{
abstract string Name { get;}
}
public class ProgrammerRole : Role
{
override string Name { get { return "Programmer"; } }
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以为每种类型子类化Role,并且您可以决定仅终止一个角色或所有角色.
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |