介紹
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架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67431.html
標籤:PHP
上一篇:關于date()
下一篇:關于trait()
