单一职责原则实施

Single Responsibility Principle Implementation

我有一个 SQL语句 class,它构建了 sql 查询并支持绑定参数(存储到 属性 $参数).
我有一个 PDOAdapter class,它的行为就像 PDO,但具有其他功能,例如 prepare_query(SQL Statement $sql)。它准备 sql 语句并绑定存储在 $sql->params 中的参数,然后执行它。

并且,

我想我想添加一个 QueryEngine class,它可以 select、插入、更新、删除,这意味着它将建立 SQL语句使用SQL语句class并使PDOAdapterprepare_query它。

我可以说它的职责是使用 SQLStatement class 根据方法参数生成 sqlstatement 并制作 PDOAdapter 处理它。 (多重责任)
但是,我也可以说,它的职责是进行基本的 CRUD 操作。 (单一职责)

这个QueryEngineclass是否违反单一职责原则?
这会使 SQLStatementPDOAdapter 紧密耦合吗?
实际上,单身这个词的确切定义是什么?搞不懂搬table是单一责任还是多重责任(把table举起来,搬起来,放下)。

Actually, what is the exact definition of the Single-Responsibility?

想象一下,您正在构建计算机机箱。它包含电源,主板,硬盘等内容。在任何编程语言中,都可以这样表示:

case = new Case(new Motherboard(), new PowerSupply(), new HDD() ...);

如您所见,外壳的各个部分彼此完全分开。这意味着它们可以在不接触其他部件的情况下轻松更换。例如,如果您需要更换 HDD,只需将另一个 HDD 实例传递给它即可。而已。 HDD(和类似部件)有一个改变的理由。

至于你的问题,你想做的事情需要在所谓的 Data Mappers 中完成,它抽象了一个特定的 table,上面有共同的抽象.

首先,我将向您展示它通常是如何完成的:

$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)只要知道如何构建查询字符串就不会违反任何内容。