繁体   English   中英

OOP设计:如何为可以成为债务人,债权人,牵头人或仅仅是关系人的公司建模?

[英]OOP design: how to model a company which can be a debtor, creditor, lead or is just a relationship?

我正在尝试一种在新项目中为公司对象建模的好方法。 所在的公司已经拥有大量数据:办公地址,电话号码,电子邮件地址,员工(还有多个角色:项目成员,销售代表等),您可以为它命名。 现在,在关系方面,一家公司可以与另一家公司开展业务。 通常,一家公司购买或出售给另一家公司。 但这也可能是双向的情况,两家公司都在彼此之间进行买卖。 我想在可以处理这些情况的模型中对这些关系进行建模。 除此之外,我还需要能够将公司添加到我的管理部门中,而这还与我没有任何关系,只是一种关系。 我还不想填写所有债务人的详细信息,也不要给他们一个债务人的编号。 在成为债务人之前,遗嘱首先成为牵头人。 我不想丢失类,因为我不想复制所有数据。 例如,如果我开始从另一家公司买卖,则人员和联系信息不会更改。

我的问题是:如何为公司建模,使其具有多个角色? 一些伪代码或类图会很好!

在此先感谢您为我提供的帮助。

问候,泰德

有很多方法可以使这只猫变皮,并且提出建议确实需要详细了解系统的要求以及足够的时间来考虑这些选项。 但是,假设不能导出这些关系(请参阅最后一段),我可能会考虑以下内容:

public class Company
{
    public string Name { get; set; }        
    public IEnumerable<Relationship>
    {
        get { ... }
    }
}

public class Relationship
{
    public RelationshipType { get; set; }
    public Company { get; set; }
}

public enum RelationshipType
{
    Other,
    Debtor,
    Creditor,
    Lead,
}

假设就您的OO模型而言,关系之间的差异是微不足道的。 但是,如果您需要从特定于您的关系的行为类型,那么我将考虑子类型化,例如:

public class Relationship
{
    public Company { get; set; }
    public virtual void Foo()
    {
        ....
    }
}

public class Debtor : Relationship
{
    public override void Foo()
    {
        ....
    }
}

public class Creditor : Relationship
{
    public override void Foo()
    {
        ....
    }
}

public class Lead : Relationship
{
    public override void Foo()
    {
        ....
    }
}

要考虑的另一件事是,这些关系最终是公司之间的交互作用的派生。 例如,当且仅当X公司欠Y公司钱时,X公司才是Y公司的债务人。您的系统中是否包含此信息? 如果是这样,您是否真的想对信息进行非规范化,还是即时获取此信息会更好? 如果此信息在您的系统外部,并且您的系统专门用于保留对这些事实的反规范化,则可以忽略此段。

我认为您正在寻找AccountabilityParty概念。 各方可以是公司,也可以是员工。 可以通过问责制将两方联系起来。 这种问责制描述了双方之间的关系。 使用这些概念,可以在不同类型的参与方之间对不同类型的多个链接进行建模。

这实际上是Fowler在有关问责制的文章中描述的一种分析模式。

如前所述,使用装饰器可以使您将一种类型的关系“转换”为另一种类型的关系(并使同一公司的参照身份保持不同的角色)。 我建议的唯一更改是将每种关系类型保留为自己的集合,如下所示:

public class Company
{
    public string Name { get; private set; }        
    public ISet<Debtor> Debtors { get; private set; }
    public ISet<Creditor> Creditors { get; private set; }
    public ISet<Lead> Leads { get; private set; }
    ...
}


public class CompanyRole
{
    public Company innerCompany { get; set; }

    //Override to allow equality of the same company across Roles
    public override bool Equals(object other) 
    {
       if(other is Company) 
          return ((Company) other).Name.Equals(innerCompany.Name);
       else if(other is CompanyRole) 
          return ((CompanyRole) other).innerCompany.Name.Equals(innerCompany.Name);
       else 
          return false;
    }

    public override int HashCode() 
    {
       return innerCompany.Name.HashCode();
    }
    ....
}

public class Debtor: CompanyRole 
{
    ....
}

public class Creditor: CompanyRole  
{
    ....
}

public class Lead: CompanyRole  
{
    ....
}

这将使您在查找特定类型的关系时可以大大简化查询,而不会因为过多的类似连接的结构而发疯,例如“ ... where myCompany.Debtors.Contains(otherCompany)...”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM