一个计算器引发的思考
今天我们来说一个简单的需求,一个简单的计算器,实现加减乘除即可。界面我们暂且略过,比较简单,提交过来的有两个数字和一个运算符。
基础数据如下:
$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图