Java 如何用不同的数据表示相似的对象

Java 如何用不同的数据表示相似的对象,java,web-services,oop,soap,object-oriented-analysis,Java,Web Services,Oop,Soap,Object Oriented Analysis,我们有以下情况。我们有几个存储文档的存储库。我们编写了前端服务,用于处理不同存储库中的文档和文档数据。我们的操作允许您存储新文档和检索文档元数据 问题是,存储库中有不同类型的文档,每个文档都有不同的元数据集。例如,一个存储库中的所有文档都具有文档名称、添加日期、大小、ID、文档类型和文档源。账单文件还包含账单账号和客户名称。保单文件包含保单编号、被保险人姓名和代理代码。一些特殊政策文件还具有生效日期和数据包类型 在第二个存储库中,文档具有文档名称、添加日期、大小、类型和位置。发票(另一个存储库中

我们有以下情况。我们有几个存储文档的存储库。我们编写了前端服务,用于处理不同存储库中的文档和文档数据。我们的操作允许您存储新文档和检索文档元数据

问题是,存储库中有不同类型的文档,每个文档都有不同的元数据集。例如,一个存储库中的所有文档都具有文档名称、添加日期、大小、ID、文档类型和文档源。账单文件还包含账单账号和客户名称。保单文件包含保单编号、被保险人姓名和代理代码。一些特殊政策文件还具有生效日期和数据包类型

在第二个存储库中,文档具有文档名称、添加日期、大小、类型和位置。发票(另一个存储库中的账单文档)有账号和客户名称,还有发票日期。保单文件包括保单编号、被保险人姓名、代理代码、生效日期和保单类型。一些特殊政策文件有取消日期和到期金额

现实更复杂,但这代表了我面临的基本问题

我实际上无法控制现有的元数据字段。这些都是在别处定义的,其中一些是遗留下来的。此外,这些都是soapweb服务,但最终将变成RESTful。但现在,它们是由WSDL定义的

那么,表达这些有很多相似之处,但也有一些不同之处的事物的最佳方式是什么呢

其中一些考虑:

  • 我希望尽可能地保护客户机不受存储库特定信息的影响。在一个完美的世界中,客户不应该关心文档是来自一个存储库还是另一个存储库,尽管不同的字段可能会让这成为一个白日梦
  • 我想要一个newDocument和getDocumentProperties调用来接受和返回每种类型的相关数据,而不是为每种不同的文档类型单独调用new和get
我可以使用一个包含所有可能字段的大型对象和一个枚举来区分它们,但这意味着客户端必须神奇地知道哪些字段适用,哪些字段不适用

对于每一组可能的文档字段,我可以使用一个特定的对象,但是客户机必须知道文档是要到某个特定的存储库还是来自某个特定的存储库,这超出了我希望他们知道的范围

现在,我选择了两个世界中最好的(或最坏的?),使用一些高级抽象(策略文档、账单文档),在我可以的地方进行转换,并将该抽象的任何未知或未定义的数据留空

但这意味着客户仍然必须知道,例如,对于某些账单单据,您将有发票日期,但对于其他单据,您不会。或者,对于一个存储库中的文档,您将有一个ID,但对于另一个存储库,您将有一个位置

无论如何,我正在寻找处理这类类似但不同对象的最佳实践

那么,表达这些有很多相似之处,但也有一些不同之处的事物的最佳方式是什么呢

我认为如何表示/建模数据的方法取决于您的应用程序需求,而且据我所知,没有一种全球公认的最佳实践,其中一些(全部?)选项包括:

  • 使用键值对映射文档字段
  • 一个胖对象,每个可能的字段
  • 具有仅包含共享字段的类的精简层次结构
  • 精简层次结构+动态元数据(例如,BillingDocument仅包含共享字段,还包含包含此存储库特有字段的映射)
  • 具有用于保存唯一字段的子类的复杂层次结构(例如BaseBillingDocument、RepoonBillingDocument、Repo2BillingDocument)
  • 其中一些考虑:

    我希望尽可能地保护客户机不受存储库特定信息的影响。在一个完美的世界中,客户不应该关心文档是来自一个存储库还是另一个存储库,尽管不同的字段可能会让这成为一个白日梦

    这是一个业务问题而不是技术问题,通过丢弃不必要的字段来规范数据,将其声明为可选字段,并且有时应为空,如果缺少的值是从其他公共属性派生的,则计算缺少的值,或者接受同一文档具有不同子类型的事实(BillingDocRepo1、BillingDocRepo2)

    我想要一个newDocument和getDocumentProperties调用来接受和返回每种类型的相关数据,而不是为每种不同的文档类型单独调用new和get

    这在所有表示中几乎都是可行的,REST和SOAPWeb服务都支持继承和多态性,如果您使用动态模式(例如带有元数据的实例或类的映射),这也是可行的