问题

使用面向对象的思想设计一个简单的计算器类

问题分析

基于面向对象的四个原则即使得代码具有可维护,可复用,可扩展,灵活性好的特点;我们需要通过封装,继承,多态把程序的耦合度降低。将程序的业务逻辑于界面逻辑分开,让它们之间的耦合度下降,才可以达到容易维护和扩展。比如该问题,用户只需要知道使用特定的符号,以及两个数字,代码程序则只获得这三个信息,其他的部分应该具有一致性,内部的具体实现和判断应该由更底层的代码来实现。所以这里我们用到简单工厂模式,定义一个工厂类,对运算符进行判断,再实例化对应不同运算类的的对象,而这些运算类具有相同的属性和方法——两个数字+返回结果的方法,所以建立一个运算的主类,并使用多态在不同的运算子类中实现返回结果的方法。

UML图

PYTHON制造业_PYTHON制造业

代码示例

下面是基于以上的UML图的Python版本的代码实现

'''
创建时间:2021/3/8
创建者:zhongbin
创建任务:使用简单工厂模式实现一个简单的计算器
'''
####运算类
class Operation:
    def __int__(self,NumberA=None,NumberB=None):
        self.NumberA=NumberA
        self.NumberB=NumberB
    def SetNumber(self,NumberA,NumberB):
        self.NumberA=NumberA
        self.NumberB=NumberB
    def GetResult(self):
        pass
###对应不同符号的运算类
class OperationADD(Operation):
    def GetResult(self):
        if self.NumberA!=None and self.NumberB!=None:
            return self.NumberA+self.NumberB
        else:
            return "erro"
class OperationSub(Operation):
    def GetResult(self):
        if self.NumberA!=None and self.NumberB!=None:
            return self.NumberA-self.NumberB
        else:
            return "erro"
class OperationMult(Operation):
    def GetResult(self):
        if self.NumberA!=None and self.NumberB!=None:
            return self.NumberA*self.NumberB
        else:
            return "erro"
class OperationDiv(Operation):
    def GetResult(self):
        if self.NumberA!=None and self.NumberB!=None:
            if self.NumberB!=0:
                return self.NumberA/self.NumberB
            else:
                return "除数为0!"
        else:
            return "erro"
###运算的工厂类 根据符号返回对应的实例化的对象
class OperationFatory:
    def CreateOperate(self,oper):
        operation=None
        if oper=="+":
            operation=OperationADD()
        elif oper=="-":
            operation = OperationSub()
        elif oper=="*":
            operation=OperationMult()
        elif oper=="/":
            operation = OperationDiv()
        return operation
#主程序类
if __name__=="__main__":
    operation=OperationFatory().CreateOperate('+')
    operation.SetNumber(1,2)
    print(operation.GetResult())

总结

可以看出在主程序中代码用户只需要知道运算符号以及运算的两个数字就可以操作,而其他内部具体的运算过程并不知情。同时代码本身具有很好的可拓展性,用户需要添加其他运算符号时,只需要增加运算类,以及为工厂类添加分支就可以拓展功能,较好的实现了程序之间的低耦合。