[读书笔记] 代码整洁之道(二):对象和数据结构
第四章注释和第五章格式在工作中不需要太过注意,因为经过深思熟虑的函数命名足以替代到处出现的注释块,同时强大的IDE保证了编码的格式,加上各自的变成习惯,尽量做到整洁美观就行。
第六章 对象和数据结构
- 数据抽象
平常我们写TO类的时候非常顺手的定义一些private类型的成员变量,然后各自定义他们的getXXX()和setXXX()方法。这样的写法体现了Java的封装性,虽然实现还是暴露了,外部类可以使用这些私有属性,但是我们可以在get和set方法中添加一些权限,来保证数据的安全性。而且有些框架是强制使用get和set方法来给对象赋值和取值(Hibernate)。
隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎抽象!类并不简单地用取值器和赋值器将其变量推向外间,而是暴露抽象接口,以便用户无需了解数据的实现就能操作数据本体。
  作者的观点是使用抽象形态表述数据,以最好的方式呈现某个对象包含的数据。
- 数据对象的反对称性
对象把数据隐藏于抽象之后,暴露操作数据的函数;数据结构暴露其数据,没有提供有意义的函数。
* **过程式的代码**可以很方便的添加函数,其他的形状类不会受影响,但是添加另一个形状类就需要修改函数来实现该新加类的操作。
class Square {
public Point topLeft;
public double side;
}
class Rectangle {
public Point topLeft;
public double height;
public double width;
}
class Circle {
public Point center;
public double radius;
}
class Geometry {
public final double PI = 3.141592653589793;
public double area(Object shape) throws NoSuchShapeException {
if (shape instanceof Square) {
Square s = (Square) shape;
return s.side * s.side;
} else if (shape instanceof Rectangle) {
Rectangle r = (Rectangle) shape;
return r.height * r.width;
} else if (shape instanceof Circle) {
Circle c = (Circle) shape;
return PI * c.radius * c.radius;
}
throw new NoSuchShapeException();
}
}
* **面向对象的代码**就会通过继承来实现多态,area()方法就是多态的。如果多一个新的形状类很简单,但是当添加一个函数的时候,所有的形状类都需要修改。
class Square implements Shape {
private Point topLeft;
private double side;
public double area() {
return side * side;
}
}
class Rectangle implements Shape {
private Point topLeft;
private double height;
private double width;
public double area() {
return height * width;
}
}
class Circle implements Shape {
private Point center;
private double radius;
public final double PI = 3.141592653589793;
public double area() {
return PI * radius * radius;
}
}
>过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类。
在实际工作中经常会遇到这种两难的情况,[设计模式——可以参考访问者模式](http://example.net/)(Coming out...)。<br>
-
迪米特法则
law of demeter, LKP最少知道原则:一个对象应当对其他对象又尽可能少的了解,不和陌生人说话。也即是方法不应该调用由任何函数返回对象的方法。
例子:类C的方法f只应该调用一下对象的方法:1) C 2) 由f创建的对象 3) 作为参数传递给f的对象 4) 由C的实体变量持有的对象. -
数据传送对象
最为精炼的数据结构是一个只有公共变量、没有函数的类。称之为DTO,经常用于数据库通信、解析套接字传递的消息之类场景。