我有一个 SQLStatement 类,它构建了sql查询并支持绑定参数(存储在属性$ params中)。
我有一个 PDOAdapter 类,其行为与PDO类似,但具有prepare_query(SQL Statement $sql)
等附加功能。它准备sql语句并绑定存储在$sql->params
中的参数,然后执行它。
和,
我想我想添加一个 QueryEngine 类,它可以选择,插入,更新,删除,这意味着它将使用 SQLStatement 类构建SQL语句,使 PDOAdapter prepare_query它。
我可以说它的责任是使用 SQLStatement 类基于方法参数生成sqlstatement并使 PDOAdapter 处理它。 (多重责任)
但是,我也可以说,它的职责是做基本的CRUD操作。 (单一责任)
此 QueryEngine 类是否违反单一责任原则?
这是否使 SQLStatement 和 PDOAdapter 紧密耦合?
实际上,单词这个词的确切定义是什么?我很困惑,移动一张桌子是单一责任还是多重责任(抬起桌子,移动它,然后把它放下)。
答案 0 :(得分:1)
实际上,这个的确切定义是什么 单责任?
想象一下,你构建了计算机的案例。它包含电源,主板,硬盘内的东西。在任何编程语言中,都可以这样表示:
case = new Case(new Motherboard(), new PowerSupply(), new HDD() ...);
正如您所看到的,表壳的各个部分完全相互分离。这意味着它们可以轻松更换而无需触及其他部件。例如,如果您需要更换HDD,您只需将另一个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
)就不会发生任何变化。