思维导图
介绍
承接上文的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
状况:你有一个数组,数组中的元素各自代表不同的东西,那么以对象替换数组,对于数组中的每个元素,以一个值域表示之。
モチベーション:
配列は、類似したオブジェクトのグループによく使用されます。配列内の要素が異なる場合、配列内の最初の要素が人の名前であるという規則を理解するのが難しくなります。オブジェクトは異なりますが、そのような情報はドメイン名と関数名を通じて伝達できます。 ——こうすれば暗記したりコメントしたりする必要がありません。
フィールドをカプセル化する
状況: クラスにパブリック値フィールドがある場合は、それを pirvate として宣言し、対応するアクセス関数を提供します。
動機:
オブジェクト指向の原則の 1 つは、カプセル化 (Encapsulate) または「データ隠蔽」です。このオリジナルのテストによれば、データをパブリックとして宣言してはなりません。
——公開データは悪い習慣だと考えられています。
——カプセル化されていれば、一か所に集中しているので、コードの修正が比較的簡単になります。
関数は、アクセス関数 (取得/設定) 以外の他の動作を提供しません。結局のところ、それは単なる愚かなクラスです。このタイプのクラスでは、オブジェクト テクノロジの利点を得ることができません。 ——ダムクラスの解決策は、それらを新しいオブジェクトに素早く移動する Move メソッドです。
結論
私が理解していることを皆さんと共有し、貴重なご意見をお待ちしております。
http://www.bkjia.com/PHPjc/325369.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/325369.html技術記事マインド マップの導入は、上記の PHP チャット「リファクタリング - 既存のコードの設計の改善」に続き、関数を再編成してリファクタリングを継続します。 この章では主にデータの再構築に焦点を当てます。 ...