PHP 代码简洁之道 ( PHP Clean Code)(第二部分)
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)(第二部分)相关推荐
- PHP 的代码简洁之道(Clean Code PHP)
介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于 PHP.它并不是一个编码风格指南,它指导我们用 PHP 写出具有可读性,可复用性且可分解的代码. 并非所 ...
- 代码整洁之道(Clean Code)- 读书笔记
Sorry, 许久未更新文章了,主要因为刚刚换了一家新公司,忙于组建团队(建设.招聘.流程.框架等)与熟悉公司业务,还有领导给的其他工作等等,实在是没有时间更新了.最近在和团队分享Bob大叔的< ...
- 代码整洁之道,clean code
一.注释 1.不准确的注释比没有注释更令人头疼 尽量用语义化的代码来解释你的意图,而不是依赖注释来解释一段代码 原因很简单:程序员不能坚持维护注释. 代码在后期维护中,不断的优化.变动,很有可能最初的 ...
- 学会这样写代码,一看就是资深工程师,代码简洁之道PHP版本
文章目录 一.前言 二.规范 2.1 整体结构规范 2.1.1 类的括号前括号单独一行 2.1.2 方法的前括号单独一行 2.1.3 方法内部语句前括号不换行 2.2 变量与常量 2.2.1 变量的命 ...
- Java代码简洁之道
Java如何把代码写的简洁? 其实这是一个熟练的过程,有的代码在编写的时候有很多方法你没有见过,所以你只能按照一般写法来做,这也就是经验不足!或者有的时候你没有熟练掌握面向对象的思想,所以无法从全局出 ...
- 代码简洁之道( PHP Clean Code)
介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于 PHP.它并不是一个编码风格指南,它指导我们用 PHP 写出具有可读性,可复用性且可分解的代码. 并非所 ...
- PHP 代码简洁之道 ( PHP Clean Code)
介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于PHP.它并不是一个编码风格指南,它指导我们用PHP写出具有可读性,可复用性且可分解的代码. 并非所有的准 ...
- JavaScript 代码简洁之道
测试代码质量的唯一方式:别人看你代码时说 f * k 的次数. 代码质量与其整洁度成正比.干净的代码,既在质量上较为可靠,也为后期维护.升级奠定了良好基础. 本文并不是代码风格指南,而是关于代码的可读 ...
- JAVA基础之代码简洁之道
引言 普通的工程师堆砌代码,优秀的工程师优雅代码,卓越的工程师简化代码.如何写出优雅整洁易懂的代码是一门学问,也是软件工程实践里重要的一环.--来自网络 背景 软件质量,不但依赖于架构及项目管理,更与 ...
最新文章
- TensorFlow中的语义分割套件
- 在耗时操作结束之前 销毁tableView 如何让tableViewCell 销毁
- python help()函数(查看特定模块、关键词、函数等用法)
- python引用传递的区别_python的值类型和引用类型及值传递和引用传递的区别
- Shell基础知识(三)
- 【Heritrix基础教程之3】Heritrix的基本架构
- SharePoint 2010 网站模板要求在网站集中激活功能
- 【iOS】Quartz2D图片剪切
- 华为手机解锁码计算工具_一部华为手机解锁无数翻译,你浪费了此功能吗?
- Java中的length字段和length()方法
- HTML-表单table
- 笔记本电脑换内存条流程
- 计算机打印机能不能取消正在,打印机怎么取消正在排队打印的任务? 打印机删除打印任务的教程...
- 应届生 实习生 社招最常用招聘网站
- 声纹技术(七):声纹技术的未来
- 安卓开发 Fragment的简单使用与解析
- 64位驱动 hp630打印机_hp1020打印机64位驱动下载
- mysql多字段分库分表基因码_mysql数据库优化方案之分库分表,轻松解决亿级数据问题...
- Android 解压zip文件你知道多少?
- 解决jdbc连接数据库出现的问题: Sun Jan 30 18:46:54 CST 2022 WARN: Establishing SSL connection without server‘s i