清洁架构实体

Clean Architecture Entities

据我了解,基于驻留在实体中的数据和业务规则是架构中最稳定的部分的假设,Clean Architecture 实体被布局为所有上层直接或间接依赖的层.

同时实体包含父层依赖的数据类,如果没有映射器用于数据,则其余数据。

但现实中的数据往往不够稳定

举个例子: 假设您有一款汽车销售应用。 汽车数据由结构描述,其中包含描述、品牌、价格等参数。 要求在变化,现在,在应用程序中混合了汽车,应该有销售摩托车的广告。有些字段与汽车相同,例如价格和描述,有些字段不同。

你不能把关于汽车和摩托车的数据放在一个结构中,因为这样可以添加任何类型的广告,并且结构会像癌瘤一样膨胀。

在更高层次上实现多态行为也是行不通的,因为这会产生结构本身的依赖+层次结构中的循环依赖,或者直接从上层到这个结构的依赖,这也是不好的.当然,您可以在整个映射器链中复制此行为,但这需要很长时间并且会增加代码量。

仍然需要创建一个单独的数据类型和转发此数据的整个分支,这同样不方便,并且在顶层添加了依赖项。

给人的印象是,当数据发生变化时,Clean Architecture 是脆弱的。

可能是我基础的东西不太懂,这个问题很容易解决? 如果是这样,请写下具体内容,如果不是 - 你能做点什么吗?)

我认为您将数据实体与业务实体或域实体混淆了。 您的术语 “稳定” 也令人困惑。您似乎在谈论可扩展性:您的应用程序允许使用新功能或业务规则进行扩展的程度,或者修改将如何破坏您的应用程序。

清洁架构 是关于应用程序架构的,而不是主要关于 class 设计。您提到的多态行为或数据类型是 class 级别的详细信息。

软件架构描述了应用程序的结构,不涉及实现细节或数据。就像盖楼一样,建筑不是在处理室内,而是在处理建筑物的结构。
这意味着由应用程序处理的数据本身对体系结构没有影响。

我认为 Clean Architecture 的关键是应用程序的干净结构,其中组件之间的依赖关系是从外到内的(见下图)。目标是创建具有强大业务逻辑的强大应用程序。
换句话说:更改 UI 或数据库不会影响业务逻辑。这使得架构相当“稳定”(就extensibility/modifications而言是稳健的)。
考虑到一个架构,其中业务逻辑直接与 UI 或数据库交互 with/depends,我们可以说该架构非常脆弱,因为对 UI 的修改也需要修改业务逻辑也是如此,即修改会破坏业务逻辑。 Clean Architecture 解决了这个问题。

你必须区分数据实体和业务实体。
数据实体保存您的业务逻辑所操作的数据。
领域实体封装了应用程序的实际业务规则(企业级)。

示例:应用程序旨在销售汽车。

A Car class 显然是一个数据模型,具有您描述的 descriptionbrandprice 等属性。您通常称此 数据实体 ,因为它是您的业务逻辑所操作的数据的容器。你装满这个容器,例如使用数据库中的数据并将其传输到视图层以进行显示和操作。用户操作这个数据实体,然后返回给业务层。

这种汽车销售应用程序的业务实体可以是封装了租车规则的 RentalAgreementLeaseAgreementPurchaseAgreement 以及更多(取决于实际企业业务)。这些 classes 还包含相关逻辑,例如,根据限制、税收、特别优惠或奖金等规则实际执行购买。这些实体可能反映企业级业务流程。

用例代表实际的业务逻辑。组合或操作业务实体以服务于多个用例(或用户故事)的逻辑。例如。以旧车换新车。
遵循 Clean Architecture,用例取决于实体,但不是相反(从外部到中心 - 见上图)。因此,用例不依赖于例如演示者组件。供演示者使用。

用例需要数据实体才能完成它们的工作。用例 “以旧车换新车” 需要一个 Car 实体存储旧车的相关数据,第二个 Car 存储新车数据
多态性是您在设计这些数据实体时应用的概念。

您可以引入抽象基类型 Vehicle。然后通过派生一个Car和一个Motorcycle.
来实现这个类型 广告应该是专用类型,例如Ads 不属于 Vehicle 类型层次结构。
您可以创建容器类型,例如Offer,它聚合了一个 Vehicle 和一个 Ads 实例。

在上面创建一个例如OfferCreator,它创建 Offer 实例并选择适当的 Ads.

这只是一个非常原始的例子。当遵循某些原则(例如 SOLID)时,遵循其模式可提供高度的可扩展性。这意味着,添加新类型的 VehicleAds 不会破坏业务逻辑。扩展业务逻辑本身也不会破坏应用程序。