参考了N多框架(不过是这两天的事,所以还没来得及看代码,先看了一下他的文件的组织形式,文件的结构,外加自己大概猜测一下),然后自己正在编写自己的框架。现在我有一堆功能库(DB、Memory、Debug、Template、Filter、Input、Output等等,一堆关于实际操作功能的库)。为了让一个库内部不出现另一个库的调用代码,我想了两种办法解决。我们拿DB库来举例。我们假设这些功能库,都是处理数据的,都涉及到几个与本库无关共同功能(即不是本库专有的功能),如获取外部用户输入数据(Input库的职责),对数据过滤(Filter库),抛出异常(exception库),输出数据(Output库)。方法一:
DB库内部也需要这些功能,但这些功能有专门的其他库来实现,为了让DB库内不出现调用其他库的代码,降低库之间的耦合,我可以让DB库继承与一个data模型(model),不只是DB库,其他实现与数据操作相关的库也可以继承data模型,(如果这些库不是与数据有关,可以继承其他模型,其他模型中实现了与那些库有关系的公共方法),在data模型中实现这些共有方法,然后在继承了他们的库中,就可以直接调用了,大意如下:class dataModel
{
    protect function GetParam($key)
    {
        ……一堆实现代码,通过调用其Input库……
    }
    protect function Show($data)
    {
        ……一堆实现代码,通过调用其Output库……
    }
    protect function Filter($string)
    {
        ……一堆实现代码,通过调用其Filter库……
    }
    protect function Exception($string)
    {
        ……一堆实现代码,通过调用其Exception库……
    }
}
class DB extends dataModel
{
   ……一堆自己的专有方法……
}方法二:
DB内部,既不负责数据的获取,也不负责数据的过滤。
用户需要在自己的过程编码中,先调用Input::GetParam()获取数据,然后将获取的数据传入Filter::Filter()进行过滤,再将过滤好的数据传入DB库中进行处理。$data = Input::GetParam();
$data = Filter::Filter($data);
DB::Insert($data);
请问哪种方法更好?谢谢

解决方案 »

  1.   

    那么哪种更能够降低代码耦合呢?
    貌似我看得ZendFramework是第二种,他的库完全没有继承什么
    而那个仿RoR的cakephp是通过继承什么实现的
    (没仔细看,开了几个文件看了看头,有误别拍我)
      

  2.   

    第二种比较好 DB继承datamodel?怪。。
    最好是弄个工厂类获取各功能类,再弄个工具类返回一些常用类组合
    这样比如你后期嫌弃原来的filter类不够好,更换一个,你不用改那么多代码。
      

  3.   

    现在就是有一点最高不明白了,我现在也比较倾向于第二种,但是,对于一个库内可能抛出的错误,要怎么处理?
    我看到ZendFramework,他每一个库,竟然都有一个与之对应的错误处理文件,当然啦,每个库的错误处理文件,都是继承于总的Zend_Exception,也就是说它是在每个库内都有一个异常处理,然后这些异常处理,又都是继承于总的把Zend_Exception。虽然说每个库内这样就无法直接看到了异常处理库的代码了,但在每个库中的异常处理处仍然是基于异常处理的库。我想能不能在每个库中设置一个变量,记录运行信息,每执行完一个功能后,检查当前功能库中的这个变量是否有信息,有信息则把信息交给异常处理库来抛出
    即:
    class DB
    {
        public $exception = array();
    }$DB = new DB();
    $DB->func();
    if(!empty($exception)) Exception::Throw($exception);
      

  4.   

    不是跟你说了吗?选择什么样的设计模式要根据目标任务来定
    ZendFramework 是开发框架,他试图将其应用于所有项目。于是他的所有类库几乎都能独立工作
    也就是说,你在 ZendFramework 中调试好一个项目后,只需发布所使用到的几个类库就可以了
    这样的框架结构就必然出现冗余代码
      

  5.   

    ZendFramework 真是很奇怪
    他抛出异常,总是这样一句,像调用函数一样,但却没有 try {} catch{}
    Zend_Exception是直接继承于Exception
    throw new Zend_Exception('Directory argument must be a string or an array');
    我小小的试了一下,他这种写法貌似行不通,因为我故意出错,调用Zend_Loader::loadClass(null);这是他应该抛出错误,但是这样直接PHP就提示出错了,为什么啊?既然错了ZF为什么还这样写?
      

  6.   

    这个...你得写点更具体的实现...
    不知道你的datamodel类是什么样的,也不知道你的db类是什么样的zfw现在的quickstart里是用的mapper: 
    http://framework.zend.com/manual/en/learning.quickstart.create-model.html
    Application_Model_Guestbook是model,
    Application_Model_GuestbookMapper是mapper, 
    两个不直接相关,Application_Model_Guestbook作为构造函数的参数传进mapper里去.更象你的第二种
      

  7.   


    这个,如果func()内部的致命错误你如何处理? 
      

  8.   


    这个前两天刚有人问过,
    这里zf是抛出异常后给 具体应用 处理, 就是说你在你的应用里可以选择出错后的处理方式, zf不能完全代替你做因为它不知道你希望如何处理.