2

使用单行功能而不是多行功能有什么害处吗?例如,我为 PDO 数据库连接编写了一个类文件。我为它编写的所有函数都是一行行的。我还没有遇到任何错误,但是如果有滞后之类的,它们会突然出现吗?

以下是其中的一些功能。

public function getObject($query, $object) {
  return $this->db->prepare("$query")->execute()->fetch(PDO::FETCH_OBJ)->$object;
}

public function getArray($query) {
  return $this->db->prepare("$query")->execute()->fetchAll(PDO::FETCH_NUM);
}

public function insertArray($query, $array) {
  return $this->db->prepare("$query")->execute($array);
}

这最终会遇到问题吗?还是他们一次被称为一个部分,就好像他们在自己的线路上一样?

谢谢。

4

3 回答 3

5

像这样在一行中使用链式方法

return $this->db->prepare("$query")->execute()->fetch(PDO::FETCH_OBJ)->$object;

就是Robert Martin在Clean Code (pg 98/99)中所说的“Train Wrecks” 。它很难阅读并且“通常被认为是草率”,应该避免阅读以提高可读性

$statement = $this->db->prepare("$query");
$statement->execute();
$result = $statement->fetch(PDO::FETCH_OBJ);
return $result->$object;

请注意,我更正了上面代码片段中的代码,因为你的单行代码不起作用,因为execute返回一个 boolean,所以你不能调用fetch它:

bool PDOStatement::execute ([ array $input_parameters ] )

换句话说,无论如何你都不能把它写成一行语句。

另请注意,方法链接通常违反Demeter 定律,该定律指出

对象 O 的方法 M 只能调用以下几种对象的方法:

  • O本身
  • M的参数
  • 在 M 中创建/实例化的任何对象
  • O 的直接组件对象
  • 一个全局变量,可由 O 访问,在 M 的范围内

不遵循 LoD 通常会导致您的单元测试中出现 Mockfest,并使您的应用程序紧密耦合到比必要的更多的类,这反过来又会损害可重用性并增加更改所需的时间(以及其他事情)。

于 2012-05-13T10:55:19.867 回答
1

命令式代码将始终按预期顺序调用。没有什么可担心的,除非代码是否可读。如果该行非常长,您可能希望将其包装成多行,但您展示的示例对我来说看起来不错。

于 2012-05-13T10:32:21.170 回答
0

如果与数据库的连接由于某种原因失败,则可能导致 FATAL_ERROR,因为其中一个对象将返回 false。

于 2012-05-13T10:34:03.247 回答