要点总括
(1)代码规范性:命名规范、逻辑强(无明显Bug)、无冗余判断(eg:多个并列if用else if或switch case替代);
(2)面向对象:易维护、可复用、可扩展、灵活性好
(3)面向对象三大特性:封装、继承、多态,合理使用将显著降低程序的耦合度;
(4)封装:业务逻辑(eg:计算器的计算功能)和界面逻辑(eg:计算器的显示)分开,从而降低耦合度,提升复用性;
(5)松散耦合:基于继承多态,采用不同的类单独实现各模块,降低程序的维护风险;
(6)简单工厂模式:定义单独的工厂,解决各模块类的实例化问题。
脑图展开
核心代码实现(Qt,C++)
(1)最初版本的计算器代码,没有考虑面向对象的编程思想
void Widget::cal()
{
varA=ui->inAEdit->text().toDouble();
varB=ui->inBEdti->text().toDouble();
double ans=0.0;
try {
switch(ui->symbolBox->currentIndex()){
case 0:
ans=varA+varB;break;
case 1:
ans=varA-varB;break;
case 2:
ans=varA*varB;break;
case 3:
if(varB){
ans=varA/varB;
}else{
throw 0;
}
}
} catch (int i) {
qDebug()<<"计算错误";
ui->outEdit->setText(QString("计算错误,分母为 %1").arg(i));
return ;
}
ui->outEdit->setText(QString::number(ans));
}
(2)复用,将界面逻辑层与业务逻辑层分开封装,单独实现计算类
//界面逻辑层
void Widget::cal()
{
varA=ui->inAEdit->text().toDouble();
varB=ui->inBEdti->text().toDouble();
double ans=0.0;
try {
if(ui->symbolBox->currentIndex()==3 && varB==0){
throw 0;
}
ans=oper.getResult(varA,varB,ui->symbolBox->currentIndex());
} catch (int i) {
qDebug()<<"计算错误";
ui->outEdit->setText(QString("计算错误,分母为 %1").arg(i));
return ;
}
ui->outEdit->setText(QString::number(ans));
}
//业务逻辑层
double Operation::getResult(double numberA, double numberB, int flag)
{
double result=0.0f;
switch (flag) {
case 0:
result=numberA+numberB;break;
case 1:
result=numberA-numberB;break;
case 2:
result=numberA*numberB;break;
case 3:
result=numberA/numberB;break;
}
return result;
}
(3)简单工厂类,紧耦合 VS 松耦合,运用继承和多态
//界面逻辑层
void Widget::cal()
{
double varA=ui->inAEdit->text().toDouble();
double varB=ui->inBEdti->text().toDouble();
double ans=0.0;
try {
if(ui->symbolBox->currentIndex()==3 && varB==0){
throw 0;
}
oper=OperationFactory::createOperator(ui->symbolBox->currentIndex());
oper->setNumberA(varA);
oper->setNumberB(varB);
ans=oper->getResult();
} catch (int i) {
qDebug()<<"计算错误";
ui->outEdit->setText(QString("计算错误,分母为 %1").arg(i));
return ;
}
ui->outEdit->setText(QString::number(ans));
}
//业务逻辑层
class Operation
{
public:
Operation();
double getNumberA()
{
return numberA;
}
double getNumberB()
{
return numberB;
}
void setNumberA(double var){
numberA=var;
}
void setNumberB(double var){
numberB=var;
}
virtual double getResult()
{
double result=0;
return result;
}
private:
double numberA;
double numberB;
};
class OperationAdd:public Operation{
public:
double getResult();
};
class OperationSub:public Operation{
public:
double getResult();
};
class OperationMul:public Operation{
public:
double getResult();
};
class OperationDiv:public Operation{
double getResult();
};
//简单工厂类
Operation* OperationFactory::createOperator(int operate)
{
Operation* oper=nullptr;
switch (operate) {
case 0:
oper=new OperationAdd();break;
case 1:
oper=new OperationSub();break;
case 2:
oper=new OperationMul();break;
case 3:
oper=new OperationDiv();break;
}
return oper;
}
Qt效果展示
代码链接
code
关于作者
长期从事编程相关研究,涉及Qt、机械臂、轮式机器人、四足机器人的建模及仿真,可共同探讨编程相关问题,可指导课程设计及毕业设计,详询:QQ:2963325158