0

0

干净的架构:从哪里开始?

碧海醫心

碧海醫心

发布时间:2024-12-04 08:09:42

|

1152人浏览过

|

来源于dev.to

转载

干净的架构:从哪里开始?

在上一篇文章中我们有:

  • 我们的问题域:具有一些要求的 todo 应用程序
  • 配置为使用 python 和 python polylith 的基本存储库。

因此,一些决定已经完成。我们拥有一些工具并已经决定了存储库的外观。

这是我喜欢 polylith 的原因之一:无论您编码什么或您的组织有多大,所有存储库看起来都一样 - 如果您需要多个存储库。

无论您使用 fastapi、flask 还是 django,构建单个或多个库,还是使用 celery 运行后台任务,您的存储库结构都是一致的。

主要优势之一是简化新开发人员的入职流程。假设他们掌握了 polylith,他们将很快熟悉项目结构:可重用组件位于 components 文件夹中,入口点位于 bases 文件夹中,演示脚本位于development 文件夹中,等等。

实体

来自 bob 叔叔的“清洁架构”实体是我们架构的基石,它们是我们架构的最内层。所以我们需要从它们开始,在 polylith 中实体应该作为组件存在。

有多少个组件?

我相信组件的数量取决于解决方案的大小和复杂性。但是,我建议从实体的单个多块组件开始。这种方法有助于保持清晰且重点突出的架构,特别是对于较小的项目。

为什么实体只有一个组件?

  • 该层封装了对整个应用程序至关重要的核心业务规则。通过将其保留在单个组件中,可以确保一致性并避免重复。
  • 单个组件简化了依赖关系管理,因为它成为所有其他层的依赖关系。

避免第三方依赖

为了最大限度地减少外部依赖并增强架构灵活性,请努力使用python的标准库来表示实体。这包括利用字典、列表、枚举、函数、类和最近的数据类等数据结构。

为什么要避免使用 pydantic 或 django models 等第三方库?

  • 与外部框架的耦合:依赖这些库可能会引入与特定框架不必要的耦合。
  • 复杂性增加:外部库可能会增加复杂性和潜在的维护问题。
  • 灵活性降低:通过限制外部依赖,您可以更轻松地适应需求或技术的变化。

通过遵守这些原则,您可以创建一个健壮且可维护的架构,能够适应未来的变化。

Face++旷视
Face++旷视

Face⁺⁺ AI开放平台

下载

待办事项实体

我们的示例很简单,核心实体是 gordon 的“待办事项”。我们可以向我们的存储库添加一个新组件,但选择正确的名称至关重要。

虽然使用“core”或“main”等通用名称可能很诱人,但选择在域上下文中有意义的名称至关重要。理想情况下,这些名称应与客户或产品所有者使用的术语一致。通过使用特定于域的名称,我们增强了代码的可读性和可维护性,使开发人员和利益相关者更容易理解项目的结构。

存储库工作区名称定义为 todo。因此,我们所有的导入都将遵循以下格式:

from todo.xyz import ...
import todo.xyz

为了简单起见,在本示例中,我们将使用实体作为组件名称。但是,在现实场景中,请考虑反映您的域的命名约定。例如,如果您的应用程序围绕文档恢复,则名为恢复的组件将是合适的。同样,为了清晰起见,游戏应用程序可能会使用锦标赛实体。

使用 python polylith 创建组件很简单:

poetry poly create component --name=entities
poetry poly sync
poetry install # it may be necessary

这将在组件文件夹中添加一个 python 包,这是源树中的新条目:

./components
└── todo
    └── entities
        ├── __init__.py
        └── core.py
./test/components
└── todo
    └── entities
        ├── __init__.py
        └── test_core.py

python-polylith 工具将为我们生成测试示例,这是一个很好的功能。可以通过在 [tool.polylith.test] 部分中将enabled = true 值设置为 false 来更改workspace.toml 文件中的此行为。

在新的实体组件中,添加了两个文件:__init__.py 和 core.py。您可以重命名 core.py 模块以更好地满足您的需求。常见的做法是通过 __init__.py 公开包的公共 api,同时在 core.py 等其他模块中维护内部组织。

根据要求,目前我们只有一个实体,即 todo 项:

@dataclass
class TodoItem:
    owner: str
    title: str
    description: str
    is_done: bool = False
    due_date: Optional[date] = None

测试这样一个简单的实体似乎没有必要,但我更喜欢至少测试所有字段的存在。虽然这在贡献者较少的小型项目中似乎并不重要,但它可以防止在拥有许多开发人员的大型项目中出现重大问题。从实体中删除单个字段可能会无意中破坏应用程序的各个部分。

在这部分的拉取请求中,您将看到我为该实体添加了一些基本测试。

已经定义了一些测试,我借此机会添加了 github 工作流程来自动运行每个拉取请求的测试。

结论

  • 应用程序基本实体
  • ci 设置

接下来:我们来谈谈坚持

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

155

2026.02.04

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

100

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

79

2025.12.15

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

251

2026.02.06

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

548

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

27

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

43

2026.01.06

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号