将功能排成一行而不是多线功能会有什么危害吗?例如,我为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);
}
这最终会遇到问题吗?或者他们一次被称为一个部分,好像他们在自己的线上?
感谢。
答案 0 :(得分:5)
在一行中使用链式方法,如下所示
return $this->db->prepare("$query")->execute()->fetch(PDO::FETCH_OBJ)->$object;
是Robert Martin中Clean Code (pg 98/99)所谓的“火车残骸”。它很难阅读并且“通常被认为是草率的”并且应该避免更具可读性
$statement = $this->db->prepare("$query");
$statement->execute();
$result = $statement->fetch(PDO::FETCH_OBJ);
return $result->$object;
请注意,我更正了上面代码段中的代码,因为您的单行将不工作,因为execute
returns a boolean,因此您无法在其上调用fetch
:
bool PDOStatement::execute ([ array $input_parameters ] )
换句话说,无论如何,你不能把它写成一行语句。
另请注意,方法链接通常违反Law of Demeter,其中声明
对象O的方法M只能调用以下类型对象的方法:
- O本身
- M的参数
- 在M
中创建/实例化的任何对象- O的直接组件对象
- 一个全局变量,可由O访问,范围为M
不遵循LoD通常会导致单元测试中的Mockfest,并使您的应用程序与必要的更多类紧密耦合,这反过来会损害可重用性并增加更改所需的时间(除其他外)。
答案 1 :(得分:1)
命令行代码将始终按预期顺序调用。没有什么可担心的,除非代码可读或不可读。如果该行非常长,您可能希望将其包装为多行,但您显示的示例对我来说看起来不错。
答案 2 :(得分:0)
如果由于某种原因与数据库的连接失败,则可能导致FATAL_ERROR,因为其中一个对象将返回false。