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 相关文章推荐
php的header和asp中的redirect比较
Oct 09 PHP
PHP 的几个配置文件函数
Dec 21 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
PHP中redis的用法深入解析
Feb 20 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
Sep 24 PHP
php文件缓存类汇总
Nov 21 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
php使用PDO操作MySQL数据库实例
Dec 30 PHP
PHP中list()函数用法实例简析
Jan 08 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 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
深入php self与$this的详解
2013/06/08 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
javaScript实现滚动新闻的方法
2015/07/30 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
react路由配置方式详解
2017/08/07 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
Python ellipsis 的用法详解
2020/11/20 Python
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
酒店员工职业生涯规划
2014/02/25 职场文书
秋冬农业生产标语
2014/10/09 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
导游词之天津盘山
2019/11/01 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server
Python使用pyecharts控件绘制图表
2022/06/05 Python