PHP 代碼簡潔之道 ( PHP Clean Code)(第一部分)?
使用默認引數而不是使用短路運算或者是條件判斷
不好的做法:
這是不太好的因為 $breweryName 可以是 NULL.
function createMicrobrewery($breweryName = 'Hipster Brew Co.'): void
{
// ...
}
還算可以的做法:
這個做法比上面的更加容易理解,但是它需要很好的去控制變數的值.
function createMicrobrewery($name = null): void
{
$breweryName = $name ?: 'Hipster Brew Co.';
// ...
}
好的做法:
你可以使用 型別提示 而且可以保證 $breweryName 不會為空 NULL.
function createMicrobrewery(string $breweryName = 'Hipster Brew Co.'): void
{
// ...
}
}
對比
使用 相等運算子
不好的做法:
$a = '42';
$b = 42;
使用簡單的相等運算子會把字串型別轉換成數字型別
if( $a != $b ) {
//這個條件運算式總是會通過
}
運算式 $a != $b 會回傳 false 但實際上它應該是 true !
字串型別 '42' 是不同于數字型別的 42
好的做法:
使用全等運算子會對比型別和值
if( $a !== $b ) {
//這個條件是通過的
}
運算式 $a !== $b 會回傳 true,
函式
函式引數(2 個或更少)
限制函式引數個數極其重要
這樣測驗你的函式容易點,有超過 3 個可選引數會導致一個爆炸式組合增長,你會有成噸獨立引數情形要測驗,
無引數是理想情況,1 個或 2 個都可以,最好避免 3 個,
再多就需要加固了,通常如果你的函式有超過兩個引數,說明他要處理的事太多了, 如果必須要傳入很多資料,建議封裝一個高級別物件作為引數,
不友好的:
function createMenu(string $title, string $body, string $buttonText, bool $cancellable): void
{
// ...
}
友好的:
class MenuConfig
{
public $title;
public $body;
public $buttonText;
public $cancellable = false;
}
$config = new MenuConfig();
$config->title = 'Foo';
$config->body = 'Bar';
$config->buttonText = 'Baz';
$config->cancellable = true;
function createMenu(MenuConfig $config): void
{
// ...
}
函式應該只做一件事情
這是迄今為止軟體工程最重要的原則,函式做了超過一件事情時,它們將變得難以撰寫、測驗、推導, 而函式只做一件事情時,重構起來則非常簡單,同時代碼閱讀起來也非常清晰,掌握了這個原則,你就會領先許多其他的開發者,
不好的:
function emailClients(array $clients): void
{
foreach ($clients as $client) {
$clientRecord = $db->find($client);
if ($clientRecord->isActive()) {
email($client);
}
}
}
好的:
function emailClients(array $clients): void
{
$activeClients = activeClients($clients);
array_walk($activeClients, 'email');
}
function activeClients(array $clients): array
{
return array_filter($clients, 'isClientActive');
}
function isClientActive(int $client): bool
{
$clientRecord = $db->find($client);
return $clientRecord->isActive();
}
函式的名稱要說清楚它做什么 不好的例子:
class Email
{
//...
public function handle(): void
{
mail($this->to, $this->subject, $this->body);
}
}
$message = new Email(...);
// What is this? A handle for the message? Are we writing to a file now?
$message->handle()
;
很好的例子:
class Email
{
//...
public function send(): void
{
mail($this->to, $this->subject, $this->body);
}
}
$message = new Email(...);
// Clear and obvious
$message->send();
函式只能是一個抽象級別
當你有多個抽象層次時,你的函式功能通常是做太多了, 分割函式功能使得重用性和測驗更加容易,.
不好:
function parseBetterJSAlternative(string $code): void
{
$regexes = [
// ...
];
$statements = explode(' ', $code);
$tokens = [];
foreach ($regexes as $regex) {
foreach ($statements as $statement) {
// ...
}
}
$ast = [];
foreach ($tokens as $token) {
// lex...
}
foreach ($ast as $node) {
// parse...
}
}
同樣不是很好:
我們已經完成了一些功能,但是 parseBetterJSAlternative() 功能仍然非常復雜,測驗起來也比較麻煩,
function tokenize(string $code): array
{
$regexes = [
// ...
];
$statements = explode(' ', $code);
$tokens = [];
foreach ($regexes as $regex) {
foreach ($statements as $statement) {
$tokens[] = /* ... */;
}
}
return $tokens;
}
function lexer(array $tokens): array
{
$ast = [];
foreach ($tokens as $token) {
$ast[] = /* ... */;
}
return $ast;
}
function parseBetterJSAlternative(string $code): void
{
$tokens = tokenize($code);
$ast = lexer($tokens);
foreach ($ast as $node) {
// parse...
}
}
很好的:
最好的解決方案是取出 parseBetterJSAlternative() 函式的依賴關系.
class Tokenizer
{
public function tokenize(string $code): array
{
$regexes = [
// ...
];
$statements = explode(' ', $code);
$tokens = [];
foreach ($regexes as $regex) {
foreach ($statements as $statement) {
$tokens[] = /* ... */;
}
}
return $tokens;
}
}
class Lexer
{
public function lexify(array $tokens): array
{
$ast = [];
foreach ($tokens as $token) {
$ast[] = /* ... */;
}
return $ast;
}
}
class BetterJSAlternative
{
private $tokenizer;
private $lexer;
public function __construct(Tokenizer $tokenizer, Lexer $lexer)
{
$this->tokenizer = $tokenizer;
$this->lexer = $lexer;
}
public function parse(string $code): void
{
$tokens = $this->tokenizer->tokenize($code);
$ast = $this->lexer->lexify($tokens);
foreach ($ast as $node) {
// parse...
}
}
}
更多學習內容請訪問:
騰訊T3-T4標準精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67435.html
標籤:PHP
上一篇:關于trait()
下一篇:php-fpm慢查詢日志
