纯制造与间接的区别

Joh*_*ham 13 oop design-patterns grasp

我试图找到教程和很好的例子来解释这两者之间的差异,但却无法找到任何信息.

纯粹的制造和间接行为可以创造和分配中间对象的责任,那么任何人都可以解释这些设计模式之间的区别吗?

谢谢!

Gor*_*don 18

如果要在组件之间创建较低的耦合,请使用间接.Larman在Apply UML和Patterns中建议的示例是TaxCalculatorAdapter类.为了保护客户端不必知道可能的适配器的内部工作,他用间接隐藏它们,只暴露所需的API.这个间接将与适应者高度耦合,但只与客户松散耦合.

PersistentStorage 从纯虚构的确是一个Indirecton(Larman与书中规定的话),因为它提供较低的耦合.Pure Fabrication除此之外,它创建的对象不属于您的域模型.

Larman给出的示例是域类Sale.由于Sale要保存所有数据,因此保留销售的逻辑也是候选者(信息专家).但是,持久性逻辑与销售概念无关,因此该类将变得不连贯.此外,通过将Sale与特定的DB API相结合,可以限制重用(间接到救援).并且因为保存是一般活动,您可能还会在需要保存的对象中复制代码.为了避免这种情况,你做了一些事情(纯粹的制作),这意味着你创建了一些不属于Domain模型的东西(这里:a PersistentStorage),但仍然在你的应用程序中捕获了一个重要的活动.

因此,Pure Fabrication它是Indirection的专业化或者更确切地说.

  • 我想补充一点,*纯粹的制造*根据定义是**非常有凝聚力的**。您创建它们是因为您的职责不能轻易分配(通过*间接*)给另一个类。拉曼提到“绝望”:-) 因此,通过创建一个新类来承担这一责任,该类将非常有凝聚力,因为它只做一件事。 (2认同)

Saz*_*han 5

纯制造和间接都是GRASP的原则。这篇dzone 文章中的以下示例可能会清除您关于pure fabrication和 的概念indirection

纯制造:

我们知道银行系统的域模型包含诸如AccountBranchCashCheckTransaction等类。域类需要存储有关客户的信息。为了做到这一点,一种选择是将数据存储责任委托给域类。此选项将降低域类的内聚性(多个职责)。最终,这个选择违反了SRP原则。

另一种选择是引入另一个不代表任何领域概念的类。在银行业示例中,我们可以引入一个名为 的类PersistenceProvider。此类不代表任何域实体。该类的目的是处理数据存储功能。因此PersistenceProvider纯属捏造。

间接:

这一原理回答了一个问题:如何使物体以一种使它们之间的联系保持较弱的方式相互作用?

解决方案是:将交互的责任交给中间对象,以便不同组件之间的耦合保持较低。

例如,软件应用程序可以使用不同的配置和选项。为了将域代码与配置分离,添加了一个特定的类 - 如下清单所示:

Public Configuration{
  public int GetFrameLength(){
    // implementation
  }
  public string GetNextFileName(){
  }
 // Remaining configuration methods
}
Run Code Online (Sandbox Code Playgroud)

这样,如果任何域对象想要读取某个配置设置,它将询问配置类对象。因此,主代码与配置代码解耦。

如果您已阅读纯制造原理,那么此配置类就是纯制造的示例。但间接的目的是为了实现解耦。另一方面,纯制造的目的是保持领域模型干净并仅表示领域概念和职责。

许多软件设计模式(例如AdapterFacade、 和 )Observer都是间接原则的特化。