应用SRP导致问题。如何?

时间:2014-11-28 02:28:59

标签: php single-responsibility-principle

我正在使用php创建自己的查询生成器,它也可以执行查询并从数据库中获取结果。起初我在一个类中有这个功能,但是在考虑之后我相信 QueryBuilder DBProcessor 应该是两个独立的类。

class QueryBuilder {

    var $query;

    ...
    function select()
    function from()
    function join()
    function where()
    ...
}

class DbProcessor {

    ...
    function execute()
    function rowCount()
    function startTransaction()
    function lastInsertId()
    ...
}

我遇到的问题是在尝试坚持其他良好的编程约定的同时使用这些。(松散耦合)

我应该在 QueryBuilder 中创建一个构造,以便在创建时传入 DbProcessor 的实例吗?然而,这个想法似乎走下坡路,因为我最终会在 QueryBuilder 中复制方法名称,只是为了调用 DbProcessor 中的方法,如下所示

class QueryBuilder {

    var $DbProcessor;

    function select()
    ...

    function rowCount() 
    {
        $this->DbProcessor->rowCount()
    }

    function startTransaction() 
    {
        $this->DbProcessor->startTransaction()
    }
}

这种方式似乎只是添加了重复的方法名称,并且将 DbProcessor 放在 QueryBuilder 中似乎更好。

我怎样才能实现我想要的目标?

1 个答案:

答案 0 :(得分:0)

我在个人项目中做过类似的事情。在我的例子中,您的QueryBuilder仅负责构建返回String var的sql语句。没有执行。只构造一个纯字符串SQL。另一方面,database有一个方法来执行作为参数传递的SQL语句。然后,为了编排整个查询执行,我有其他类xxxRepository.java,其中我将拥有getXXXById()类型的所有实体方法。这会调用QueryBuilder.java返回我要执行的SQL,然后将其传递给Database.java execute()方法以获得结果。