我正在为人力资源系统开发系统。有会计员工和程序员员工。加入公司的第一个月,员工没有被赋予任何角色。一名员工可以同时担任会计师和程序员。我有一个由以下代码所示的设计。
现在,我需要通过实现新功能来增强系统:
解雇所有会计师。 (终止意味着将员工的状态设置为 IsActive = false)。问题是我无法在不检查的情况下直接将所有会计师设置为非活动状态。我需要检查一下他是否还有其他角色。
如何重构这些类以使终止函数更加自然的面向对象?
UPDATE
我正在寻找一个具有 EF Database First 解决方案模型和 @AlexDev 答案的数据库架构的答案。
C# Code
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; }
}
@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"; } }
}
参考
- 访问外部信息的 DDD 方法 https://stackoverflow.com/questions/11241541/ddd-approach-to-access-external-information
- 更喜欢组合而不是继承? https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance/11758048#11758048
- 域模型中的继承与枚举属性 https://stackoverflow.com/questions/4254182/inheritance-vs-enum-properties-in-the-domain-model/4259033#comment15499738_4259033
- 实体框架:获取存储库中的子类对象 https://stackoverflow.com/questions/11683536/entity-framework-get-subclass-objects-in-repository
要使用您正在使用的结构,您需要会计师和程序员的多重继承,此外可能会向系统添加新角色,而这在 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"; } }
}
然后,您可以为每种类型创建 Role 子类,并且可以决定仅终止一个角色或全部角色。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)