面向过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。
面向对象代码便于在不改动既有函数前提下添加新类。
过程式代码难以添加数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有类。
这两种定义的本质,他们是截然对立的,这说明了对象与数据结构之间的二分原理。
面向过程式代码范例:
Geometry类操作三个形状类。形状类都是简单的数据结构,没有任何行为,所有行为都在Geometry类中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
class Square{ Point topLeft; double side; } class Rectangle{ Point topLeft; double height; double width; } class Circle{ Point center; double radius; } public class Geometry { public final double PI = 3.14159265359; public double area(Object shape) throws NoSuchShapeExcept{ 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 NoSuchShapeExcept(); } } |
面向对象代码范例:
area方法是多态的。不需要有Geometry类,所以,如果添加一个新形状,现有的函数一个也不会受到影响,而当添加新函数时所有的形状都得做修改!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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.14159265359; public double area(){ return PI * radius * radius; } } |