介绍
承接上文的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
我希望能把我理解的东西与大家分享,欢迎大家提出宝贵意见。
原文地址:http://www.cnblogs.com/baochuan/archive/2012/04/04/2430576.html

转载于:https://www.cnblogs.com/phpdragon/archive/2013/04/08/3006536.html

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

  1. 重构-改善既有代码的设计:重新组织数据的16种方法(六)

    重新组织数据: 1.Self Encapsulate Field 自封装字段 间接访问类的属性:你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙.为这个字段建立取值/设值函数,并且只以这些函数来 ...

  2. 重构-改善既有代码的设计:重新组织函数的九种方法(四)

    函数过长或者逻辑太混乱,重新组织和整理函数的代码,使之更合理进行封装. 1. Extract Method 提炼函数 提炼函数:(由复杂的函数提炼出独立的函数或者说大函数分解成由小函数组成) 你有一段 ...

  3. PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性

    思维导图 索引: Ø Move Method(搬移函数) Ø Move Field (搬移值域) Ø Extract Class (提炼类) Ø Inline Class (将类内联化,就是把当前的类 ...

  4. 重构—改善既有代码的设计

    概述 1.1 参考资料 <重构-改善既有代码的设计>读后总结 <重构改善既有代码的设计> 22种代码的坏味道,一句话概括 1.2 何谓重构 首先要说明的是:视上下文不同,重构的 ...

  5. 『重构--改善既有代码的设计』读书笔记----序

    作为C++的程序员,我从大学就开始不间断的看书,看到如今上班,也始终坚持每天多多少少阅读技术文章,书看的很多,但很难有一本书,能让我去反复的翻阅.但唯独『重构--改善既有代码的设计』这本书让我重复看了 ...

  6. 重构 改善既有代码的设计:代码的坏

    以下内容来自<<重构 改善既有代码的设计>> 一.什么是重构 所谓重构(Refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改以改进程序的内部结构 ...

  7. 《重构-改善既有代码的设计》-第1例:租赁影片(2)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接  重构-改善既有代码的设计-第1例:租赁影片(1) 2  运用多态取代与价格相关的条件逻辑 2 ...

  8. 《重构-改善既有代码的设计》-第1例:租赁影片(1)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 买了<重构 - 改善既有代码的设计 >一书,一直没有好好看,大致过了下也觉得只是有点点印 ...

  9. 实践提高《重构改善既有代码的设计第2版》PDF中文+PDF英文+对比分析

    重构是编程的基础,是在不改变外部行为的前提下,有条不紊地改善代码.编程爱好者都知道,Martin Fowler 的<重构:改善既有代码的设计>已经成为全球有经验的程序员手中的利器,既可用来 ...

最新文章

  1. java程序a-z b-y_有一行电文,以按下面规律译成密码: A---Z a---z B---Y b---Y C---X c---x …… 即第1个字母编程第26个字...
  2. exchange无法收发邮件_Python使用POP3和SMTP协议收发邮件!
  3. gets函数在使用上要注意什么问题
  4. SQl inner LOOP | HASH | MERGE join--指定Join的方法
  5. Linux 库函数与系统调用的关系与区别
  6. 文件管理器android实现,Android开发之简单文件管理器实现方法
  7. 【Linux】一步一步学Linux——shopt命令(214)
  8. mysql快速删除大表数据部分数据_mysql删除大表的部分数据
  9. 【排序算法时间复杂度分析】递推式
  10. Android学习路线指南
  11. 2017年下半年综合素质作文
  12. 全站最详细的Python numpy 搭建全连接神经网络模型教程(理论计算+代码实现)(不止能预测手写数字数据,准确率93.21%)
  13. 嵌入式Linux工程师发展前景 嵌入式工程师待遇怎样?
  14. 适合影院的点播系统——点量OTT点播
  15. 2018EOS全球超级节点引力峰会:共识的力量
  16. 牌照发布后的第20天,上海MWC,中国5G,GO!
  17. php behaviors,YII框架行为behaviors用法示例
  18. 爬虫下载淘宝html代码
  19. 圆桌对话:美女CTO是怎样炼成的?
  20. irfanview没法设置文件关联怎么办,jpg格式关联到IrfanView操作步骤

热门文章

  1. cmd如何刷新MySQL数据库_怎样在cmd中用命令操作MySQL数据库 需要技巧
  2. java mysql 语句解析器_几种基于Java的SQL解析工具的比较与调用
  3. Leetcode226. 翻转二叉树(递归、迭代、层序三种解法)
  4. 第十五章 Python和Web
  5. rstudio 修改代码间距_第一章 R和RStudio
  6. 串口接收中断配置过程---STM32F4--HAL
  7. sqlserver大数据表操作慢_架构师必看!操作日志系统搭建秘技
  8. 设计师必备的html工具
  9. PyCharm安装好vim后,怎么配置.vimrc
  10. Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)