#课程
上一课介绍了写好代码的重要性, 以及什么是好的代码, 接下来通过一些示例介绍如何写出好的代码。
以下示例用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. 变量命名如果有明确的语境,就没必要在变量名上增加前缀。
作业
选择至少三个技巧示例, 翻查自己以往写过的代码,写出优化前和优化后的代码, 发布到留言区。
推荐阅读
如果有志向于持续提升自己的代码水平,推荐阅读以下书籍:
- 《代码整洁之道》《Clean Code》
- 《程序员应该知道的97 件事》《97 Things Every Programmer Shoud Know》
- 《代码大全》《Code Complete》
- 《C语言程序设计》《The C Programming Language》
转载请注明:大后端 » 如何写好代码(2)——变量篇