• 一个计算器引发的思考


    今天我们来说一个简单的需求,一个简单的计算器,实现加减乘除即可。界面我们暂且略过,比较简单,提交过来的有两个数字和一个运算符。

    基础数据如下:

    $number_1 = $_POST['number_1'];
    $number_2 = $_POST['number_2'];
    $operator = $_POST['operator'];

    一、要开发一个计算器软件,过程式的开发流程如下:

    switch($operator)
    {
        case '+':
            $result = $number_1 + $number_2;
            break;
        case '-':
            $result = $number_1 - $number_2;
            break;
        case '*':
            $result = $number_1 * $number_2;
            break;
        case '/':
            $result = $number_1 / $number_2;
            break;
    }

    优势是什么?显然,优势就是非常容易理解,纯过程化的编写方式,非常直观。

    弊端是什么?如果后面再加新的运算符,那么我们会不断的更新这个运算方法,不利于维护。

    二、优化后的计算器软件,面向对象式的开发流程如下:

    //抽象运算类
    abstract class Operator
    {
        abstract function getResult($number_1,$number_2);
    }
    
    //加法运算类
    class Plus extends Operator
    {
        function getResult($number_1, $number_2)
        {
            return $number_1 + $number_2;
        }
    }
    
    //减法运算类
    class Minus extends Operator
    {
        function getResult($number_1, $number_2)
        {
            return $number_1 - $number_2;
        }
    }
    
    //乘法运算类
    class Multiply extends Operator
    {
        function getResult($number_1, $number_2)
        {
            return $number_1 * $number_2;
        }
    }
    
    //除法运算类
    class Devide extends Operator
    {
        function getResult($number_1, $number_2)
        {
            try{
                $result = $number_1 / $number_2;
            }catch(Exception $e){
                $result = $e->getMessage();
            }
    
            return $result;
        }
    }
    
    //简单工厂类
    class Factory
    {
        public static function createOperator($operator)
        {
            $Operator = null;
            switch($operator)
            {
                case '+':
                    $Operator = new Plus();
                    break;
                case '-':
                    $Operator = new Minus();
                    break;
                case '*':
                    $Operator = new Multiply();
                    break;
                case '/':
                    $Operator = new Devide();
                    break;
            }
    
            return $Operator;
        }
    }

    优势是什么?我们后面要是再增加其它的运算,只需新增一个运算类,然后在简单工厂类中加代码处理即可,维护方便,且可以不同的方法由不同的人来进行处理,自己完成自己的一块就可以了,不会影响到别人的代码。

    弊端是什么?代码量相对要大很多,且比较抽象,不够直观。

    三、UML图

  • 相关阅读:
    【报名有奖】相约2020 RT-Thread 开发者大会RDC
    基于RT-Thread的人体健康监测系统
    RT-Thread的位图调度算法分析(最新版)
    QEMU让你无需开发板即可玩溜RT-Thread~
    WPF TreeView 控件 HierarchicalDataTemplate 绑定节点及自定义节点的 样式
    转载 Prism之使用EventAggregation进行模块间通信 (http://www.cnblogs.com/li-xiao/archive/2011/04/20/2022962.html)
    创建简单的WCF程序(计算器)
    Arcgis Javascript API 离线部署
    回调函数
    Zookeeper 详细介绍 尤其树形结构 (转)
  • 原文地址:https://www.cnblogs.com/gspsuccess/p/9229652.html
Copyright © 2020-2023  润新知