(2025.03.16 Sun)
Domain-Driven Design, DDD
在软件设计的DDD方法中,domain指的是所开发软件的核心业务逻辑、该软件/服务所要解决的问题。DDD鼓励开发者与业务专家/业务方紧密合作、根据该业务/领域的真实世界(real-world)概念完成开发,而非直接开始写代码。
DDD步骤:
- 理解领域的业务逻辑:理解软件所要解决的的业务问题
- 与领域专家合作:以了解所要解决业务问题的规则、条款、概念,称为uniquitous language
- 对领域建模:用类和对象将业务内容翻译为代码,目标是用软件模拟业务运行的真实情况
Repository Pattern 仓库模式
仓库模式是DDD的一部分。该模式将数据接入(data access)部分独立出来,实现对数据和数据库的中心化管理,比如对数据库连接的封装(encapsulation)、CRUD操作,在业务逻辑和数据存储/数据层(data layer)之间建立中间人的角色。通过将数据层和业务逻辑的隔离,增强了代码的可维护性(maitainability),可测试性(testability),灵活性,也方便了管理不同数据源。
仓库模式为数据的接入和管理提供了结构化、标准化的方式,管理数据时可抽象数据库的实现细节。
Case
from pydantic import BaseModel
class SomeModel(BaseModel):
id: int
name: str
other_field: list[str]
class DataBaseRepository():
def __init__(self):
self._db_access = self.db_access()
def db_access(self):
raise KeyError("To be implemented")
def add_records(self):
raise KeyError("To be implemented")
def remove_records(self):
raise KeyError("To be implemented")
...
class MongoDBRepository(DataBaseRepository):
def db_access(self):
# connect to mongoDB
pass
def add_records(self, records: list[BaseModel]) -> list[BaseModel]:
# add records
pass
def remove_records(self, ids: list[int]) -> list[int]:
# remove records from Cosmos
pass
class BusinessLogic:
def __init__(self):
self._db_repo = MongoDBRepository()
def add_records(self, records: list[SomeModel]) -> list[SomeModel]:
res = self._db_repo.add_records(records)
return res
def remove_records(self, ids: list[int]) -> list[int]:
res = self._db_repo.remove_records(ids)
return res
Reference
1 Repository Design Pattern, Per-Erik Bergman, Medium
2 Repository Patter, Nilesh Borole, Medium
3 Simplifying Database Interactions in Python with the Repository Pattern and SQLAlchemy, Ryan Zhang, Medium
4 Repository Design Pattern, geeksforgeeks
5 Microsoft Copilot