Fork me on GitHub

如何让你的PHP代码保持整洁


肉食者鄙,未能远谋。

如何让你的代码保持整洁

想要让你的代码整洁优雅,仅仅读完 uncle Bob 的《代码整洁之道》是不够的,还需要知识和持续的练习,你必须要学习原理,模式以及实践。也许这需要长时间的努力工作,但不妨你现在就开始行动。
无论你现在的代码多么的整洁,然而总有一些东西能你的代码变得更加整洁,这需要你去学习。
通过读专家的书或者帖子来学习,是一个非常有效的途径。你可以关注他们的 twitter,听他们的演讲,关注他们的 GitHub,学习他们写代码的方式以及结构。
除非你向你所在领域的专家不断学习,否则,你可能一直停留在工程师的级别。

保持你的函数短小精悍

整洁的代码不仅仅是编写简短的方法,编写的代码要清晰地传达意图。
当一个函数太长时,很可能表明做的太多了,读者会阅读中迷路。函数应该只做一件事。

1
2
3
4
5
6
7
8
9
10
if($order->contains($status){
//do something with order
}
function contains($status){
$order_statuses=['accepted','delivered','rejected','processed'];
if (in_array($status, $order_statuses)) {
return true;
}
return false;
}

我们可以通过重写函数,使它’contains’整洁为:

1
2
3
function contains($status){
return in_array($status, $this->config->statuses);
}

变量或函数的名字应该能够一眼看出它的作用

选择一个合适的函数名字有的时候可能很乏味,但是毫无疑问的是这值得你这样做!因为这使你在代码变更的时候不需要更新代码的注释!

1
2
$date =date('Y-m-d'); //Ofcourse, it's a date but too generic!
$orderCreationDate =date('Y-m-d'); //cleaner code

避免 if 和 switch 语句

个人认为,它(if 和 switch 语句)会让我花一点时间去理解。“你告诉我,我该怎么避免使用我最爱的语句之一——if & else?”事实证明,大部分条件语句可以简单的被分解成函数或类。这并不是说不让你使用 if 和 switch 语句,只是想说看情况使用!
这里有一个很好的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class BookOrder
{
public function process()
{
switch ($this->book->type) {
case 'audiocopy':
return $this->processAudioBook();
break;
case 'downloadablecopy':
return $this->processDownloadableCopy();
break;
case 'paperbookcopy':
return $this->processPaperBookCopy();
break;
default:
}
}
}

一个干净且更易于维护的书写方式应该是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
interface IBookOrder {
public function process();
}
class AudioBookOrder implements IBookOrder :void {
public function process()
{
// TODO: Implement process() method.
}
}
class PaperBookOrder implements IBookOrder: void {
public function process()
{
// TODO: Implement process() method.
}
}
class DownloadableBookOrder implements IBookOrder: void {
public function process()
{
// TODO: Implement process() method.
}
}

避免心理地图式命名

干净的代码应该易于阅读,理解,不应该有猜测的余地。
下面的代码检查客户是否可以提取一定数量的钱。这很有效,但很混乱。

1
2
3
if($this->user->balance > $amount && $this->user->activeLoan===0){
$this->user->balance -=$amount; // withdraw amount;
}

让我们把它弄的整洁一点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if($this->hasNoActiveLoan() && $this->canWithdrawAmount($amount)){
$this->withdraw($amount);
}
public function hasNoActiveLoan(){
return $this->user->activeLoan===0;
}
public function canWithdrawAmount(float $amount){
return $this->user->balance > $amount;
}
public function withdraw(float $amount){
$this->user->balance -=$amount;
}

https://nikic.github.io/2011/12/27/Dont-be-STUPID-GRASP-SOLID.html
https://laravel-china.org/topics/7468/please-keep-your-php-code-neat-and-tidy