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

标签 java web-services oop soap object-oriented-analysis

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

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

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

现实情况要复杂得多,但这代表了我遇到的基本问题。

我实际上无法控制现有的元数据字段。这些是在其他地方定义的,其中一些是遗留的。此外,这些都是 SOAP Web 服务,但最终将变成 RESTful。但目前,它们是由 WSDL 定义的。

那么,表示这些有很多相似之处但又存在一些差异的事物的最佳方式是什么?

一些考虑因素:

  • 我希望尽可能多地保护客户端免受特定于存储库的信息的影响。在完美的世界中,客户不应该关心文档是否来自一个存储库或另一个存储库,尽管不同的字段可能使这成为一个白日梦。
  • 我希望通过一次 newDocument 和 getDocumentProperties 调用来接受并返回每种类型的相关数据,而不是针对每种不同的文档类型分别进行 new 和 get 调用。

我可以使用一个包含所有可能字段的大对象和一个枚举来区分它们,但这意味着客户端必须神奇地知道哪些字段适用,哪些字段不适用。

我可以为每个可能的文档字段集使用一个特定的对象,但随后客户端必须知道该文档是否将前往或来自特定的存储库,这超出了我希望他们知道的范围。

目前,我已经采用了两个世界中最好的(或最差的?),采用了一些高级抽象(策略文档、计费文档),在可以的地方进行转换,并留下任何未知或未定义的数据那个抽象是空的。

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

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

最佳答案

So, what's the best way to represent these things that have many similarities, but some differences?

我认为如何表示/建模数据的方法取决于您的应用程序要求,并且据我所知,没有全局公认的最佳实践,一些(全部?)选项是:

  1. 使用键值对映射文档字段
  2. 一个胖对象包含所有可能的字段。
  3. 层次结构很薄,类仅包含共享字段。
  4. 精简的层次结构 + 动态元数据(例如 BillingDocument 仅包含共享字段,还包含一个包含此存储库特有字段的映射)
  5. 具有子类的复杂层次结构,用于保存唯一字段(例如 BaseBillingDocument、RepoOneBillingDocument、Repo2BillingDocument)

Some of the considerations:

I'd like to shield the client from as much repository-specific info as possible. In a perfect world, the client shouldn't care if the doc is from one repository or another, although the different fields may make this a pipe dream.

这是一个业务问题,而不是技术问题,通过丢弃不必要的字段来标准化数据,将它们声明为可选字段,并且有时应该为空,计算缺失值(如果它们源自其他常见属性或与其他属性一起使用)事实上,同一文档有不同的子类型(BillingDocRepo1、BillingDocRepo2)

I'd like a single newDocument and getDocumentProperties call to accept and return the pertinent data for each type, rather than have individual new and get calls for each different document type.

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

关于java - 如何用不同的数据表示相似的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49903542/

相关文章:

java - 网络文件系统中的 java.io.File.createNewFile() 是原子的吗?

java - 通过 JNI NewObject 创建实例时 jvm.dll 中出现异常 0xC0000005

客户端上的 .NET 日志 Soap 请求

java - 在没有 web.xml 的 Jersey 中出现 404 错误

Javascript 继承 : Parent's array variable retains value

java - 使用 JavaScript 传递属性值

java - 使用 Guice 使用属性连接库对象

android - Web服务SocketTimeOutException导致数据库不一致

java - 在接口(interface)方法的 throws 子句中放什么?

javascript - 了解 Javascript 中的功能范围、 `this` 和 OO 设计模式