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()
方法使用它对业务对象的引用来访问公共集合