ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

松散耦合的 Python 代码与依赖注入

2022-11-10 19:46:28  阅读:243  来源: 互联网

标签:Premium 数据库 mysql server 服务器 连接


使用接口创建抽象

使用依赖注入编写松散耦合的 Python 代码有三个步骤。第一步是确定代码需要哪些依赖项,第二步是为每个依赖项创建接口,第三步是通过其构造函数或方法参数将它们传递到依赖对象中。

最近,我实现了需要字节编码器和解码器来操作业务数据的功能(出于可读性目的,我简化了其实现)。我将他们的职责抽象为接口。Python 没有像 Golang 那样的接口关键字,但你可以用ABC库

编码器和解码器的接口。

专注于 IPacketEncoder 接口,具体的编码器类必须实现它。最初的业务需求要求对所有类型进行编码,并用其长度填充字符串。幸运的是,Python 提供了结构库来完成大部分艰苦的工作。

填充包编码器具体类。

实现依赖注入

encode_name 函数是一个简单的实现,用于创建具有指定名称的编码有效负载。它采用 IPacketEncoder 对象和字符串作为参数。

PpadPacketEncoder 实例传递到encode_name函数中。

两个关键的实现细节是使用 IPacketEncoder 接口而不是 PpadPacketEncoder 具体类,编码器是一个参数,而不是在函数中初始化。这是依赖注入。由于IPacketEncoder是传入的,因此可以轻松扩展,更改或提供短截线,从而使系统保持松散耦合。

几周后,对编码器有了新的要求来处理空终止编码。幸运的是,由于现有的实现,它可以很容易地实现。

NullTerminatedPacketEncoder 具体类。

NullTerminatedPacketEncoder 实质上是在每个编码字符串后添加NULL_BYTE。回到encode_name函数,NullTerminatedPacketEncoder 的实例是一个有效的编码器参数,因为 NullTerminatedPacketEncoder 实现 IPacketEncoder 接口的方式与 PpadPacketEncoder 类似。

NullTerminatedPacketEncoder 传递到encode_name函数中。

如果此处未使用依赖注入,则可能导致代码紧密耦合且难以更改,例如:

耦合编码 Python 代码。

如果需要新的编码器,encode_name功能几乎必须与测试一起完全更改,从而延长交货时间。更糟糕的是,它可能会导致隐藏的副作用,尤其是在原始开发人员不再可用的情况下。

最后,我将提供使用此技术的一个不太简单的示例。SocketService 负责解码操作代码,调用其相关处理程序并返回其结果。它的所有参数类型都是接口抽象,包括其构造函数。CLI 负责确定要使用的编码器,即 NullTerminated 或 Ppad,并将其实例向下传递给 SocketService 类。

标签:Premium,数据库,mysql,server,服务器,连接
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有