【问题标题】:building flexible and reusable class hierarchy构建灵活且可重用的类层次结构
【发布时间】:2011-02-09 12:23:13
【问题描述】:

让我们回顾一些实体:

  • 公司
  • 合作者
  • 首席
  • 下属工人

有一些规则:

  1. 合作者可以是以下之一:销售经理员工
  2. 销售和经理可以有下属工人(第一条规则中描述的任何类型);
  3. 销售、经理、员工可以有主管;
  4. 每个角色都有自己的薪水 计算方法。

因此目标是创建灵活且可重用的类层次结构。


首先让我感到困惑的是“可以拥有”这个词。它应该作为一个组合来实现吗?如果说“可以有多少”,它应该是一个包含对象列表的组合吗?

我应该创建抽象类 Collaborator 然后从它继承其他 3 种类型还是有更聪明的方法?

将所有实体联系在一起并具有良好的可重用组件的最佳方法是什么?

【问题讨论】:

  • 工资计算规则是什么?每个职位都有不同的职位,还是有些职位共享薪水计算?
  • 我还要求澄清 Subordinate workersEmployees 以更好地了解这种关系。
  • @Steven Jeuris 每个角色都有自己的薪水计算,但 Collaborator 类保持共享 baseSalary。

标签: c# oop design-patterns


【解决方案1】:

"Can have" 以及其后跟 "workers" 的事实告诉我这是一个 "has a" 关系(组合),具有 0 到多关系(所以你提到的列表可能是空的)

抽象类 Collaborator 似乎是合理的。

【讨论】:

    【解决方案2】:

    可以在 UML 中表示为 (0..*),这意味着 0 或更多,是的,与对象列表组合会很好,使用集合而不是数组。

    Collaborator 是一个抽象类,因为不会有 Collaborator 本身的实例。继承 3 种 Collaborator 是我猜的最好的方式。

    我要补充一点,如果你的项目中只有一家公司,你需要实现Singleton设计模式。

    关于 Salary 使用虚方法并覆盖它。

    我希望这不是你的作业;)

    【讨论】:

    • 为简单起见,您可以只写* 而不是0..*
    • 不,这不是我的作业)有人问过我这个问题,并考虑将程序集可重用性作为目标..这个问题似乎不是那么微不足道。因为有很多关于业务对象的书籍。我只是无法想象使用角色的那种抽象。
    • 完全不需要单例。
    • @H.B 我知道(两者都经常使用),@helicera 我希望你得到你想要的。
    【解决方案3】:

    我发现这个问题表述不当,只需添加少量额外信息,设计就会发生重大变化。

    根据你写的,我可能会考虑创建以下类('-' 表示扩展):

    公司 AbstractCollaborator(首席成员,CalculateSalary() { return base + AdditionalSalary() },抽象 AdditionalSalary()) - 酋长 - AbstractLeader(列出下属) - 销售量 - 经理 - 员工

    酋长不会为自己设置酋长。我会尽量避免使用虚函数,而是尝试使用抽象函数。

    另一种选择是简单地使用一个类。只有销售或经理才能拥有下属,这很好,但在现实世界中,任何人都可能需要拥有下属。任何类型员工的功能都可以简单地由枚举值指定。

    这在很大程度上取决于你的目标......

    【讨论】:

    • @helicera:已更新以支持基本工资。
    【解决方案4】:

    我猜这个问题的答案是主观的,并且会根据您的需要而改变,但这是我将如何实现它:

    public class Company {
        public List<Collaborator> Collaborators { get; set; }
    }
    
    public abstract class Collaborator {
        public Collaborator(Company company) {
            company.Collaborators.Add(this);
        }
        public virtual Decimal Salary(object value);
        public Company Company { get; set; }
    }
    
    public class Sales : Collaborator {
        public override Decimal Salary(object value) {}
        public List<Collaborator> Subordinates { get; set; }
        public Collaborator Chief { get; set }
    }
    
    public class Manager : Collaborator {
        public override Decimal Salary(object value) {}
        public List<Collaborator> Subordinates { get; set; }
        public Collaborator Chief { get; set }
    }
    
    public class Employee : Collaborator {
        public override Decimal Salary(object value) {}
        public Collaborator Chief { get; set }
    }
    

    此代码未经测试。

    【讨论】:

    • 但是如何将它连接到公司实体?
    • 您没有描述与公司的联系。如果您只需要 Collaborator 类的功能,它可能只是 Collaborator 的列表。
    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 2017-09-25
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多