项目越做越大,代码越来越乱,维护困难。原因很多吧。起初为了实现功能,并没有注重代码的结构,外包公司嘛。虽然公司的项目负责人一直考虑复用、封装,但是我觉得基本上没有达到想要的效果。因为整个代码中没有用到设计模式,这样结构肯定好不到哪去。虽然很多功能都封装了,但是分层特别的乱,有种为了封装而封装的感觉。其实,很多东西我也不懂,但是写完代码之后,偶尔还是会去把代码的结构稍微的修改修改,尽量的少给自己挖坑吧。

代码结构的问题

  接口有大量的方法,调用接口时需要使用 switch 进行判断,大致结构如下:

 private function makeXML($xmlName, $xmlNameParam)
{
$requestData = null; switch ($xmlName) {
// ...
case 'sendOrder':
$requestData = $this->sendOrder($xmlNameParam);
break;
case 'ecfareQuery':
$requestData = $this->ecfareQuery($xmlNameParam);
break;
case 'getInterAV':
$requestData = $this->getInterAV($xmlNameParam);
break;
// ...
} return $requestData;
}

以上 case 中都是调用对应的方法来拼接接口所需的 XML 信息的。

方法的参数分别传递了拼接接口方法的名称和参数。

这样的判断结构代码感觉不好管理,增加一个方法方法,就需要增加一个 case 调用,而且看的时候也比较乱。

代码结构的改进

因此进行了相关的改进,改进方式如下:

1、先定义一个方法数组,用于保存方法名,定义如下:

 protected $arr = [];

 public function __construct()
{
// 初始化接口方法
$this->arr = [
'getAV' => 'getAV',
'sendOrder' => 'sendOrder',
'ecfareQuery' => 'ecfareQuery',
'getInterAV' => 'getInterAV',
// ...
];
}

将来该接口下有了新的方法,直接添加到数组里就可以了。这样可以省去大量的 switch case 的判断。

2、修改 switch 的结构,代码如下:

 private function makeXML($xmlName, $xmlNameParam)
{
$requestData = null; $fun = $this->arr[$xmlName]; $requestData = $this->$fun($xmlNameParam); return $requestData;
}

将 switch case 的结构改成了以数组下标的方式进行调用的方式。这样就把所有的方法统一管理了起来。

以上思路来自于 MFC 框架对 Windows 消息的处理。

相当于 C 语言中的函数指针数组,或 C# 里的委托。

知识补充:

面向过程的函数变量(往上找的)

 function come() {                   //定义com函数
  echo "来了<p>";
} function go($name = "jack") { //定义go函数
  echo $name."走了<p>";
} function back($string) //定义back函数
{
  echo "又回来了,$string<p>";
} $func = "come"; //声明一个变量,将变量赋值为“come”
$func(); //使用变量函数来调用函数come()
$func = "go"; //重新给变量赋值
$func("Tom"); //使用变量函数来调用函数go()
$func = "back"; //重新给变量赋值
$func("Lily"); //使用变量函数来调用函数back();

对于 PHP 中面向对象的方式如下(自己实现的):

 <?php

 class test
{
public $arr = []; public function __construct()
{
$this->arr = array(
'func1'=>'func1',
'func2'=>'func2',
'func3'=>'func3',
'func4'=>'func4',
'func5'=>'func5',
);
} public function submit($func, $str)
{
$f = $this->arr[$func];
$this->$f($str);
} static public function func1($str)
{
print 'func1' . ' ' . $str . "\n";
} static public function func2($str)
{
print 'func2' . ' ' . $str . "\n";
} public function func3($str)
{
print 'func3' . ' ' . $str . "\n";
} private function func4($str)
{
print 'func4' . ' ' . $str . "\n";
} private function func5($str)
{
print 'func5' . ' ' . $str . "\n";
}
} $t = new test(); // 实例化类 $f = $t->arr['func1'];
test::$f('abc'); // func1 func2 是静态方法
$f = $t->arr['func2'];
test::$f('abc'); $f = $t->arr['func3']; // func3 的调用
$t->$f('abc'); // func4 func5 的调用需要使用 submit 方法进行分发
$t->submit('func4', 'abc');
$t->submit('func5', 'bcd');

以上代码的输出结果如下:

 func1 abc
func2 abc
func3 abc
func4 abc
func5 bcd

我的微信公众号:“码农UP2U”

最新文章

  1. MySQL 使用JOIN优化子查询
  2. [WPF系列]-数据邦定之DataTemplate 对分层数据的支持
  3. 直接拿来用!最火的Android开源项目(二)(转)
  4. python之2048
  5. PowerDesigner16建表在SQL SERVER 2008报 对象名 &#39;sysproperties&#39; 无效。
  6. Rails常用命令
  7. 自己总结的一些android公共库
  8. Eclipse配置使用web.xml
  9. sql 字段字符串内容替换
  10. 禁止chrome中CORS跨域资源共享错误
  11. 五毛的cocos2d-x学习笔记05-场景与场景动画,动作
  12. 编译 MVC View
  13. Android -- 贝塞尔实现水波纹动画(划重点!!)
  14. LINUX0.11 内核阅读笔记
  15. spring boot application.properties详解
  16. Java环境变量配置----JDK开发环境及环境变量设置
  17. dede的应用
  18. linux 中搜索命令的对比
  19. PyQt5系列教程(八)定时器QTimer的使用
  20. vue使用sweetalert2弹窗插件

热门文章

  1. centos7下mysql5.7的安装与配置
  2. Spring Cloud Gateway-自定义异常处理
  3. 利用Python突破验证码限制
  4. springcloud vue 微服务分布式 activiti工作流 前后分离 集成代码生成器 shiro权限
  5. CSS的border-radius 设置圆弧
  6. union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单
  7. 熟悉的味道——从Java单例写到C++单例
  8. 记录MySql错误消息
  9. 比hive快10倍的大数据查询利器presto部署
  10. [Go] 测试go连接imap的tcp长连接