翻译:保持你的代码洁净
我在座位上安顿下来,与我的团队成员一起解决问题。我说”我们必须赢的这场比赛”。在两天内埋头开发一个工作原型,大家的好胜心都被激发,都在争夺前三名。
几分钟后,其中的一个高级工程师走到我的办公桌前,脸上露出一丝不满,喃喃自语:你的代码不清晰,很乱!这是我迈向clean code旅程的开始。
clean code?嗯,这对于我来说并不奇怪,但是如果代码正常工作,这真的很重要吗。是的,它确实很重要,一千次。
在这次活动之前,我曾担任几年的软件工程师。我已经构建了应用,但是我刚刚被告知了让我代码不一样的东西。
我的问题很简单:我专注于完成工作,目的是编写有效的代码,反过来又招致了技术债务。
clean code 的方式
当你读完clean code的所有章节时,就不会发生这种情况。它需要知识和不断的实践,你必须学习原理,模式和实践。这是艰苦的工作需要数年,但你可以从今天开始。
无论你怎么去clean你的code,总有一件或两件你能学到的事情使code变得更干净。
学习的最佳方式之一是阅读专家的书籍或者帖子,你应该在你的twitter中有他们的推特流,听取他们的交谈,在github上follow他们,学习他们的代码是如何写和组织的。
Your growth is limited as an engineer if you do not constantly learn from experts in your field.
保持你的函数短小精悍
这可能是1337篇文章中的一篇,来强调保持函数尽可能短,人们很容易在这里弄错。
clean code不仅仅是写短的方法,而是编写清晰表达意图的代码。
当一个函数太长了,这说明它做的太多了,阅读者可能会无法完全解读它的功能,一个函数应该做一件事。
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更清楚:
function contains($status){
return in_array($status, $this->config->statuses);
}
现在,contains不仅仅更简短,而且还能解耦。
变量和函数名字肯以体现其功能
为函数命名是乏味的,但是这绝对物有所值。当代码改变时,你可以不用更新注释。
$date =date('Y-m-d'); //Ofcourse, it's a date but too generic!
$orderCreationDate =date('Y-m-d'); //cleaner code
避免使用if和switch
就个人而言,我花了一段时间来掌握这一点。你怎么能告诉我避免我的最爱呢?事实上,大多数的条件语句可以很容易的提取到单独的函数和类中。这并不是说你永远不应该使用if和switch语句,但在某些情况下可以避免。
这有一个很好的例子:
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:
}
}
}
更整洁、更易于维护的方法是:
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.
}
}
避免心理映射
clean code应该是更易于阅读,理解并且不应该留下任何猜测空间。
It is not the language that makes a program look simple, but the programmer who makes the language appear simple.
Robert C. Martin
以下代码检查客户能否可以提取一定数额的资金,它有效但是很乱。
if($this->user->balance > $amount && $this->user->activeLoan===0){
$this->user->balance -=$amount; // withdraw amount;
}
让我们把它变得更清晰:
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;
}
这不仅仅更容易理解而且更容易测试了。
理解和应用S.O.L.I.D原则
S.O.L.I.D是由Robert C Martin定义的面向对象编程的前五个原则的首字母缩写。使用这些原则,你可以编写低耦合、高内聚和封装很好的代码。这些原则密切相关。
不要太为难自己
想知道这一点为什么这个在名单上?陷入清洁代码的世界是很容易,想要一天吸收一切。悲伤的是:需要时间,数月,数年和奉献精神。必须学习和实践这些原则,但这一切都始于决定让事情变得更加清洁。