我在组织多个班级之间的依赖关系的最佳方式之间混淆了 假设我有以下课程 雇员, 薪水, 数据访问
我应该去: 选项1
Employee emp = new Employee();
Salary sal = new Salary();
DataAccess data = new DataAccess();
sal.Calculate(emp);
data.Save(emp);
或Option2
Employee emp = new Employee();
Salary sal = new Salary();
sal.Calculate(emp); //once salary has been calculated salary object will initialize data access class to do the actual saving.
或选项3
Employee emp = new Employee();
emp.Calculate(); // employee object will encapsulate both the salary and data access object
答案 0 :(得分:1)
在我看来,'CalculateSalary'应该是作为其他对象的一部分发生的事情,并且会给出关于该员工的各种信息。某种'SalaryCalculator'对象,也许......有点像:
employee.Salary = SalaryCalculator.CalculateFor(employee);
关于储蓄如何发生;好吧,我将这个留给你个人使用的ORM。
答案 1 :(得分:1)
通常员工有工资。所以我会选择以下内容:
Employee emp = new Employee();
emp.Salary = new Salary();
您可以创建一个通用类来获取其中的所有工资计算业务规则(来自数据源),并根据员工属性计算员工的工资。
SalaryCalculator.CalculateSalary(emp); //I'd agree with Silky
DataAccess.Save(emp); //This shall save changes in emp as well as in salary.
<强> - 编辑 - 强>
这是对你的评论的回应。
您的hrms
对象(如果有)应封装Employee
,并提供CalculateSalary
选项。
如下:
yourHrms.Employees.Add(new Employee(Age, Name, DateOfBirth, EmployedSince, TotalExperience, IsManager, new Salary(someStartPointForSalaryIfAny));
这里你的Salary类将从你的abstact BaseSalary类继承,它将包含业务规则,并将执行Calculate()
离子。因此,new Salary(someStartPointForSalaryIfAny)
将在内部执行计算。
要保存对象,您可以:
yourHrms.Employees.Save();//Saves all employees.
yourHrms.Employees[0].Save();//Save this.
答案 2 :(得分:0)
简短的回答是“取决于”。
对于薪资计算等大多数情况,我的指导原则是查看计算所需的数据。如果大多数输入属于ClassA,则表明它应该是ClassA的方法。
然而,持久性是一种特殊情况。坚持是一种“服务”;你告诉别人把它写到磁盘上供以后检索。没有任何一个对象被访问的状态。因此,创建一个无状态服务,接受需要序列化/反序列化的输入
DAO_Service.Save(anEmployee);
DAO_Service.Save(preferences);
DAO_Service.Save(taxRecord);
答案 3 :(得分:0)
同意取决于的答案。
如果您想保持域模型的清洁(逻辑非常复杂),您可以要求对象计算值(如果它不需要来自其他来源的某些外部数据)并使用其他服务来保持持久性。
但是,您可以将 DataAcccess 放入对象中(如果逻辑看起来很简单),并将它们用作其他服务和持久版本之间的某种代理,但不要忘记将 DataAccess 作为接口(在setter或构造函数中)注入对象,以便能够轻松测试或更改。
答案 4 :(得分:0)
您可以为Employee实施ActiveRecord模式,如下所示:
Employee emp = new Employee();
emp.Salary = SalaryManager.CalculateSalary(emp);
emp.Save(); //Save to some IDataStore logic.