王咏刚的贵作<<凌波微步>>是一本很难得的好书,比如看到系统设计篇中的"糟糕的面向对象的设计",作者采用实例的形式列举我们可能会犯得错误,最后给出的基于策略的解决方案,妙!
可是在第十章:属性还是方法中,似乎作者欲言又止,很不过瘾的感觉。。。而偶也是这几天刚好也在思考属性和方法的问题,献丑了。
先要统一概念:这里说的属性不是面向对象中的属性的概念。在OO里属性(在这里成为成员变量)是对于对象的静态方面的抽象,而方法是对象动态特性的抽象。借用王的定义:属性是用于定义与某些功能操作关系紧密的数据元素。也就是说这里的属性指的是介于成员变量和方法(或者函数)之间的事物。因而本文将在概念上存在三个词汇:成员变量、属性、方法。
本文在于和大家讨论以下的两个问题(也许更多需要您的智慧加盟)
1。属性和成员变量的区别?
个人理解:
属性如同上面所说的那样不属于面向对象的概念,而且在JAVA的眼里,在JAVA所推崇的JAVA BEAN规范里也希望我们能有更好的封装成员变量,而采用GET ./ SET的方法来访问和设置成员变量的值。而且在属性的实现上更多的是依靠成员变量 + GET / SET的表现形式,不过只是这里的GET / SET往往还要完成一部分的逻辑,比如校验、甚至在GUI这一层可以完成刷新组件的VIEW的任务!
可以这样来理解属性,属性 = 成员变量 + 方法,属性属于成员变量的子集,前提就是如果你的成员变量与一部分逻辑有关系的话。-所以这里也许就有了如何分辨成员变量和属性的方法学,先按照OO的思想,在抽象对象的静态特性和动态特性的基础上构建出对象的成员变量和方法,再在其上概括出对象"应该"有的属性。
2。属性存在的意义?
从上面的问题我们也许可以理解属性和成员变量的区别(如果我的描述不至于混淆你的概念的情况下),但同时我们发现了工作量的增加:那就是要在分析对象之后再次的概括属性!"有这个必要吗?难道非要属性不可?"
这样吧我们设想一下如果没有属性的概念,你的生活会改变吗?显然不会!如果我们按照某种规范(比如JAVA BEAN)来设计我们的对象,我们关注对象的静态、动态特性、分析对象的成员变量和方法,难道这不是很自然的吗?为什么非要让自己难受呢?
当然,那些被MS熏陶的人会反对这样的观点,在他们看来属性是如此的自然(因为有IDE的支持,改变组件的特性只需要改变某个属性的值)和亲切(可以在GET / SET中写一些判断的逻辑,甚至给你发个邮件等小功能),可是难道具备良好的规范(比如JAVA BEAN规范)设计出来的对象不可以完成这些任务吗?
总结:遵守编码规范比去探究或者实践属性编程更来的实在。