您的位置:首页 > 理论基础 > 数据结构算法

Java编码规范,让你的代码赏心悦目--对象和数据结构

2017-09-05 22:18 351 查看
  

数据,对象的反对称性
先来看一段过程式形状代码



此时给Geometry类添加一个primeter()函数,这些形状类根本不会因此而受影响。另一方面,如果添加一个新形状,就得修改Geometry中的所有函数来处理它

再来看一段多态式形状



在这里,area()方法是多态的。不需要有Geometry类。如果添加一个新形状,现有的函数一个也不会受到影响,而当添加新函数时所有的形状都得做修改。

这两种定义的本质是截然对立的。这说明了对象与数据结构之间的二分原理:
过程式代码便于在不改动既有数据结构的前提下添加新函数;
面向对象代码便于在不改动既有函数的前提下添加新类;

反过来,也可以说得通:
过程式代码难以添加新数据结构,因为必须修改所有函数;
面向对象代码难以添加新函数,因为必须修改所有类;

所以,对于面向对象较难的事,对于过程式代码却较容易,反之亦然!
在一个程序中,如果需要添加新数据类型而不是新函数的时候,对象和面向对象就比较合适。而想要添加新函数而不是数据类型的时候,过程式代码和数据结构更合适;

得墨忒耳律

这条定律认为:类C的方法f只应该调用以下对象的方法:
C;
由f创建的对象;
作为参数传递给f的对象;
由C的实体变量持有的对象;

方法不应调用由任何函数返回的对象的方法。换言之,只跟朋友谈话,不与陌生人谈话;



这类代码应该避免,编程如下的写法:



这些代码是否违反了得墨忒耳律取决于ctxt,opts,scratchDir是对象还是数据结构。如果是对象,则它们的内部结构应当隐藏而不暴露,而有关其内部细节的知识就明显违反了得墨忒耳律。

如果这些变量只是数据结构,没有任何行为,则它们自然会暴露其内部结构,得墨忒耳律也就无效了

所以,问题的关键是属性访问器函数造成的混乱。它们暴露了设置为私有的变量给外部。

这里存疑,属性访问器的存在就是在获取或者设置私有变量时,进行一道设置,或者说过滤。保证传递的参数的有效性。虽然在某种程度暴露了私有变量,但利大于弊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  重构