先写一个简单的计算器类
#include<iostream>
using namespace std;
int yunsuan(int a, char ysf, int b)
{
switch (ysf)
{
case '+':return a + b;break;
case '-':return a - b;break;
case '*':return a * b;break;
case '%':
{if (b == 0)throw 0;
return a/b;
break;
}
}
}
void main()
{
cout << "num1: " << endl;
int a;
cin >> a;
cout << "操作符: " << endl;
char ysf;
cin >> ysf;
cout << "num2: " << endl;
int b;
cin >> b;
try { cout << yunsuan(a, ysf, b); }
catch (int a){cout << "除数不能为0" << endl;}
}
1.将业务逻辑(yunsuan)与界面逻辑分开(main)(另外建个文件更好些)
2.处理了除数为0的异常(if不行吗,try的作用补充下)
若需要加入一个平方根运算,则需要在yunsuan()中加一个case,其他的运算情况都需要加入编译,这个例子比较简单,若其他运算情况涉及到一些机密的算法,将其开放出去给程序员将不安全,因此应该把这些运算情况分离开来,修改其中一个不需要编译其他几个:
将这些运算情况中公有的部分提取出来做为基类,让每个运算情况继承这个基类:
class yunsuan
{
protected:
double num1;
double num2;
public:
yunsuan(int value1, int value2)
{
num1 = value1;
num2 = value2;
}
virtual int getresult()
{
int result = 0;
return result;
}
};
class add:public yunsuan
{
int getresult()
{
int result =num1+num2;
return result;
}
};
class sub :public yunsuan
{
int getresult()
{
int result = num1 - num2;
return result;
}
};
class mul :public yunsuan
{
int getresult()
{
int result = num1 * num2;
return result;
}
};
class div :public yunsuan
{
int getresult()
{
if (num2 == 0)throw 0;
int result = num1 / num2;
return result;
}
};
还需要用一个单独的类来做这个创造实例的过程,这个类就是工厂类:
class yunsuanfactory
{
public:
static yunsuan* createyunsuan(char s1)
{
yunsuan* ys = nullptr;
switch (s1)
{
case'+':ys = new addyunsuan();break;//父类指针可以指向子类
case'-':ys = new subyunsuan();break;
case'*':ys = new mulyunsuan();break;
case'%':ys = new divyunsuan();break;
}
return ys;
}
};
该工厂有一个负责生产的方法:createyunsuan,该方法接收一个字符型参数,根据该参数new一个派生类对象(±*%),然后用一个基类指针指向该对象,最后返回该对象。
由于在客户端使用时不用实例化工厂,通过类来调用即可,故这里将createyunsuan方法声明为static
客户端代码:
void main()
{
cout << "num1: " << endl;
int a;
cin >> a;
cout << "操作符: " << endl;
char ysf;
cin >> ysf;
yunsuan* ys;
ys = yunsuanfactory::createyunsuan(ysf);
ys->num1 = a;
cout << "num2: " << endl;
int b;
cin >> ys->num2;
try { cout << ys->getresult(); }
catch (int a){cout << "除数不能为0" << endl;}
}
看起来代码长了很多,但代码的维护性与安全性得到了提升,这对于大型项目来说至关重要
不管是windows程序,还是web程序等都可以使用该代码提供的接口,具有更高的移植性
若要增加各种复杂的运算,比如平方根,立方根等只要增加相应的运算子类即可,而不需要去重新编译不用变化的子类。然后在工厂类中的switch中增加分支即可使用。