PHP 代码简洁之道 ( PHP Clean Code)(第一部分)

介绍

Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于 PHP。它并不是一个编码风格指南,它指导我们用 PHP 写出具有可读性,可复用性且可分解的代码。

并非所有的准则都必须严格遵守,甚至一些已经成为普遍的约定。这仅仅作为指导方针,其中许多都是 Clean Code 作者们多年来的经验。

尽管许多开发者依旧使用 PHP 5 版本,但是这篇文章中绝大多数例子都是只能在 PHP 7.1 + 版本下运行。

变量

使用有意义的且可读的变量名

不友好的:

$ymdstr = $moment->format('y-m-d');

友好的:

$currentDate = $moment->format('y-m-d');

对同类型的变量使用相同的词汇

不友好的:

getUserInfo();

getUserData();

getUserRecord();

getUserProfile();

友好的:

getUser();

使用可搜索的名称(第一部分)

我们阅读的代码超过我们写的代码。所以我们写出的代码需要具备可读性、可搜索性,这一点非常重要。要我们去理解程序中没有名字的变量是非常头疼的。让你的变量可搜索吧!

不具备可读性的代码:

//  见鬼的 448 是什么意思?

$result = $serializer->serialize($data, 448);

具备可读性的:

$json = $serializer->serialize($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

使用可搜索的名称(第二部分)

不好的:

// 见鬼的 4 又是什么意思?

if ($user->access & 4) {

    // ...

}

好的方式:

class User

{

    const ACCESS_READ = 1;

    const ACCESS_CREATE = 2;

    const ACCESS_UPDATE = 4;

    const ACCESS_DELETE = 8;

}

if ($user->access & User::ACCESS_UPDATE) {

    // do edit ...

}

使用解释性变量

不好:

$address = 'One Infinite Loop, Cupertino 95014';

$cityZipCodeRegex = '/^[^,]+,\s*(.+?)\s*(\d{5})$/';

preg_match($cityZipCodeRegex, $address, $matches);

saveCityZipCode($matches[1], $matches[2]);

一般:

这个好点,但我们仍严重依赖正则表达式。

$address = 'One Infinite Loop, Cupertino 95014';

$cityZipCodeRegex = '/^[^,]+,\s*(.+?)\s*(\d{5})$/';

preg_match($cityZipCodeRegex, $address, $matches);

[, $city, $zipCode] = $matches;

saveCityZipCode($city, $zipCode);

很棒:

通过命名子模式减少对正则表达式的依赖。

$address = 'One Infinite Loop, Cupertino 95014';

$cityZipCodeRegex = '/^[^,]+,\s*(?<city>.+?)\s*(?<zipCode>\d{5})$/';

preg_match($cityZipCodeRegex, $address, $matches);

saveCityZipCode($matches['city'], $matches['zipCode']);

避免嵌套太深和提前返回 (第一部分)

使用太多 if else 表达式会导致代码难以理解。

明确优于隐式。

不好:

function isShopOpen($day): bool

{

    if ($day) {

        if (is_string($day)) {

            $day = strtolower($day);

            if ($day === 'friday') {

                return true;

            } elseif ($day === 'saturday') {

                return true;

            } elseif ($day === 'sunday') {

                return true;

            } else {

                return false;

            }

        } else {

            return false;

        }

    } else {

        return false;

    }

}

很棒:

function isShopOpen(string $day): bool

{

    if (empty($day)) {

        return false;

    }

    $openingDays = [

        'friday', 'saturday', 'sunday'

    ];

    return in_array(strtolower($day), $openingDays, true);

}

避免嵌套太深和提前返回 (第二部分)

不好:

function fibonacci(int $n)

{

    if ($n < 50) {

        if ($n !== 0) {

            if ($n !== 1) {

                return fibonacci($n - 1) + fibonacci($n - 2);

            } else {

                return 1;

            }

        } else {

            return 0;

        }

    } else {

        return 'Not supported';

    }

}

很棒:

function fibonacci(int $n): int

{

    if ($n === 0 || $n === 1) {

        return $n;

    }

    if ($n > 50) {

        throw new \Exception('Not supported');

    }

    return fibonacci($n - 1) + fibonacci($n - 2);

}

避免心理映射

不要迫使你的代码阅读者翻译变量的意义。

明确优于隐式。

不好:

$l = ['Austin', 'New York', 'San Francisco'];

for ($i = 0; $i < count($l); $i++) {

    $li = $l[$i];

    doStuff();

    doSomeOtherStuff();

    // ...

    // ...

    // ...

    // Wait, what is `$li` for again?

    dispatch($li);

}

很棒:

$locations = ['Austin', 'New York', 'San Francisco'];

foreach ($locations as $location) {

    doStuff();

    doSomeOtherStuff();

    // ...

    // ...

    // ...

    dispatch($location);

}

不要增加不需要的上下文

如果类名或对象名告诉你某些东西后,请不要在变量名中重复。

小坏坏:

class Car

{

    public $carMake;

    public $carModel;

    public $carColor;

    //...

}

好的方式:

class Car

{

    public $make;

    public $model;

    public $color;

    //...

}

更多学习内容请访问:

八重樱:腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)​zhuanlan.zhihu.com

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容