设为首页 收藏本站
查看: 1128|回复: 0

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

[复制链接]

尚未签到

发表于 2015-8-24 13:28:54 | 显示全部楼层 |阅读模式
思维导图
DSC0000.png


介绍

承接上文的PHP 杂谈《重构-改善既有代码的设计》之 重新组织你的函数继续重构方面的内容。

这章主要针对数据的重构。

1、争论的声音——直接访问Field还是通过函数(Accessor)访问Field
DSC0001.png

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



专业术语
  accessor:访问者,存储器——在本文翻译为“函数”
  dumb:哑
  domain class:用以处理业务逻辑
  presentation class:用以处理”数据表现形式“
  business logic:业务逻辑
  unidirectional:单向的
  bidirectional:双向的
  collection:群集

Self Encapsulate Field

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

DSC0003.png

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

DSC0007.png

DSC0008.png



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

Replace Array with Object

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

DSC00010.png

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


Encapsulate Field

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

DSC00013.png


DSC00014.png
  动机:

DSC00015.jpg

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


conclusion

我希望能把我理解的东西与大家分享,欢迎大家提出宝贵意见。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103530-1-1.html 上篇帖子: php中utf-8编码下用正则表达式如何匹配汉字 下篇帖子: PHP采集类
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表