Flutter的领域驱动设计设置
在您的Flutter代码库中开始使用领域驱动设计
[
Fred Grott
](fredgrott.medium.com/?source=pos…)
[
1 天前-4
](betterprogramming.pub/domain-driv…
这是一个关于Flutter的领域驱动设计的设置实例。我使用Flutter的骨架应用来保持简单。让我们开始吧。
核心或领域驱动设计
领域驱动设计的核心概念是使用价值对象作为其原子单元,与组件和层进行通信。这一次,我们要创建一个非常简单的值对象。
你会注意到,我们把它标记为不可变的,而且它使用了一个Equatable混合元素。因此,当我们把它作为一个基类时,那也往往是一个值对象。
首先,让我们来实现它。
现在让我们把它扩展成一个Model 。
然后是SampleItemModel 的实现。
现在让我们看看我们如何测试它。
我正在使用mocktail进行模拟,但是mockito 也有相同的基本API,这里是模拟。
还有Model 的模拟。
然后测试将是。
现在,请记住,这是一个只有listview模型而没有用户输入的骨架应用。
也没有访问任何非本地API的逻辑。因此,剩下的就是一个数据源,一个一次性使用的案例,以及列表视图模型。所以让我们来添加这个。
完成这个例子
让我们从实现列表视图模型开始。
而单元测试将是这样的。
现在我们需要为这个列表视图模型提供一个数据源。
对于数据源、存储库和用例的接口,我们使用Dartz 包。
现在,让我来谈一谈错误和异常。现在让我问一下,为什么我在这里不使用异常?有两个关键原因。
第一,任何时候抛出一个错误,它都会给出堆栈跟踪。
第二,很明显,我们正在映射我们的领域层,以便我们不抛出应用程序停止的异常。因此,我需要使用一个Error ,而不是一个异常类。
因此,数据源的单元测试是。
mock:
和单元测试。
最后我们有一个用例。
该接口。
和具体的实现。
而单元测试是。
推进
现在,我确实忽略了如何连接视图模型,但如果你遵循设置视图与服务组件和控制器的模式,就很容易添加。但是缺少什么呢?
我保持简单,没有添加DDD的其他部分,即价值对象机制和事件调度的其余部分。
其他的价值对象机制与改变实体到ValueObject(Types) 、设置验证器和其他集成有关。然后将其扩展为事件状态价值对象,并为用例、数据源、Repo和视图模型创建事件调度器。
简而言之,状态管理布线。相比之下,在Flutter的Clean Arch中,一般来说,人们只需使用BLoC或利用Redux对视图模型进行状态管理。
结论
这就是领域驱动设计的一些核心内容,可以开始了。接下来是创建更复杂的值对象和创建事件调度。示例代码可以在这个 repo 中找到。
[
GitHub - fredgrott/equatable_ddd_modeling: 使用 equatable 和 ddd 的 Flutter 演示项目
一个Flutter演示项目,展示了如何使用Equatable值对象作为接口和实现之间的胶水。
github.com
我所贡献的一些Flutter社区插件是。
Want to Connect?
资源
一些有用的资源(书籍链接是指档案馆的免费pdf和书籍借阅)。
- 材料设计3(Material You)规格
- Nielsen Norman Group是UI设计领域的顶级研究团体之一。有些信息是付费的,但仍有一个很好的基础,可以免费查看和使用。
- 唐纳德-诺曼的《日常事物》。
- Jakob Nielsen的《可用性工程》。
- Robert Martin的《Clean Arch》摘要在这里有一个gist。
- InfoQ对领域驱动设计的快速总结(PDF)
- A Course In Mastering The Art of Mixing Colors 作者:Betty Edwards
- Scott的Dart设计模式GitHub repo
- Josef Mueler的《平面设计中的网格系统》。
- 字型档案
- Stephen Coles的Anatomy Of Type In Six Letters(是的,这是Stephen Cole的网站,那里还有其他的精品)
- 字体细节
- David Airey的Logo设计之爱
- AIGA设计档案
- Dave Trott的《掠夺性思维》摘要。超越竞争者的思维大师课
- Bartosz Milewski的《程序员的类别理论》,PDF格式(即函数式编程和OOP类型理论)。
- 类的讲义和书籍资源