類中有數據無操作方法,這是典型結構化編程中的數據結構定義,在面向對象的世界里,類的定義一般會吧數據和操作數據的方法放在一起,這樣有著更好的內聚性和可理解性;
我們來看兩種典型的情況:
示例1
public class Square {
pubic Point topLeft;
public double side;
}
public class Circle {
public Point center;
public double radius;
}
public class Geometry {
public final double PI = 3.14
public double area(Object shape) throws NoSuchShapeException
{
if (shape instanceof Square) {
...
}else if( shape instance of Circle){
...
}
}
}
示例2
public class Square {
pubic Point topLeft;
public double side;
public area() {
...
}
}
public class Circle {
public Point center;
public double radius;
public area() {
...
}
}
面向對象的程序員肯定會對第一種做法嗤之以鼻。想想看,如果再添加一個新的形狀會怎么樣。是的你會對Geometry類進行修改,而且隨著增加的新形狀越多,這個類就會越來越龐大,它也不符合開放封閉原則。
想想看,如果給Geometry類添加一個primeter()函數會怎么樣,所有的形狀將不受影響。兩種定義的本質:他們是截然對立的。這說明了對象和數據結構的二分原理:
過程式代碼便于在不改動原有數據結構的前提下添加新的函數。面向對象代碼便于在不改動既有函數的前提下添加新類。
在一個輔助的系統中,都會有需要添加新的數據類型而不是新函數的時候,這個時候對象和面向對象比較適合。另一方面,也有會想要填寫新函數而不是數據類型的時候。這種情況下,過程式代碼和數據結構比較適合。