PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据


Posted in PHP onApril 09, 2012

思维导图

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
介绍

 
 承接上文的PHP 杂谈《重构-改善既有代码的设计》之 重新组织你的函数继续重构方面的内容。
 
这章主要针对数据的重构。
 
1、争论的声音——直接访问Field还是通过函数(Accessor)访问Field

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

 2.修改Array为Object:当你看到一个Array很像一个数据结构,你可以使用Replace Array with Object,把Array变成一个对象。——数据结构更清晰。

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

 
 
 专业术语
 

accessor:访问者,存储器——在本文翻译为“函数”

dumb:哑

domain class:用以处理业务逻辑

presentation class:用以处理”数据表现形式“

business logic:业务逻辑

unidirectional:单向的

bidirectional:双向的

collection:群集

 Self Encapsulate Field
 
状况:如果Client直接访问值域,会造成Client与值域之间的耦合关系逐渐变得笨拙,那么为这个值域建立取值/设置函数,并且只以这些函数来访问。
 

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

 

动机:

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

“间接访问变量”:支持更灵活的数据获取方式,如lazy Initialization(意思是只有用到值时,才对它进行初始化。)

“直接访问变量”:代码比较容易阅读,不需要停下来说:“啊,这只是个取值函数”。

       选择:1、代码规范,按照团队中大多数人的做法去做。

 2、个人比较喜欢“直接访问变量”,直到这种方式带来麻烦为止。

 martin(作者)的例子:你想获取superclass中的field,却又想在subclass中将该field改为计算后的值,这就最该使用Self Encapsulate Field。

                         我自己的例子:我一般会把field设置成private,如果外部变量,需要用到此field的时候,我就会用Self Encapsulate Field。或者field的值有变化的时候,用Self Encapsulate Field。


 Replace Data Value with Object
 
 状况:如果你的某个基本类型的field,需要额外的数据和行为,那么将此field变成对象。
 

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

 PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

 
  动机:
 

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

开发初期,我们也许会使用基本数据类型表示简单的行为。例如:你可能会用一个字符串表示电话号码,但是随后可能会出现电话号码的“格式化“,”验证“,”抽取区号“之类的特殊行为。——这时候我们就需要一个新类。

 
 Replace Array with Object
 
状况:你有一个数组,数组中的元素各自代表不同的东西,那么以对象替换数组,对于数组中的每个元素,以一个值域表示之。
 

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

 动机:

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

数组常用于一组相似对象。如果数组中的元素不同,很难明白数组中的第一个元素是人名这样的约定。对象就不同了,可以通过值域名称和函数名称传达这样的信息。——这样无须死记,无须注释。

 Encapsulate Field
 
状况:如果你的class中有一个public值域,那么将它声明为pirvate,并提供相应的访问函数。

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

 动机:

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

面向对象的原则之一就是封装(Encapsulate)或者称为”数据隐藏“。按照此原测,你绝不应该把数据声明为public。

——public 数据被看成是一种不好的做法。

——如果封装了,代码的修改就会比较简单,因为都集中在一个地方。

 一个函数除了访问函数(getting/setting)外,不提供其他行为,它终究只是一个dumb class(哑类)。这类class不能获得对象技术的优势。——解决哑类的方法是Move Method轻快的将它们移到新对象去。
 
 conclusion
 
我希望能把我理解的东西与大家分享,欢迎大家提出宝贵意见。
PHP 相关文章推荐
用session做客户验证时的注意事项
Oct 09 PHP
PHP开发中四种查询返回结果分析
Jan 02 PHP
基于php上传图片重命名的6种解决方法的详细介绍
Apr 28 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
PHP调用wsdl文件类型的接口代码分享
Nov 19 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
学习php开源项目的源码指南
Dec 21 PHP
php构造函数与析构函数
Apr 23 PHP
[原创]php使用curl判断网页404(不存在)的方法
Jun 23 PHP
php获取flash尺寸详细数据的方法
Nov 12 PHP
php使用crypt()函数进行加密
Jun 08 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 #PHP
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 #PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 #PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
Apr 09 #PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 #PHP
PHP文件注释标记及规范小结
Apr 01 #PHP
用PHP读取超大文件的实例代码
Apr 01 #PHP
You might like
phpmyadmin的#1251问题
2006/11/25 PHP
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
基于PHP生成静态页的实现方法
2013/05/10 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
python登录QQ邮箱发信的实现代码
2013/02/10 Python
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
Python抓取框架Scrapy爬虫入门:页面提取
2017/12/01 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
win10安装python3.6的常见问题
2020/07/01 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
幼儿师范毕业生自荐信
2013/11/09 职场文书
艺术应用与设计个人的自我评价
2013/11/23 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
植树节口号
2014/06/21 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
建设办主任四风问题整改思路和措施
2014/09/20 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
音乐研修感悟
2015/11/18 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
Python列表的索引与切片
2022/04/07 Python