C# 拥有';经理';用一个物体做某事,还是让物体自己做某事?
我一直在探索向以前由“管理者”或“控制器”处理的对象添加功能的便利性。我只是担心这样做会不会有什么问题。我看到的主要问题是耦合 例如,让我们使用从企业解雇员工 以前我的工作是这样的:C# 拥有';经理';用一个物体做某事,还是让物体自己做某事?,c#,design-patterns,C#,Design Patterns,我一直在探索向以前由“管理者”或“控制器”处理的对象添加功能的便利性。我只是担心这样做会不会有什么问题。我看到的主要问题是耦合 例如,让我们使用从企业解雇员工 以前我的工作是这样的: class Employee { // Does employee stuff } class Business { public List<Employee> employees } class BusinessManagement { Business buisness
class Employee
{
// Does employee stuff
}
class Business
{
public List<Employee> employees
}
class BusinessManagement
{
Business buisness
public void FireEmployee(Employee employee)
{
business.employees.Remove(employee);
}
}
class员工
{
//员工的东西吗
}
阶级商业
{
公开名单雇员
}
班级业务管理
{
商业
公共作废FireEmployee(员工)
{
business.employees.Remove(员工);
}
}
现在我一直在尝试:
class Employee
{
Business business
Fire()
{
business.employees.Remove(this);
}
}
class Business
{
public List<Employee> employees
}
class员工
{
生意
火()
{
业务。员工。移除(此);
}
}
阶级商业
{
公开名单雇员
}
后一种方法很好,也很方便,因为你只需要一个员工的参考,你可以在任何你喜欢的地方解雇它。你也不需要管理类。 < P>我认为你担心在这里避免耦合是正确的,我会认为你的例子是不好的练习。但是,让我们打开包装,展示一种方法,我们可以通过类之间更易于理解、预测和维护的契约来实现相同的行为 一个企业有很多员工,它知道自己雇佣的是谁——因此它拥有一组对
Employee
对象的引用是有意义的。员工(为了简单起见)为一个业务工作,因此员工
包含对业务
对象的引用是有意义的。这些引用不一定以否定的方式将类耦合在一起,只要它们之间的契约明显位于每个对象上的公共方法中,这些对象的调用由该类控制,并且其业务逻辑是该类所关注的
企业解雇员工,员工也需要知道自己被解雇了。如果我要这样做,我会将Fire(Employee e)
方法放在Business
类上-在这个方法中,我很可能希望调用e.GetFired()
,然后从员工集合中删除该员工。然后,Employee.GetFired()
将Employee
自己的Business
属性设置为null
这可以在两个方向上工作,同时保持这些类之间的分离。员工大概可以辞职-因此,employee.quit()
可以调用Business.EmployeeHasQuit(employee e)
,将自身作为引用传入-允许Business
实例自行负责从集合中删除employee
实例
您的示例是一个耦合示例,因为Employee类“GetFired()
方法使用它对业务对象的引用来访问公共集合并删除自身。如果Business.Fire(Employee e)
方法集e.Business=null
,那么它也将是耦合的。合理的经验法则是,类不应该直接修改其他类的成员;通过让每个类管理自己的状态,您可以实施行为以确保事情始终处于有效状态,并触发其他必要的行为(例如,我们希望确保当员工离职时,他们的安全通行证被吊销,这将在EmployeeHasQuit()内发生)
–如果员工刚刚从企业的集合中删除了自己,情况就不是这样了。企业可能还希望有机会将辞职或被解雇的员工放入formerEmployees集合中,以便以后跟踪他们
希望这是一个易于消化的例子,对象可以互相沟通,同时保持对自己的状态和行为的完全责任! < P>我认为你担心在这里避免耦合是正确的。我会认为你的例子是不好的实践。但是让我们解开,并展示一种方式。我们可以通过类之间更易于理解、预测和维护的契约来实现相同的行为 一个企业有很多员工,它知道自己雇佣的是谁——因此它拥有一组对
Employee
对象的引用是有意义的适用于一个业务,因此员工
包含对业务
对象的引用是有意义的。这些引用不一定会以负面的方式将类耦合在一起,只要它们之间的契约在每个对象(其调用由该类控制)的公共方法中明确存在,并且该类关注的是业务逻辑
企业解雇员工,员工也需要知道他们被解雇了。如果我要这样做,我会将Fire(employee e)
方法放在business
类上-在这个方法中,我很可能想调用e.GetFired()
然后从员工集合中删除该员工。然后,employee.GetFired()
将员工的业务属性设置为null
这可以在两个方向上工作,同时保持这些类之间的分离。员工大概可以辞职-因此,employee.quit()
可以调用Business.EmployeeHasQuit(employee e)
,将自身作为引用传入-允许业务
实例自行负责从集合中删除员工
实例
您的示例是一个耦合示例,因为Employee类“GetFired()
方法使用它对业务对象的引用来访问公共集合