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

 更新时间:2012年04月09日 22:25:46   作者:  
承接上文的PHP 杂谈《重构-改善既有代码的设计》之 重新组织你的函数继续重构方面的内容
思维导图


介绍

 
 
这章主要针对数据的重构。
 
1、争论的声音——直接访问Field还是通过函数(Accessor)访问Field

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

 
 
 专业术语
 

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

dumb:哑

domain class:用以处理业务逻辑

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

business logic:业务逻辑

unidirectional:单向的

bidirectional:双向的

collection:群集

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

 

动机:

  “间接访问变量”:支持更灵活的数据获取方式,如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变成对象。
 

 

 
  动机:
 

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

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

 动机:

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

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

 动机:

面向对象的原则之一就是封装(Encapsulate)或者称为”数据隐藏“。按照此原测,你绝不应该把数据声明为public。
  ——public 数据被看成是一种不好的做法。
  ——如果封装了,代码的修改就会比较简单,因为都集中在一个地方。
 一个函数除了访问函数(getting/setting)外,不提供其他行为,它终究只是一个dumb class(哑类)。这类class不能获得对象技术的优势。——解决哑类的方法是Move Method轻快的将它们移到新对象去。
 
 conclusion
 
我希望能把我理解的东西与大家分享,欢迎大家提出宝贵意见。

相关文章

  • 一个PHP数组应该有多大的分析

    一个PHP数组应该有多大的分析

    PHP在数组处理上非常低效,尤其是内存占用较多,常常使得httpd进程消耗太多资源。
    2009-07-07
  • php运行时动态创建函数的方法

    php运行时动态创建函数的方法

    这篇文章主要介绍了php运行时动态创建函数的方法,涉及php流程语句与create_function函数的使用技巧,需要的朋友可以参考下
    2015-03-03
  • PHP简单计算两个时间差的方法示例

    PHP简单计算两个时间差的方法示例

    这篇文章主要介绍了PHP简单计算两个时间差的方法,结合具体实例形式分析了php日期与时间的转换及数学运算相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • PHP入门学习之字符串操作

    PHP入门学习之字符串操作

    这篇文章主要介绍了PHP入门学习之字符串操作,学习php的同学一定要看一下,都是入门必看的基础内容
    2021-04-04
  • PHP 5.3新特性命名空间规则解析及高级功能

    PHP 5.3新特性命名空间规则解析及高级功能

    本文介绍了PHP命名空间的一些术语,其解析规则,以及一些高级功能的应用,希望能够帮助读者在项目中真正使用命名空间。
    2010-03-03
  • PHP微信支付功能示例

    PHP微信支付功能示例

    这篇文章主要介绍了PHP微信支付功能,结合实例形式分析了php微信支付功能相关sdk与使用技巧,需要的朋友可以参考下
    2019-03-03
  • PHP也能干大事之PHP中的编码解码详解

    PHP也能干大事之PHP中的编码解码详解

    这篇文章主要介绍了PHP也能干大事之PHP中的编码解码详解,本文讲解了ASCII编解码、URL编解码、Base64编解码、HTML实体编解码、二进制、八进制、十进制、十六进制相互转换等内容,需要的朋友可以参考下
    2015-04-04
  • 详解json在php中的应用

    详解json在php中的应用

    在本篇文章中我们给大家分享了关于json在php中的应用的相关知识点,有需要的朋友们可以学习下。
    2018-09-09
  • php函数与传递参数实例分析

    php函数与传递参数实例分析

    这篇文章主要介绍了php函数与传递参数的方法,以实例形式分析了函数按值传递的具体用法,具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • php将fileterms函数返回的结果变成可读的形式

    php将fileterms函数返回的结果变成可读的形式

    php将fileterms函数返回的结果变成可读的形式,如: rwx--rx--x
    2011-04-04

最新评论