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

翻译 Summer ⋅ 于 6个月前 ⋅ 最后回复由 DavidNineRoc 3周前 ⋅ 3939 阅读 ⋅ 原文地址

站点的翻译文章创建时,您将第一时间收到通知。

这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍

file

我坐下来和我的团队成员一起解决问题。 “我们必须赢得这场胜利”我说,深深地埋头在这两天内研究出的一个可用原型---每个人的竞争本性已被点燃,小伙子们要想得是,哪一个会争夺到第一,第二或第三的位置。

几分钟后,一位高级工程师(管事儿的)走到我的办公桌前,脸上露出不满的神情,喃喃地说:“你的代码不整洁,太乱了!” 这是导致我书写更整洁代码的开始。

zhangbao 翻译于 6个月前

查看其他 2 个版本

file

代码能跑起来不就完了嘛,还要整洁?你可能会听到有人这么说,但我要说的是,代码不仅要能跑起来,还要写整洁,真的。

我当一名软件工程师有几年了,写了一些程序。这段岁月告诉我,代码仅能跑起来是不够的。

我的问题很简单:我专注于让代码跑通了,可招致了技术性债务,而这些债务在某个时刻将不得不还清。

zhangbao 翻译于 6个月前

如何让你的代码保持整洁

想要让你的代码整洁优雅,仅仅读完 uncle Bob《代码整洁之道》 是不够的,还需要知识和持续的练习,你必须要学习原理,模式以及实践。也许这需要长时间的努力工作,但不妨你现在就开始行动。

无论你现在的代码多么的整洁,然而总有一些东西能你的代码变得更加整洁,这需要你去学习。

通过读专家的书或者帖子来学习,是一个非常有效的途径。你可以关注他们的 twitter,听他们的演讲,关注他们的 GitHub,学习他们写代码的方式以及结构。

除非你向你所在领域的专家不断学习,否则,你可能一直停留在工程师的级别。

LOST 翻译于 6个月前

查看其他 3 个版本

保持你的函数短小精悍

这大概是1337篇文章中强调方法和函数尽可能端小的一篇。这里很容易出错。

整洁的代码不仅仅是编写简短的方法,编写的代码要清晰地传达意图。

当一个函数太长时,很可能表明做的太多了,读者会阅读中迷路。函数应该只做一件事。

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' 不仅整洁,而且解耦;

rayle 翻译于 6个月前

查看其他 1 个版本

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

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

$date =date('Y-m-d'); //当然,这是一个日期,但是他的命名太通用(可以代表很多东西)了
$orderCreationDate =date('Y-m-d'); // 整洁的代码

避免 ifswitch 语句

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

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.
    }
}
轻色年华 翻译于 6个月前

避免心理地图式命名

干净的代码应该易于阅读,理解,不应该有猜测的余地。

使程序看起来简单的不是语言,而是使语言变得简单的程序员。
 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;

}

这不仅容易理解,而且更容易测试。

sayhe110 翻译于 6个月前

理解和应用S.O.L.I.D的原则

S.O.L.I.D 是面向对象设计的头五大基本原则的首字母缩写,由Robert C. Martin 提出。 这些原则,结合在一起能够方便程序员开发低耦合,高内聚,封装良好的代码。这些原则是密切相关的,只有灵活的应用你才能写出更好的代码。关于这些原则我写在另一篇文章中here

不要对自己太苛刻

想知道为什么这在目录上吗?想一次理解所有的内容,很容易陷入整洁代码的世界。不幸的是:它需要时间,几个月,几年甚至终身。在开始决定一切要清洁时,需要学习和实践这些原则。

rayle 翻译于 6个月前

查看其他 1 个版本

结论

通过写这篇文章, 我希望可以鼓励一些人做一个更好的开发者并且开始关心代码整洁 (万一你不是呢).

随时删除你的意见, 使例子变得简洁,可以在 LinkedIn ](https://www.linkedin.com/in/samuel-james-abiodun/)or tell me about a new opportunity添加我.

进一步阅读

Awesome Curated List of Clean Code Resources\
Clean Code: A Handbook of Agile Software Craftsmanship 1st Edition\
Clean Code PHP\
A month of clean code\
Clean code concept adapted for PHP
\
Clean code JavaScript

sane 翻译于 6个月前

查看其他 1 个版本

原文地址:https://codeburst.io/keeping-your-code-c...

译文地址:https://laravel-china.org/topics/7468/pl...


本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

本帖已被设为精华帖!
回复数量: 14
  • lalalalalaTwoEyes
    6个月前

    感觉中心思想就是提取方法

  • Edwin
    6个月前

    化整为零吧

  • Donng
    6个月前

    强烈推荐大家去读英语原文和评论以及博主的其他文章,一定会产生很多新的认识。

  • skyEvyn
    6个月前

    对于用多态代替if...swich这块,只有实现,但是怎么应用。。。。。

    是不是很笨啊

  • kimi
    6个月前

    方便别人,方便自己~

  • Chasers9527 代码是写给人看的,顺便给机器运行 1
    6个月前

    @Edwin 化整为零是删库跑路么???

  • Edwin
    6个月前

    @xhh110 :smile:结构简单化

  • 轻色年华 全栈开发教学视频 https://v.58hualong.cn/
    6个月前

    用现在流行的一个词汇就是去中心化 :smile:

  • DavidNineRoc 当神不再是我们的信仰,那么信仰自己吧,努力让自己变好不辜负自己的信仰...
    4个月前

    file
    没有人问一下吗?那我就问了 >_<
    有没有译者做个备注,该怎么使用?分解成多个类之后,就不用 if,else了?
    你不得判断用哪个类?

    if ($book->type) {
        (new AudioBookOrder)->process();
    } else {
        // other
    }

    难道就不用判断了?
    或者用动态拼接类名?那不现实啊,你能动态拼接类名肯定就能拼接方法名。
    减少 if else?我觉得这个是让代码逻辑更清楚一点吧?把代码分得更细化。

  • 一根毛毛闯天下
    4个月前

    @skyEvyn 我也想问这个问题,既然将switch改成了多态,但是用的时候呢,该怎么使用,不也是要 if 判断然后实例化不同的类然后进行方法调用吗?我实在看不出来这样写怎么方便,请知道的兄弟指教一下咯

  • 一根毛毛闯天下
    4个月前

    @DavidNineRoc 对头,我也想问这个问题,这个文章只是讲如何封装,但是并没有解释如何怎么使用

  • DavidNineRoc 当神不再是我们的信仰,那么信仰自己吧,努力让自己变好不辜负自己的信仰...
    4个月前

    @一根毛毛闯天下 倒是通过类名简单的知道要做什么了,不用 if else 感觉只能动态拼接类名了。

  • 一根毛毛闯天下
    4个月前

    @DavidNineRoc 而且每一个判断都要先 new 一次然后再调用方法,这样内存就要分配一个地址空间出来,感觉会更占内存啊

  • DavidNineRoc 当神不再是我们的信仰,那么信仰自己吧,努力让自己变好不辜负自己的信仰...
    4个月前

    @一根毛毛闯天下 不用判断,动态拼接类名,统一调用方法

    (new "{$type}BookOrder ')->process();
暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

Elasticsearch-PHP 中文文档

Lumen 中文文档

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档