美文网首页PHP
PHP 代码简洁之道 ( PHP Clean Code)(第一部

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

作者: 八重樱勿忘 | 来源:发表于2020-03-27 15:08 被阅读0次

    介绍

    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等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处

    相关文章

      网友评论

        本文标题:PHP 代码简洁之道 ( PHP Clean Code)(第一部

        本文链接:https://www.haomeiwen.com/subject/deiluhtx.html