PHP 代码简洁之道(小结)(7)
用 DSN 进行配置创建的 DBConnection 类实例。
$connection = new DBConnection($dsn);
现在就必须在你的应用中使用 DBConnection 的实例了。
封装条件语句
不友好的:
if ($article->state === 'published') { // ... }
友好的:
if ($article->isPublished()) { // ... }
避免用反义条件判断
不友好的:
function isDOMNodeNotPresent(\DOMNode $node): bool { // ... } if (!isDOMNodeNotPresent($node)) { // ... }
友好的:
function isDOMNodePresent(\DOMNode $node): bool { // ... } if (isDOMNodePresent($node)) { // ... }
避免使用条件语句
这听起来像是个不可能实现的任务。 当第一次听到这个时,大部分人都会说,“没有 if 语句,我该怎么办?” 答案就是在很多情况下你可以使用多态性来实现同样的任务。 接着第二个问题来了, “听着不错,但我为什么需要那样做?”,这个答案就是我们之前所学的干净代码概念:一个函数应该只做一件事情。如果你的类或函数有 if 语句,这就告诉了使用者你的类或函数干了不止一件事情。 记住,只要做一件事情。
不好的:
class Airplane { // ... public function getCruisingAltitude(): int { switch ($this->type) { case '777': return $this->getMaxAltitude() - $this->getPassengerCount(); case 'Air Force One': return $this->getMaxAltitude(); case 'Cessna': return $this->getMaxAltitude() - $this->getFuelExpenditure(); } } }
好的:
interface Airplane { // ... public function getCruisingAltitude(): int; } class Boeing777 implements Airplane { // ... public function getCruisingAltitude(): int { return $this->getMaxAltitude() - $this->getPassengerCount(); } } class AirForceOne implements Airplane { // ... public function getCruisingAltitude(): int { return $this->getMaxAltitude(); } } class Cessna implements Airplane { // ... public function getCruisingAltitude(): int { return $this->getMaxAltitude() - $this->getFuelExpenditure(); } }
避免类型检测 (第 1 部分)
PHP 是无类型的,这意味着你的函数可以接受任何类型的参数。
有时这种自由会让你感到困扰,并且他会让你自然而然的在函数中使用类型检测。有很多方法可以避免这么做。