2014-11-28 3 views
0

Я создаю свой собственный Query Builder, используя php, который также может выполнять запросы и получать результаты из базы данных. Сначала у меня была эта функциональность в пределах одного класса, однако, подумав об этом, я полагаю, что QueryBuilder и DBProcessor должны быть двумя отдельными классами.Применение проблем с SRP. Как?

class QueryBuilder { 

    var $query; 

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

class DbProcessor { 

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

Проблема, которую я имею использует thse вместе при попытке придерживаться других конвенций хорошо программирования. (Слабая связь)

Должен ли я создать конструкцию внутри QueryBuilder так, что экземпляр DbProcessor должен быть передан при создании? Однако эта идея, кажется, идет под гору, как я закончу дублирование имен методов в моем QueryBuilder только для вызова методов в DbProcessor вроде как следующий

class QueryBuilder { 

    var $DbProcessor; 

    function select() 
    ... 

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

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

Таким образом, только, кажется, добавить повторяющиеся имена методов и для того, чтобы было бы лучше просто поставить DbProcessor внутри QueryBuilder.

Как я могу достичь того, чего хочу здесь?

ответ

0

Я сделал что-то подобное в личном проекте. В моем случае ваш QueryBuilder несет ответственность только за создание операторов sql, возвращающих String var. Никаких казней. Только создайте чистую строку SQL. С другой стороны, database, имеет метод выполнения SQL-предложения, передаваемого как аргумент. Затем, чтобы организовать выполнение всего запроса, у меня есть другой класс, xxxRepository.java, где у меня будут все сущностные методы типа getXXXById(). Это вызывает QueryBuilder.java, возвращающий SQL, что я хочу выполнить, а затем передал его методу Database.java execute() для получения результатов.

Смежные вопросы