如何写好代码(2)——变量篇

课程 shanhuhai 40℃ 0评论

课程

上一课介绍了写好代码的重要性, 以及什么是好的代码, 接下来通过一些示例介绍如何写出好的代码。

以下示例用PHP代码编写,其他编写语言可以理解思想后自行推敲

变量部分技巧及示例

使用有意义有可读性的变量

不友好的:

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

友好的:

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

好的示例中 用 $currentDate 明确的让读者理解到变量指代的是当前时间,读者不需要猜测。

对同一目的的变量或者方法使用相同的词汇

不友好的:

getUserInfo();
getUserData();
getUserRecord();
getUserProfile();

友好的:

getUser();

不好的示例中,四种方法目的都是获取用户信息,应该统一成一种词汇getUser()

有特殊意义的标识应该命名为常量以方便查找

我们平时阅读的代码一定比编写的代码多, 所以写出的代码,一定要具备可读性、可搜索性。
有特殊意义的标识应该命名为常量方便查找。

不友好的:

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 ...
}

不好的示例中4 有特殊的意义,在阅读代码时不方便理解,也不方便查找。
好的示例中, 用常量对数字命名, 提升了可阅读性,也方便查找对应的逻辑代码。

使用解释性变量

不友好的:

$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*(?<city>.+?)\s*(?<zipCode>\d{5})$/';
preg_match($cityZipCodeRegex, $address, $matches);

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

避免嵌套太深以及提前返回

不好:


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($day): bool
{
    if (!$day) {
        return false;
    }
    if (!is_string($day)) {
        return false;
    }
    
    $day = strtolower($day);
    if ($day === 'friday') {
        return true;
    } elseif ($day === 'saturday') {
        return true;
    } elseif ($day === 'sunday') {
        return true;
    }
    
    return false;
}

最棒的:

function isShopOpen(string $day): bool
{
    if (empty($day)) {
        return false;
    }

    $openingDays = [
        'friday', 'saturday', 'sunday'
    ];
    // 商店 一、三、五开门
    return in_array(strtolower($day), $openingDays, true);
}

使用 太多 if else 嵌套会导致代码难理解。在函数中在进入主业务逻辑前,部分简单业务可以提前判断,提前返回, 可以使得代码更清晰易读。

不要让代码阅读者猜测变量意义

不要迫使代码阅读者猜测变量的意义, 显式比隐式要好。

不好的

$l = ['武汉', '北京', '上海'];

for ($i = 0; $i < count($l); $i++) {
    $li = $l[$i];
    doSomething();
    doSomeOtherThings();
    // ...
    // ...
    // ...
    // $li 变量代表什么???
    dispatch($li);
}

好的

$locations = ['武汉', '北京', '上海'];

foreach ($locations as $location) {
    doStuff();
    doSomeOtherStuff();
    // ...
    // ...
    // ...
    dispatch($location);
}

很多人喜欢在循环中使用 $i 这种变量的陋习,估计大多来源于在学校学C语言的时候教材上的范例代码, 但是如果你学C语言用的是这本教材,你就会知道,C语言代码也可以写的优雅而且有可读性

《C语言程序设计》《The C Programming Language》
这本经典的教材是C语言作者、Unix之父丹,丹尼斯.里奇写的, 通过阅读这边书你可以学习到原来C语言也可以写的如此简洁易读,想提升自己代码质量的同学可以仔细学习下。

不增加不必要的语境

不好的

class Car
{
    public $carType;
    public $carModel;
    public $carColor;

    //...
}

好的

class Car
{
    public $type;
    public $model;
    public $color;

    //...
}

类名中已知道是 Car, 那么类的属性中再用 Car 开头有点多余了。

总结

本课重点介绍了部分的编码技巧,主要有以下几点:
1. 变量名方法名能够自解释,避免读者猜测。
2. 统一方法变量名称。
3. 有特殊意义的标识符应该命名为常量方便查找。
4. 避免代码嵌套太深以及提前返回提升代码可读性。
5. 变量命名如果有明确的语境,就没必要在变量名上增加前缀。

作业

选择至少三个技巧示例, 翻查自己以往写过的代码,写出优化前和优化后的代码, 发布到留言区。

推荐阅读

如果有志向于持续提升自己的代码水平,推荐阅读以下书籍:

转载请注明:大后端 » 如何写好代码(2)——变量篇

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址