单一责任原则实施

时间:2015-04-13 07:40:26

标签: php design-patterns solid-principles single-responsibility-principle

我有一个 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 紧密耦合?
实际上,单词这个词的确切定义是什么?我很困惑,移动一张桌子是单一责任还是多重责任(抬起桌子,移动它,然后把它放下)。

1 个答案:

答案 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)就不会发生任何变化。