数据抽象

隐藏实现不仅仅是在变量之间放置一层函数。隐藏实现是关于抽象的! 一个类不仅仅通过getter和setter将其变量推出去。相反,它公开抽象接口,允许用户操纵数据的本质,而无需知道其实现。

数据/对象反对称性

这两个示例展示了对象和数据结构之间的区别。对象在其数据背后隐藏抽象,并公开操作该数据的函数。数据结构公开其数据,并且没有有意义的函数。

过程式形状

  1. public class Square {
  2. public Point topLeft;
  3. public double side;
  4. }
  5. public class Rectangle {
  6. public Point topLeft;
  7. public double height;
  8. public double width;
  9. }
  10. public class Circle {
  11. public Point center;
  12. public double radius;
  13. }
  14. public class Geometry {
  15. public final double PI = 3.141592653589793;
  16. public double area(Object shape) throws NoSuchShapeException {
  17. if (shape instanceof Square) {
  18. Square s = (Square)shape;
  19. return s.side * s.side;
  20. }
  21. else if (shape instanceof Rectangle) {
  22. Rectangle r = (Rectangle)shape;
  23. return r.height * r.width;
  24. }
  25. else if (shape instanceof Circle) {
  26. Circle c = (Circle)shape;
  27. return PI * c.radius * c.radius;
  28. }
  29. throw new NoSuchShapeException();
  30. }
  31. }

多态形状

  1. public class Square implements Shape {
  2. private Point topLeft;
  3. private double side;
  4. public double area() {
  5. return side * side;
  6. }
  7. }
  8. public class Rectangle implements Shape {
  9. private Point topLeft;
  10. private double height;
  11. private double width;
  12. public double area() {
  13. return height * width;
  14. }
  15. }
  16. public class Circle implements Shape {
  17. private Point center;
  18. private double radius;
  19. public final double PI = 3.141592653589793;
  20. public double area() {
  21. return PI * radius * radius;
  22. }
  23. }

再次,我们看到了这两种定义的互补性质;它们几乎是对立的! 这暴露了对象和数据结构之间的根本二分法:

过程式代码(使用数据结构的代码)使添加新函数而不改变现有数据结构变得容易。另一方面,面向对象的代码使添加新类而不改变现有函数变得容易。

补充也是正确的:

过程式代码使添加新的数据结构变得困难,因为所有函数都必须改变。面向对象的代码使添加新函数变得困难,因为所有类都必须改变。

成熟的程序员知道,一切都是对象的想法是一个神话。有时你确实想要简单的数据结构,让过程在它们上操作。

迪米特法则

有一个著名的启发式法则叫做迪米特法则,它说一个模块不应该了解它操作的对象的内部结构。

更准确地说,迪米特法则表明,一个类 C 的方法 f 只应该调用以下对象的方法:

  • C
  • f 创建的对象
  • 作为参数传递给 f 的对象
  • C 的实例变量持有的对象

该方法不应该调用任何允许函数返回的对象上的方法。换句话说,与朋友交谈,而不是与陌生人交谈。

数据传输对象

数据结构的典型形式是一个具有公共变量和没有函数的类。这有时被称为数据传输对象,或DTO。DTOs是非常有用的结构,特别是与数据库通信或解析来自套接字的消息等时。它们经常成为一系列转换阶段中的第一个,这些阶段将数据库中的原始数据转换为应用程序代码中的对象。