【问题标题】:Entity of different type with a lot of fields - what is best approach to model it?具有很多字段的不同类型的实体 - 建模它的最佳方法是什么?
【发布时间】:2019-01-04 18:41:47
【问题描述】:

这个话题比标题要复杂一些。 假设我们要为实体建模。这类似于 KYC 信息(姓名、姓氏、地址等)。我可以在一个类中以简单的方式对此进行建模,例如:

public class KYCInfo {

    private KYCInfoType type;
    private String firstName;
    private String lastName;
    private Address personalAddress;
    private Address buisnessAddress;
    private String country;
    private String state;

    private LocalDate dateOfBirth;
    private String personalIdNumber;
}

正如您在上面的代码中看到的,这个 KYC 可以是不同的类型。实际上,该类型可以有两个值 - 商业和个人。对于企业来说,buisnessAddress 字段是必需的,对于个人来说,personalIdNumber 是必需的。另外,根据国家/地区字段,将需要其中一些字段。 State 字段适用于美国,但不适用于欧洲国家。将所有这些字段放在一个类中似乎是不合适的 - 每个实例,取决于字段都会有很多空值。例如,我可以为 BuisnessKYCInfoIndividualKYCInfo 创建单独的类。但是我会在字段中有一些重复(假设firstNamelastName 和其他一些字段对于两个类都是相同的)。我可以用通用字段创建一些抽象。喜欢:

public abstract class KYCInfo {

    private String firstName;
    private String lastName;
} 

现在想象这是一个简单的 DTO 类,并且在某个时刻我以某种方法在 processKYCInfo() 中处理它。当我有两个类 BuisnessKYCInfoandIndividualKYCInfothen I would need to have two methods ``processKYCInfo(BuisnessKYCInfo kycInfo)processKYCInfo(IndividualKYCInfo kycInfo)。此方法将执行相同的操作,但会从不同的字段收集信息。现在想象一下,你有比个人或企业更多的类型。或者正如我之前写的,额外的“类型”像country 一样出现。现在我需要有 25 个国家/地区,其中一些具有仅针对该国家/地区的字段。使用与以前相同的方法,我将有 25 种方法执行几乎相同的操作。这似乎也不合适。我还有什么其他的选择来建模这个?也许是一些数据结构,也许是一些 Map ?这样做的最佳方法是什么?我怎样才能以更通用的方式做到这一点?

【问题讨论】:

  • 你应该一次问一个具体问题。这太宽泛了,问题也太多了。一般性评论,我会将数据和业务逻辑分开,并为它们寻找不同的设计解决方案
  • 你说得对,这是一个非常广泛的问题,但它是一个类似于“在那种情况下你会使用什么设计模式”的问题。如果这里没有,我还应该在哪里寻找其他程序员的意见?
  • KYCInfo 的公共 API 是什么?
  • 在这种情况下,KYCInfo 更像是 DTO 对象,所以 getter、setter 是公开的

标签: java oop


【解决方案1】:

这是我的方法:

以下是我将使用的数据结构:-

  public class KYCInfo {
      private KYCInfoType type;
      private Map<String, String> name;
      private Map<String, String> address;
      private String country;
      private String state;
      private LocalDate dateOfBirth;
      private String personalIdNumber;
      public KYCInfo(){
          name = new HashMap<>();
          address = new HashMap<>();
  }

那么这种方法的优点是什么:-

  • 不要创建多个相同类型的属性,而是创建一个族。例如name 将是 'firstName'、'middleName'、'lastName' 的家族。这对将像 , 等。这样你可以拥有它们中的一个或全部。
  • 对于地址等其他属性也是如此。这对可以像 ,
  • 每条记录都可以有自己的家庭类别。

【讨论】:

  • 其他字段呢,比如说personalIdNumber。它仅对个人有效。当您有同一对象的多个变体(例如个人地址 buisnessAddress)时,使用地图的想法很好。但也许整个对象可以实现为 Map ?
  • 是的,对于同一对象的多个变体,您是正确的。是的,我认为每个属性都可以被视为家庭,并且可以在其中拥有成员。这种方法将解决您拥有多种处理方法的问题。希望这会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2011-03-31
相关资源
最近更新 更多