6.2 数据、对象的反对称性
对象把数据隐藏于抽象之后,暴露操作数据的函数。数据结构暴露其数据,没有提供有意义的函数。
对象与数据结构之间的二分原理:
过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类。
反过来讲也说得通:
过程式代码难以添加新数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有的类。
所以,对于面向对象较难的事,对于过程式代码却较容易,反之亦然!
在任何一个复杂系统中,都会有需要添加新数据类型而不是新函数的时候。这时,对象和面向对象就比较适合。另一方面,也会有想要添加新函数而不是数据类型的时候。在这种情况下,过程式代码和数据结构更合适。
6.3 得墨忒耳定律
模块不应了解它所操作对象的内部情形。类C的方法f只应该调用以下对象的方法:
C
由f创建的对象
作为参数传递给f的对象
由C的实体变量持有的对象
方法不应调用由任何函数返回的对象的方法:
final String outputDir = ctxy.getOptions().getScatchDir().getAbsolutePath();
注:要避免这样的代码,可能需要对调用初衷进行包装。
final String outputDir = ctxy.getOptions().getScatchDir().getAbsolutePath();
String outFile = outputDir + ”/” + className.replace(‘.’, ’/’) + ”.class”;
FileOutputStream fout = new FileOutputStream(outFile);
BufferedOutputStream bos = new BufferedOutputStream(fout);
→ctxy.createScatchFileStream(classFileName);