0

0

php教程:php设计模式之编程惯用法_PHP教程

php中文网

php中文网

发布时间:2016-07-21 14:57:45

|

925人浏览过

|

来源于php中文网

原创

请先阅读上一篇文章

重构

即使最有思想性且最熟练的程序员也不能预见一个软件项目中的任何细微之处。问题总是出乎意外的出现,需求也可能在变化,结果是代码被优化,共享然后代替。

重构是一个惯用的方法:检查你所有的代码,找出其中能统一化和简单化的共同或者类似之处,使得你的代码更加容易维护和扩展。重构也包括探索一个设计模式是否能够应用到这个具体的问题上——这也能使解决方案简单化。

立即学习PHP免费学习笔记(深入)”;

重构,简单点说是重命名一个属性或者方法,复杂点说是压缩一个已有的类。改变你的代码使得它符合一个或者更多的设计模式是另外一种重构——读完这本书后,你可能会去实现的。

没有什么能比例子来更好的解释重构了!

让我们考虑两个简单的类:CartLine和Cart。CartLine记录了购物车里面每个项目的单件价格和数量。比如CartLine可能记录着“四见红色的polo衬衣,每件19.99$”。Cart 是一个容器,用来装载一个或者更多的CartLine对象并执行一些相关的计算工作,比如购物车里面的所有商品的总花费。

下面是CartLine和Cart的简单实现: 

// PHP5
class CartLine {
public $price = 0;
public $qty = 0;
}
class Cart {
protected $lines = array();
public function addLine($line) {
$this->lines[] = $line;
}
public function calcTotal() {
$total = 0;
// add totals for each line
foreach($this->lines as $line) {
$total += $line->price * $line->qty;
}
// add sales tax
$total *= 1.07;
return $total;
}
}

重构的第一步必须有足够的测试来覆盖你所有的代码。这样才能保证你修改的代码不能产生和你原来代码不同的结果。顺便提一下,除非你改变了需求(你代码期望的结果)或者在测试实例中发现了错误,你的测试代码是是不能改变的。

下面是一个测试CartLine和Cart的例子,它在重构的过程中是不会改变的。

启科网络PHP商城系统
启科网络PHP商城系统

启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

下载

function TestCart() {
$line1 = new CartLine;
$line1->price = 12; $line1->qty = 2;
$line2 = new CartLine;
$line2->price = 7.5; $line2->qty = 3;
$line3 = new CartLine;
$line3->price = 8.25; $line3->qty = 1;
$cart = new Cart;
$cart->addLine($line1);
$cart->addLine($line2);
$cart->addLine($line3);
$this->assertEqual(
(12*2 + 7.5*3 + 8.25) * 1.07,
$cart->calcTotal());
}
 
看着上面的代码,你可能会发现它们有一些“code smells”(代码臭味)——有着古怪的样子而且看起来好像是有问题的代码——它们就像重构的候选项。(更多关于code smells的资料请看http://c2.com/cgi/wiki?codesmell)。两个最直接的重构候选者是注释和计算(与销售税等相关的计算)。重构的一种形式:析取函数(Extract Method)将把这些难看的代码从cart::calcTotal()中提取出来,然后用一个合适的方法来替代它,从而使得代码更加简洁。

比如,你可以增加两个计算方法:lineTotal()和calcSalesTax():

protected function lineTotal($line) {
return $line->price * $line->qty;
}
protected function calcSalesTax($amount) {
return $amount * 0.07;
}
 
现在你可以重写calcTotal()函数:


public function calcTotal() {
$total = 0;
foreach($this->lines as $line) {
$total += $this->lineTotal($line);
}
$total += $this->calcSalesTax($total);
return $total;
}
 
到目前为止的改动都是有意义的(至少在这个例子的上下文中),它对于再次暂停和运行这些代码来验证结果依然正确是很有帮助的。记得,一个绿色的成功条的显示出来了!(译者注:本章开始时,作者提及到:绿色的条意味着测试都通过了。)

然而,目前的代码依然有一些可以挑剔的地方。其中一个就是在新方法lineTotal()中存取公共属性。很明显计算每行的之和的责任不应该属于Cart类,而应该在类CartLine里面实现。

再次重构,在CartLine中增加一个新的方法total()用来计算订单里面的每个项目的长期价钱。

public function total() {
return $this->price * $this->qty;
}
 
然后从类Cart中移除方法lineTotal(),并改变calcTotal()方法来使用新的cartLine::Total()方法。重新运行这个测试,你依然会发现结果是绿色条。 

全新重构后的代码就是这样:

class CartLine {
public $price = 0;
public $qty = 0;
public function total() {
return $this->price * $this->qty;
}
}
class Cart {
protected $lines = array();
public function addLine($line) {
$this->lines[] = $line;
}
public function calcTotal() {
$total = 0;
foreach($this->lines as $line) {
$total += $line->total();
}
$total += $this->calcSalesTax($total);
return $total;
}
protected function calcSalesTax($amount) {
return $amount * 0.07;
}
}
 
现在这代码不再需要每行注释了,因为代码本身更好的说明了每行的功能。这些新的方法,更好的封装了计算这个功能,也更加容易适应将来的变化。(比如说,考虑不同大的销售税率)。另外,这些类也更加平衡,更容易维护。

这个例子显然是微不足道的,但是希望你能从中推断并预想出如何重构你自己的代码。

在编码的时候,你应该有出于两种模式中的一种:增加新的特征或者重构代码。当在增加特征的时候,你要写测试和增加代码。在重构的时候,你要改变你原有的代码,并确保所有相关的测试依然能正确运行。 
关于重构的主要参考资料有Martin Fowler著作的《重构:改进原有代码的设计》(Refactoring:Improving the Design of Existing Code)。用一些精简点来总结Fowler的书,重构的步骤如下所示: 

定义需要重构的代码
有覆盖所有代码的测试
小步骤的工作
每步之后都运行你的测试。编码和测试都是相当重复的——和编译型语言相比,解释型语言,比如PHP是容易很多的。
使用重构来使你的代码有更好的可读性和可修改性。 

  • 共2页:
  • 上一页
  • 1
  • 2
  • 下一页

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/363970.htmlTechArticle请先阅读上一篇文章 重构 即使最有思想性且最熟练的程序员也不能预见一个软件项目中的任何细微之处。问题总是出乎意外的出现,需求...

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号