у меня есть SQLStatement класс, который создает SQL-запрос и поддерживает параметры связывания (которые хранятся в свойстве $ params).
у меня есть PDOAdapter класс, который действует так же, как PDO, но имеет дополнительные функции, такие как prepare_query(SQL Statement $sql)
, Он подготавливает оператор SQL и связывает параметр, который хранится в $sql->params
, затем выполните его.
А также,
Я думаю, что я хочу добавить QueryEngine класс, который может выбирать, вставлять, обновлять, удалять, что означает, что он будет создавать оператор SQL, используя SQLStatement класс и сделать PDOAdapter подготовить запрос.
Я могу сказать, что его ответственность заключается в создании sqlstatement на основе параметров метода, используя SQLStatement класс И сделать PDOAdapter обработайте это. (Множественная ответственность)
Но я также могу сказать, что его ответственность заключается в выполнении основных операций CRUD. (Единственная ответственность)
Является ли это QueryEngine класс нарушает принцип единой ответственности?
Это делает SQLStatement а также PDOAdapter тесно связаны?
На самом деле, каково точное определение слова Single? Меня смущает, является ли перемещение стола одной или несколькими обязанностями (поднимите стол, переместите его и положите).
На самом деле, каково точное определение
Single-ответственность?
Представьте на секунду, что вы строите корпус компьютера. Он содержит в себе такие вещи, как блок питания, материнская плата, жесткий диск. И на любом языке программирования это можно представить так:
case = new Case(new Motherboard(), new PowerSupply(), new HDD() ...);
Как видите, части корпуса полностью отделены друг от друга. Это означает, что их можно легко заменить, не касаясь других частей. Например, если вам нужно заменить жесткий диск, вы просто передадите ему другой экземпляр жесткого диска. Вот и все. HDD (и аналогичные части) имеет одну причину для изменения.
Что касается вашего вопроса, то, что вы хотите сделать, должно быть сделано в так называемом Data Mappers, которые абстрагируют конкретную таблицу с общими абстракциями на ней.
Прежде всего, я покажу вам, как это обычно делается:
$queryBuilder = new QueryBuilder();
$pdo = new PDO(...)
$dbh = new DBH($pdo, $queryBuilder);
// ... Then somewhere in some mapper
public function fetchById($id)
{
return $this->dbh->select('*')
->from('some table')
->where('id', '=', $id)
->query();
}
Это придерживается SRP, потому что каждая зависимость ($pdo
или же $queryBuilder
) могут быть легко заменены, поэтому у них есть одна причина для изменения.
Что касается вашего исходного вопроса,
QueryEngine
(Правильное имя QueryBuilder
) не будет ничего нарушать, пока знает только, как создавать строки запроса.
Других решений пока нет …