单一职责原则实施
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是否违反单一职责原则?
这会使 SQLStatement 和 PDOAdapter 紧密耦合吗?
实际上,单身这个词的确切定义是什么?搞不懂搬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
)只要知道如何构建查询字符串就不会违反任何内容。
我有一个 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是否违反单一职责原则?
这会使 SQLStatement 和 PDOAdapter 紧密耦合吗?
实际上,单身这个词的确切定义是什么?搞不懂搬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
)只要知道如何构建查询字符串就不会违反任何内容。