多态性和简洁架构

问题描述 投票:0回答:1

我对干净的建筑比较陌生,我遇到了存在主义的怀疑。

在多态性的情况下,干净的架构是否期望将每个实现视为具有自己的存储库的实体?

假设我们正在开发一个应用程序,用于存储用户动物数据用于兽医目的。我们有一个抽象类 Pet,然后有不同的实现,如 Dog、Cat、Snake 等。每个实现都有其自己的特殊性,这迫使我们将它们单独存储在数据库中。

我是否应该将每个宠物视为一个实体(狗、猫、蛇...)并为每个宠物实现一个存储库? 如果是这样,当我想对普通动物进行 CRUD 操作时,将有一个巨大的条件列表,具体取决于动物类型,以查看要使用哪个存储库。这正常吗?

免责声明:以下示例是用 Dart 编写的

例如:

Future<void> saveAnimal(Animal animal)async{
if(animal is Dog)
 await _dogRepository.save(animal);
if(animal is Cat)
 await _catRepository.save(animal);
if(animal is Snake)
 await _snakeRepository.save(animal)
...
}

从罗伯特·马丁那里我听说多态性应该旨在减少这种情况。 来源: https://blog.cleancoder.com/uncle-bob/2021/03/06/ifElseSwitch.html

我考虑过在 Animal 中添加一个方法作为 save,但这取决于存储库,并且由于依赖倒置规则实体不能依赖于存储库。

例如:

abstract class Animal {
Future<void> save();
}

class Dog{
String name;
...

@override
Future<void> save() async {
 final repository = DogRepository();
 await repository.save(this);
}
dart polymorphism crud repository-pattern clean-architecture
1个回答
0
投票

清洁架构不需要您为每个实体拥有单独的存储库。它只要求遵循依赖规则,从而导致

  • 存储库接口通常在用例层定义
  • 存储库实现通常放在接口适配器或框架层。

在您的情况下,您可以在单个存储库中处理不同的宠物类型,甚至可以将所有宠物存储在一个数据库表中,具体取决于您想要为每种宠物类型存储的确切数据。

有关如何在清洁架构中正确实现存储库模式的更多方面,请参阅:https://youtu.be/pfhDO_hZixw

© www.soinside.com 2019 - 2024. All rights reserved.