系统中接口调用的单例化(third_party中的一路财富接口)

场景介绍:
1、以前每次调用接口时,都需要new一个接口对象,再调用接口,这样不仅浪费资源,代码也比较繁琐;
2、理想的调用方法是:接口全静态。这样不仅运行效率高,而且调用方便;
思路整理:
1、首先静态方法无法调用非静态方法,如果把接口静态化,调用日志记录接口时会出现问题(CiLogs);
2、基于第一条,接口全静态的想法不可取。转而求其次,接口全部单例化,用静态类来调用;这样既可以记录日志,调用也非常方便。
改造:
1、首先看third_party代码结构(特指ylcf, xinyi类似):
com ----存放工具类,比如加密、字符串操作函数
entity ----未使用,可以删除
service ----存放了所有接口,按文件分类
config.php ----配置文件,主要是接口的转换
demo.php ----接口测试文件
ylcfClass.php ----引入service并实例化,对外提供统一的接口访问

PS:config.php担负接口管理的职责,但是在service中仍然出现了具体的接口,config没发挥好管理职责。
    更好的做法是,config.php中用键值对(可以是属性名-值,也可以是数组键名-值等等,属性名和键名都算“键”)保存接口,service中只出现config中提供的“键”,不接触接口。

2、把ylcfClass.php所有方法都静态化,用静态属性保存service的实例,保证每个service实例的单一性;

3、把com工具类静态化;

4、以前在 controller 或 model 里面调用接口是这样的:
        include_once("xxxx/ylcfClass.php");
        class A
        {
            ......
            $yc = new YlcfClass();
            $yc->xxx()->yyy();
            ......
        }
    为了美观,我们先创建一个 library: YlcfApiTool.php, 里面使用静态方法,调用 YlcfClass。
    然后在 controller 或 model 里这样调用:
        class A
        {
            public __construst()
            {
                $this->load->library('YlcfApiTool');
            }
            ......
            YlcfApiTool::xxx()->yyy();
            ......
        }
5、日志处理:
    整个过程没有修改日志处理流程,所以不受影响。

总结:
1、静态化可以提高代码效率,特别是在非脚本语言里;
2、用 library 包装了一遍接口,好处是可以用 load library 优雅地引入接口,调用也无需创建实例。

发表评论