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 重构步骤流程图
5.2 关键重构手法
- Extract Class:将认证逻辑迁移至AuthModule
- Move Method:将日志记录方法迁移至Logger
- Introduce Parameter Object:优化数据库连接参数管理
六、效果对比
指标 | 重构前 | 重构后 |
---|---|---|
类复杂度(Cyclomatic) | 28 | 8 |
单元测试覆盖率 | 35% | 89% |
修改耗时 | 2h+ | 20min |
七、总结与建议
通过本次重构:
- 职责分离:各模块专注单一功能
- 可扩展性提升:新增加密算法只需修改AuthModule
- 错误隔离:数据库问题不再影响邮件服务
完整代码
Github
作者 | 郑天佐 | |
邮箱 | zhengtianzuo06@163.com | |
主页 | http://www.zhengtianzuo.com | |
github | https://github.com/zhengtianzuo |