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架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)

PHP 代码简洁之道 ( PHP Clean Code)(第二部分)相关推荐

  1. PHP 的代码简洁之道(Clean Code PHP)

    介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于 PHP.它并不是一个编码风格指南,它指导我们用 PHP 写出具有可读性,可复用性且可分解的代码. 并非所 ...

  2. 代码整洁之道(Clean Code)- 读书笔记

    Sorry, 许久未更新文章了,主要因为刚刚换了一家新公司,忙于组建团队(建设.招聘.流程.框架等)与熟悉公司业务,还有领导给的其他工作等等,实在是没有时间更新了.最近在和团队分享Bob大叔的< ...

  3. 代码整洁之道,clean code

    一.注释 1.不准确的注释比没有注释更令人头疼 尽量用语义化的代码来解释你的意图,而不是依赖注释来解释一段代码 原因很简单:程序员不能坚持维护注释. 代码在后期维护中,不断的优化.变动,很有可能最初的 ...

  4. 学会这样写代码,一看就是资深工程师,代码简洁之道PHP版本

    文章目录 一.前言 二.规范 2.1 整体结构规范 2.1.1 类的括号前括号单独一行 2.1.2 方法的前括号单独一行 2.1.3 方法内部语句前括号不换行 2.2 变量与常量 2.2.1 变量的命 ...

  5. Java代码简洁之道

    Java如何把代码写的简洁? 其实这是一个熟练的过程,有的代码在编写的时候有很多方法你没有见过,所以你只能按照一般写法来做,这也就是经验不足!或者有的时候你没有熟练掌握面向对象的思想,所以无法从全局出 ...

  6. 代码简洁之道( PHP Clean Code)

    介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于 PHP.它并不是一个编码风格指南,它指导我们用 PHP 写出具有可读性,可复用性且可分解的代码. 并非所 ...

  7. PHP 代码简洁之道 ( PHP Clean Code)

    介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于PHP.它并不是一个编码风格指南,它指导我们用PHP写出具有可读性,可复用性且可分解的代码. 并非所有的准 ...

  8. JavaScript 代码简洁之道

    测试代码质量的唯一方式:别人看你代码时说 f * k 的次数. 代码质量与其整洁度成正比.干净的代码,既在质量上较为可靠,也为后期维护.升级奠定了良好基础. 本文并不是代码风格指南,而是关于代码的可读 ...

  9. JAVA基础之代码简洁之道

    引言 普通的工程师堆砌代码,优秀的工程师优雅代码,卓越的工程师简化代码.如何写出优雅整洁易懂的代码是一门学问,也是软件工程实践里重要的一环.--来自网络 背景 软件质量,不但依赖于架构及项目管理,更与 ...

最新文章

  1. TensorFlow中的语义分割套件
  2. 在耗时操作结束之前 销毁tableView 如何让tableViewCell 销毁
  3. python help()函数(查看特定模块、关键词、函数等用法)
  4. python引用传递的区别_python的值类型和引用类型及值传递和引用传递的区别
  5. Shell基础知识(三)
  6. 【Heritrix基础教程之3】Heritrix的基本架构
  7. SharePoint 2010 网站模板要求在网站集中激活功能
  8. 【iOS】Quartz2D图片剪切
  9. 华为手机解锁码计算工具_一部华为手机解锁无数翻译,你浪费了此功能吗?
  10. Java中的length字段和length()方法
  11. HTML-表单table
  12. 笔记本电脑换内存条流程
  13. 计算机打印机能不能取消正在,打印机怎么取消正在排队打印的任务? 打印机删除打印任务的教程...
  14. 应届生 实习生 社招最常用招聘网站
  15. 声纹技术(七):声纹技术的未来
  16. 安卓开发 Fragment的简单使用与解析
  17. 64位驱动 hp630打印机_hp1020打印机64位驱动下载
  18. mysql多字段分库分表基因码_mysql数据库优化方案之分库分表,轻松解决亿级数据问题...
  19. Android 解压zip文件你知道多少?
  20. 解决jdbc连接数据库出现的问题: Sun Jan 30 18:46:54 CST 2022 WARN: Establishing SSL connection without server‘s i

热门文章

  1. 收起虚拟键盘的各种方法 -- IOS
  2. 《剑指Offer》 数值的整数次方
  3. 谷歌上线数据搜索引擎 Dataset Search
  4. ktv歌手歌曲后台功能 1216
  5. CF1182E Product Oriented Recurrence
  6. 阿里云POLARDB如何帮助百胜软件应对数据库的“巅峰时刻”
  7. 《Spark 官方文档》Spark配置(一)
  8. iOS开发 适配iOS10以及Xcode8-b
  9. mysql延迟复制实现
  10. 在Oracle DG Standby库上启用flashback database功能