假设现在我有一堆自写的PHP库,为了降低每个库之间的代码耦合,以下有两种编写库的方式,请大家比较一下哪种更好的可以降低库间代码耦合。首先,不管是什么库,他一定会有个验证(Validate)、过滤(Filter)、输出信息(Message)、读取配置(Configure)
我们以数据库·库为例。方法一:
假设我将这几个功能(验证、过滤、输出信息、读取配置)分别写成一个库,然后对数据先分别调用验证库、过滤库进行过滤,然后调用读取配置库,将配置信息传入数据库·库进行初始化,然后将刚刚处理好的信息在传入数据库·库处理,这样数据库·库内就没有出现其他库的代码,但就是有一个问题,刚刚说过了,这些库都可能要输出信息,比如验证时未通过,要提示出错,要调用Message库,数据库查询出错,要调用Message库,可这个,如何让这些库内不出现Message库的代码,还没有想好,即使是这些库内有一个代理函数,这些库调用自己的代理信息输出,然后各自的代理信息输出函数再将信息传递给Message,那他仍然是在那个库的内部出现了Message库的函数。所以这种方法这里没有想清楚如何解决。方法二:
就比如说过滤这个功能吧,在数据库·库中要进行的过滤,和template库的一定会有不同,对进入数据库·库的数据,要进行防SQL注入过滤,对template库的数据,要进行输出时的防XSS过滤,而且同样是输出信息,输出的内容(还有是否要记录什么的这些要求)也会有不同,所以这些功能,就不在单独提取出来做成库了,而是每个库中都都有这些函数,这样这些库就可以之间降低耦合了,都不用调用其他库,不过这样就是可能会出现重复的代码
请问到底要怎样啊?搞不明白啊,太郁闷了,或则这两种办法都不好,请高人们提供一种更加能够清楚分离的办法(我有代码上的强迫症,谢谢帮忙,不写得好看我受不了……)。举几个稍稍看了一下的框架如何处理这个信息的方式。
我看到CodeIgniter是每个库都有ERROR函数,用来提示出错,然后这个函数,又将信息转发给common中的SHOWERROR函数,因为它的显示错误的函数,不是在一个单独的库里,所以这样调用了,可是我想把所有的功能都分别封装到库里。
Zend Framework也是每个库有各自的异常处理类(但是每个异常处理类都是继承与一个总的Zend_Exception),但他的Filter什么的这些功能是独立的

解决方案 »

  1.   

    又来了?
    库 -- 类的集合
    我的观点:
    1、不要试图去模仿成品的框架,因为这些框架不是很容易弄明白的。即便是能熟练使用,也不一定就能弄清楚其中的联系。况且为了“向下兼容”高版本的比低版本的还要混乱
    2、如果异常处理仅仅是抛出错误,那么有没有都无所谓,反正运行已被终止了
    3、关于过滤数据,应该放在各个库中。只处理与自己后续操作有关的部分
    4、所有的库都是独立的,在一个从输入到输出的流程中除两端以外的所有中间库都应做到可缺省
    5、流程中的所有数据(包括错误)的交互都交给“物流”
      

  2.   

    继续请教楼上的:
    3、关于过滤数据,应该放在各个库中。只处理与自己后续操作有关的部分
    这个貌似可以不用在每个库中也可以吧?在库外处理完,只把数据传入就可以了,库仅仅负责功能,过滤这种事情还是可以交给单独的过滤库
    4、所有的库都是独立的,在一个从输入到输出的流程中除两端以外的所有中间库都应做到可缺省
    5、流程中的所有数据(包括错误)的交互都交给“物流”
    有点不太明白“从输入到输出的流程中除两端以外的所有中间库都应做到可缺省”是什么意思?还有“物流”又是指什么?
    谢谢
      

  3.   

    我是这么考虑的:比如一个操作数据库的库,他至少应该检查传入给他的数据是否合法,比如是否存在需要转义的字符,如有还需要做转义处理。他也应该检查传入的数据的编码类型是否合适,不合适也应做相应的处理
    而这种检查与操作是其他库不需要的“从输入到输出的流程中除两端以外的所有中间库都应做到可缺省”是指缺少处于流程中间的任何库(可能是没使用,也可能是出现了错误),整个流程不会被中断,只是表现有差异而已“物流”又是指什么?指通讯机制,不在一个类中进入另一个类的内部。这是降低耦合的必要条件