多个类之间的依赖关系

时间:2010-04-01 05:27:41

标签: c# oop

我在组织多个班级之间的依赖关系的最佳方式之间混淆了 假设我有以下课程   雇员,   薪水, 数据访问

我应该去: 选项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

5 个答案:

答案 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.