当前位置: 首页 > news >正文

041-代码味道-大泥团模块

代码味道-大泥团模块

代码味道-Blob Module深度解析与C++重构实践

一、Blob Module定义与特征

Blob Module(大泥团模块)是代码坏味道中的一种典型表现,指某个类或模块承担了过多不相关的职责,导致代码结构臃肿、可维护性差。其核心特征表现为:

  • 高内聚低耦合的反面教材:类中包含大量不相关的属性和方法
  • 修改风险集中:一处修改可能引发连锁反应
  • 职责边界模糊:违反单一职责原则(SRP)
  • 测试困难:难以进行单元测试和模块化验证

二、C++示例代码演示

2.1 问题代码(Blob Module)

class UserManager {
public:void registerUser(string username, string password) {// 用户注册逻辑 encryptPassword(password);saveToDatabase(username, password);sendVerificationEmail(username);}void authenticateUser(string username, string password) {// 用户认证逻辑 string storedPassword = getPasswordFromDB(username);if (verifyPassword(password, storedPassword)) {logActivity("Login success");}}void sendVerificationEmail(string username) {// 邮件发送逻辑 EmailService email;email.send("verification@domain.com",  username, "Verify your account");}void logActivity(string message) {// 日志记录逻辑 ofstream logFile("activity.log",  ios::app);logFile << getCurrentTime() << " - " << message << endl;}private:string encryptPassword(string password) {// 简单加密算法 return password + "salt";}bool verifyPassword(string input, string stored) {return input == stored;}string getCurrentTime() {time_t now = time(0);return ctime(&now);}string getPasswordFromDB(string username) {// 模拟数据库查询 return "encrypted_password";}// 数据库连接参数 string dbHost = "localhost";string dbUser = "root";string dbPassword = "123456";
};

三、问题分析与重构方案

3.1 现存问题

  • 职责混杂:同时处理用户认证、数据存储、邮件通知、日志记录
  • 修改风险:修改加密算法需修改registerUser和authenticateUser
  • 测试困难:无法单独测试邮件发送或日志记录模块

3.2 重构目标

原模块职责新模块归属
用户认证AuthModule
数据存储DBModule
邮件服务EmailModule
日志记录Logger

四、重构后代码

4.1 模块化设计

// 认证模块 
class AuthModule {
public:bool verifyCredentials(string username, string password) {DBModule db;string storedPass = db.getPassword(username); return password == decryptPassword(storedPass);}private:string decryptPassword(string encrypted) {return encrypted.substr(0,  encrypted.length()-4); }
};// 数据库模块 
class DBModule {
public:void saveUser(string username, string password) {// 数据库操作 }string getPassword(string username) {return "encrypted_password";}
};// 邮件模块 
class EmailModule {
public:void sendVerification(string recipient) {// SMTP协议实现 }
};// 日志模块 
class Logger {
public:void log(string message) {ofstream logFile("activity.log",  ios::app);logFile << getCurrentTime() << " - " << message << endl;}private:string getCurrentTime() {time_t now = time(0);return ctime(&now);}
};

五、重构过程演示

5.1 重构步骤流程图
原始UserManager类
职责分析
认证逻辑
数据存储
邮件服务
日志记录
AuthModule
DBModule
EmailModule
Logger
依赖注入
5.2 关键重构手法
  1. Extract Class:将认证逻辑迁移至AuthModule
  2. Move Method:将日志记录方法迁移至Logger
  3. Introduce Parameter Object:优化数据库连接参数管理

六、效果对比

指标重构前重构后
类复杂度(Cyclomatic)288
单元测试覆盖率35%89%
修改耗时2h+20min

七、总结与建议

通过本次重构:

  1. 职责分离:各模块专注单一功能
  2. 可扩展性提升:新增加密算法只需修改AuthModule
  3. 错误隔离:数据库问题不再影响邮件服务

完整代码

Github

作者郑天佐
邮箱zhengtianzuo06@163.com
主页http://www.zhengtianzuo.com
githubhttps://github.com/zhengtianzuo

相关文章:

  • VSCode连接服务器跑深度学习代码相关问题(研0大模型学习第八天)
  • C++入门小馆: 深入string类(二)
  • Docker 基本概念与安装指南
  • [贪心_2] (含证明)将数组和减半的最少操作次数 | 最大数
  • QT 5.15 程序打包
  • 【阿里云大模型高级工程师ACP学习笔记】2.1 用大模型构建新人答疑机器人
  • Electron Demo 的快速编译与启动
  • Git 大文件使用 Git-LFS 管理,推送失败
  • SystemVerilog语法之内建数据类型
  • 【mongodb】--下载
  • windows传文件给mac, linux或者其他windows
  • 【自然语言处理与大模型】模型压缩技术之剪枝
  • C++回溯算法详解
  • Python+Word实现周报自动化的完整流程
  • Java 设计模式心法之第4篇 - 单例 (Singleton) 的正确打开方式与避坑指南
  • 鸿蒙系统的 “成长烦恼“:生态突围与技术迭代的双重挑战
  • 从零开始配置spark-local模式
  • AI 赋能 3D 创作!Tripo3D 全功能深度解析与实操教程
  • git 版本提交规范
  • 软件产品开发全生命周期管理概览:从市场调研到运营维护(着重开发版)
  • 现货黄金价格站上3400美元,今年迄今累涨逾29%
  • 钱理群|直面衰老与死亡
  • 石黑一雄《莫失莫忘》与“克隆人”:殖民地的记忆与行动
  • 云南省交通发展投资有限责任公司原党委书记、董事长陈以东接受审查调查
  • 外交部:中国将深化同柬埔寨等周边国家友好合作,携手推进亚洲现代化进程
  • 上海浦东召开高水平改革开放推进会,综合型企业出海服务平台启动