虽然说C是面向过程的语言,C++,java,C#是面向对象的语言,但是真正是面向过程还是面向对象,并不是根据使用什么语言,而是根据怎么写代码。
说再多也没用,直接上代码,一看就懂的那种:
(这里使用java语言作为例子)
面向过程的代码:
- 优点:
若需要添加新方法,例如计算周长的方法,不需要改变原有代码,只需要新添代码。 - 缺点:
若需要添加新的图形结构,在添加新代码的同时,还需要修改原有的代码,例如Geometry类中的所有函数。 - 特点:数据结构和方法分离。
// 正方形
public class Square
{
public Point topLeft;
public double side;
}
// 长方形
public class Rectangle
{
public Point topLeft;
public double height;
public double width;
}
//圆形
public class Circle
{
public Point topLeft;
public double radius;
}
//几何工具包
public class Geometry
{
public 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.width*r.height;
}
else if(shape instanceof Circle)
{
Circle c = (Circle)shape;
return PI*c.radius*c.radius;
}
throw new NoSuchShapeException();
}
}
面向对象的代码:
- 优点:
若需要添加新的图形,则不需要修改老代码,非常方便。 - 缺点:
若需要添加新的方法,则需要将所有图形类修改一遍,有些麻烦,但是比面向过程中添加数据结构要好一点。 - 特点:数据结构被隐藏,仅仅展示对象的相应方法。
public class Square implements Shape
{
private Point topLeft;
private double side;
public double area() { return side*side; }
}
public class Rectangle implements Shape
{
private Point topLeft;
private double height;
private double width;
public double area() { return height*width; }
}
public class Circle implements Shape
{
private Point topLeft;
private double radius;
public double PI = 3.1415926;
public double area(){ return PI*radius*radius; }
}
注意
平常写代码的时候千万不要把数据结构的类和作为对象的类杂糅成一个类(它既可以作为数据结构被方法操作,也拥有属于自己的各种计算方法),不然代码会非常的混乱,可维护性差且难以读懂。