实现类似的UseCases看起来像代码重复

Jak*_*zyk 5 oop design-patterns

我有以下情况.用户可以将多种对象类型(交易,发票等)导出到外部会计系统.导出算法有步骤:

  • 通过某些过滤器获取对象
  • 将对象逐个导出到会计系统(每个对象类型的Web服务方法)
  • 注册给定文档已导出的事实,因此不会再次导出
  • 准备用户摘要(导出文件数量,错误消息等)

所有对象类型的算法都相同,但必须处理一些重要的差异:

  • 不同种类
  • 不同的目标Web服务方法,不同的对象到DTO映射
  • 每种对象类型不同的过滤器

我考虑了一些解决方案:

  • 不要将导出算法视为代码重复,并为每个对象类型实现算法.可以通过这样的算法描述将任何数据导出到任何外部系统 - 这是否意味着我们应该总是有一个通用类将任何东西导出到任何地方?:)
  • 将差异转移到策略(一个策略接口为所有差异创建抽象) - 我甚至实现了它.
  • 使用泛型 - 不幸的是我用PHP编码,但这是不可能的

问题:

是否为每个对象创建一个单独的导出算法类型代码重复?

也许所有这些都应该被视为单独的用例?

如果它是重复的,那么我应该考虑哪些技术来避免它?

我的第一次实施说明:

在第一种方法中,我定义了一个可导出的抽象,但我对它并不满意.每个对象的有效负载完全不同.一个Exportable接口只定义了一个方法getId,它用于注册该对象被导出(并且由于它不会再次导出).为此目的,抽象很好,但问题转移到了exportService,它必须检查具体实例以选择DTO映射器和端点.所以exportService打破了SOLID.

Jos*_*off 0

您上面描述的所有内容都不是特定于域的逻辑(事实上您甚至没有在问题中提及问题域),因此我认为它并不真正属于域驱动设计。因为它不是特定于域的逻辑,所以我不会太担心代码重复,特别是考虑到解决方案似乎并不明显。

保持简单,只需分别写出每个用例即可。如果您发现有很容易重构的通用代码,请在一切顺利之后再进行重构。在显然有必要之前,不要想太多或添加模式。