一个C++程序重构的例子——糟糕的代码

本文通过一个C++影片出租程序的例子,展示了代码重构的重要性。原本的代码不符合面向对象原则,长函数承担过多职责。作者分析了代码的不足,包括难以应对需求变化、维护困难等问题,并提出了重构的必要性,旨在改善程序员的工作效率和代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于工作中常用c++的原因,在看《Refactoring — Improving the Design of Exsiting Code》这本书时,将java的例子写成了c++程序,略做总结,以深理解。

重构的习惯与思想,跟语言无关。但c++是一个难掌控的语言,记下这些优化改进,希望上进的c++ programmer们,能实现日积跬步,终至千里的梦想。

一、待优化的程序

程序描述:

(1)我们将优化的是一个影片出租用的小程序,该程序会记录每个顾客的消费金额并打印出来。

(2)程序输入为:顾客租的影片及对应的租期;程序的处理为:根据顾客租用影片时间及影片类型,计算费用;输出:打印消费单。

(3)影片有三种类型:普通影片、儿童影片及新上映影片。

(4)另外,模仿时下潮流,程序还提供了积分制度,为常客计算积分,积分会根据影片是否为新上映影片而不同。

程序代码如下:

// 影片类
class Movie
{
public:
	enum MovieType { 
		REGULAR = 0, CHILDREN, NEW_REALESE 
	};

	Movie(const string &title, int type)
	{
		m_title = title;
		m_type = type;
	}

	int GetType()
	{
		return m_type;
	}

	int SetType(int type)
	{
		m_type = type;
	}

	string GetTitle()
	{
		return m_title;
	}

private:
	// 影片名字
	string m_title;

	// 影片类型
	int m_type;
};

 影片类是个纯数据类。 

// 租赁类
class R
### C++代码重构工具推荐 在C++开发领域,代码重构是一项重要工作,它有助于提高代码质量、增强可读性和可维护性。以下是几种常用的C++代码重构工具及其特点: #### 1. **Visual Studio** Visual Studio 是微软推出的集成开发环境 (IDE),提供了强大的功能支持 C++ 开发者进行代码重构。其内置的重构工具有助于简化复杂的操作流程,例如重命名变量、提取函数以及调整代码结构等[^1]。 ```cpp // 示例:通过 Visual Studio 提取函数 void OriginalFunction() { int a = 5; int b = 10; std::cout << "Result: " << a + b << std::endl; // 可以被提取为单独的函数 } // 使用 IDE 的“Extract Function” 功能后: int Add(int x, int y) { return x + y; } void RefactoredFunction() { int a = 5; int b = 10; std::cout << "Result: " << Add(a, b) << std::endl; } ``` #### 2. **Qt Creator** 对于基于 Qt 框架的应用程序开发者来说,Qt Creator 是一款非常实用的 IDE。除了提供基本的编码辅助外,它还集成了部分代码重构功能,能够帮助开发者更高效地管理复杂项目中的代码逻辑[^2]。 尽管它的自动化程度可能不如某些商业级产品高,但对于日常使用的场景已经足够满足需求。 #### 3. **CLion by JetBrains** JetBrains CLion 被认为是目前市场上最先进的跨平台 C/C++ IDE之一。该软件以其卓越的性能表现著称,并且拥有极其丰富的插件生态系统来扩展功能范围。特别是在处理大型工程项目时,CLion 所具备的强大索引机制使得各种类型的重构变得轻而易举——无论是简单的语句移动还是深层次的设计模式转换都能轻松应对。 此外,CLion 支持多种现代标准特性(如 C++17 和 C++20),这使其成为追求最新技术趋势程序员的理想选择。 #### 实践建议与技巧 无论选用哪种具体工具,在实际执行重构之前都应该遵循一些通用原则: - 始终保持测试覆盖良好以便验证修改后的行为仍然正确无误; - 小步前进并频繁提交更改到版本控制系统中去记录历史轨迹; - 避免一次性做出过多改动以免增加调试难度; 最后附上一段简单例子展示如何利用上述提到的方法改善原始代码片段: 原版代码如下所示存在重复打印逻辑的问题可以通过创建新方法解决这个问题从而达到减少冗余的目的同时让整体更加简洁明了易于理解。 ```cpp // 初始状态可能存在大量相似调用 for(auto item : items){ cout<<item.name()<<" "<<item.value()<<endl; } // 经过优化之后的形式 template<typename T> void DisplayItem(const T& obj){ cout<<obj.name()<<" "<<obj.value()<<endl; } foreach(var element in collection){ DisplayItem(element); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值