QT之计算器代码重构(六)
首先我们来讲讲为什么要进行代码重构?在一些大的项目中,代码重构是一个必不可少的步骤。因为项目大了,代码也就多了,后期的维护将会很难,所以我们要适当的进行代码重构,让代码的可复用性提高,使软件的设计和架构更加合理。
代码实现和代码重构有什么不同呢?代码实现的重点是功能的实现,而代码重构则是在实现功能的基础上进行再次优化,以提高代码质量。
那么什么样的代码需要重构呢?依据以往的项目开发经验来看呢,当发现项目中的重复代码越来越多时、代码功能越来越不清晰时、代码离设计越来越远时等,那么这时我们就该进行代码重构了,使得代码的质量得到提高。
有的项目也不需要进行代码重构,比如说项目较紧。这时我们也没时间去进行代码重构,那么我们就只能实现基本功能就行。
好了,废话不多说,我们撸起袖子开干了。由于上次我没有把计算器界面实现的源代码贴出来,这次就补上,大家在重构完之后可以看看代码质量是否得到了提高呢?
#include <QApplication>
#include <QLineEdit>
#include <QPushButton>int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget* w = new QWidget();QLineEdit* le = new QLineEdit(w);QPushButton* button[20] = {0};const char* btnText[20] ={"7", "8", "9", "+", "(","4", "5", "6", "-", ")","1", "2", "3", "*", "<-","0", ".", "=", "/", "C",};int ret = 0;le->move(10, 10);le->resize(240, 30);le->setReadOnly(true);for(int i=0; i<4; i++){for(int j=0; j<5; j++){button[i*5 + j] = new QPushButton(w);button[i*5 + j]->resize(40, 40);button[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);button[i*5 + j]->setText(btnText[i*5 + j]);}}w->show();w->setFixedSize(w->width(), w->height());ret = a.exec();delete w;return ret;
}
我们 首先可以建一个 QCalculatorUI 类,在这个 QCalculatorUI.cpp 文件中实现所有与计算器界面相关的功能,从而 main 函数将会变得很清晰。首先我们在构造函数中得生成 QCalculatorUI 对象,但是由于考虑到生成的对象有可能会是半成品,所以我们采用二阶构造设计法来生成 QCalculatorUI 对象,依次来确保生成的对象时可用的。关于二阶构造法,是属于C++里面的知识,以后有时间给大家再做详细介绍。我们之后可以将显示等功能放在一个show函数里。那么依照目前的思想,我们建出来的 QCalculatorUI.h 文件和 QCalculatorUI.cpp 文件的相关代码就分别是这样的:
QCalculatorUI.h
class QCalculatorUI : public QWidget{private:QLineEdit* m_edit;QPushButton* m_buttons[20];QCalculatorUI();bool construct();public:static QCalculatorUI* NewInstance();void show();~QCalculatorUI();};-----QCalculatorUI.cppbool QCalculatorUI::construct(){bool ret = true;const char* btnText[20] ={"7", "8", "9", "+", "(","4", "5", "6", "-", ")","1", "2", "3", "*", "<-","0", ".", "=", "/", "C",};m_edit = new QLineEdit(this);if( m_edit != NULL ){m_edit->move(10, 10);m_edit->resize(240, 30);m_edit->setReadOnly(true);}else{ret = false;}for(int i=0; (i<4) && ret; i++){for(int j=0; (j<5) && ret; j++){m_buttons[i*5 + j] = new QPushButton(this);if( m_buttons[i*5 + j] != NULL ){m_buttons[i*5 + j]->resize(40, 40);m_buttons[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);m_buttons[i*5 + j]->setText(btnText[i*5 + j]);}else{ret = false;}}}return ret;}QCalculatorUI* QCalculatorUI::NewInstance(){QCalculatorUI* ret = new QCalculatorUI();if( (ret == NULL) || !ret->construct() ){delete ret;ret = NULL;}return ret;}void QCalculatorUI::show(){QWidget::show();setFixedSize(width(), height());}
-----
进行代码重构之后的main.cpp是这样的:
#include <QApplication>
#include "QCalculatorUI.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);QCalculatorUI* cal = QCalculatorUI::NewInstance();int ret = -1;if( cal != NULL ){cal->show();ret = a.exec();delete cal;}return ret;
}
那么大家看看进行代码重构之后的main函数是不是很清晰呢?所以在进行代码实现功能的基础上,大家一定要进行代码重构。这样才能写出质量更高的代码,好了,本节就到 这了,后面我们再进行计算器的继续实现。
转载于:https://blog.51cto.com/12810168/2088114
QT之计算器代码重构(六)相关推荐
- Python Qt GUI快速编程第六章代码分析
这是我敲的Python Qt Gui快速编程第六章上的代码,以后可能要用到其中一些,如果忘记了就来这里看看. #coding=utf-8 #d import os import platform im ...
- Qt Creator代码重构
Qt Creator代码重构 代码重构 查找符号 查找QML类型 查看搜索结果 重命名符号 列编辑 应用重构动作 创建功能 插入虚函数 创建获取器和设置器 重构动作摘要 重构C ++代码 重构QML代 ...
- 【Java设计模式 规范与重构】 六 代码重构小结
最近趁着学习劲头足,如饥似渴的把代码重构部分也学习完了,可以说9月份属实非常充实,貌似也只有学习才能导致生活没有那么无聊. 代码重构博客目录 序号 文章列表 1 [Java设计模式 规范与重构] 一 ...
- 步步为营 .NET 代码重构学习笔记 九
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
- 步步为营 .NET 代码重构学习笔记 十一
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
- 代码重构(二):类重构规则
在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp ...
- 从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构
从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce qq:1393852684 一. ...
- 步步为营 .NET 代码重构学习笔记 十
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
- 2021-01-22学习记录 || 通过二维数组初始化窗体并进行代码重构
今天主要是通过二维数组将整个界面16个数字块展示出来,并为了下一步添加左移.右移功能创建子类MainFrame继承JFrame类并进行代码重构. 二维数组展示初始化界面 由于2048小游戏需要16个数 ...
最新文章
- 关于struts2的开始学习
- docker部署下的nginx负载均衡时,无法获取真实ip的问题
- 微信多开txt_微信(电脑版)多开教程
- 深入理解Linux系统中的用户和组账号
- Python程序-打印单词的菱形字符图案
- jieba(结巴)—— Python 中文分词
- python视频教程全集-Python 3视频教程全集(2018版)免费送啦
- matlab画图实例_自定义函数
- 服务性能测试和内存监控
- 人工智能机器视觉技术应用有哪些?
- Qt打包发布程序,打包安装程序和打包为单个exe可执行程序,图文教程
- 国外兼职网站列举 79个
- cad图纸问号怎么转换文字_CAD中文图纸中文字体变成问号怎么办?不慌这几步教你轻松解决...
- 计算机管理器找不到打印机驱动,电脑提示“无法找到打印机驱动程序包要求的核心驱动”解决方法...
- C++之个人银行账户管理程序(二)
- B2C,B2B,c2c是什么?
- macbook usb口突然不能用 解决方法
- 【智能商务】学习财务分析,看这10张思维导图就够啦
- div无法触发blur事件解决办法
- 计算机数制详解及相互转换(二进制、八进制、十进制、十六进制)
热门文章
- Spring Boot 2.2首个里程碑版本发布,改进性能和内存使用
- AngularJS学习日记(四)Service和Provider
- python数据挖掘试题四十道,你敢来挑战吗?
- Python 人脸识别 OpenCV (haarcascades)
- Oracle在linux下使用小技巧
- 性能分析:hash索引导致delete慢
- MySQL工具1:mysqladmin
- flex air openWithDefaultApplication 时出现Illegal ...
- Javascript cookie使用详解
- Segment Routing — SRv6 — 网络架构与应用场景