面向对象编程思维的进化

2025-10-15 12:04:42

1、1.为了重用 而发明了函数

首先你要知道:一个main方法就可以实现世界上所有的程序,但是其存在着固有的缺陷

eg:

double x1 = 1,y1=1;

double x2 = 2,y2=2;

double = ....(略1)此处是一个很复杂的求两点之间距离的算法;

printf(“%lf\n”,d);

以上就是求出(x1,y1)和(x2,y2)两点之间的距离,如果求(x3,y3)和(x4,y4)两点之间的距离呢?则仍要编写一次(略1)之处的代码,那么如果是(x1,y1)和(x4,y4)之间呢,当然你还是要写一次,要知道:

(1)重写三遍,意味着出错的概率要增加三遍,

(2)而且也太麻烦了,main函数中N个地方需要,则你要写N遍,好吧,如果是粘贴复制的话,那也很麻烦。

(3)而且万一哪天你要重新更改算法,你的麻烦来了,每一处都要修改,

    因此函数被设计了出来,为的就是代码的重用以及一改全改,比如上面,你就可以设计一个开平方的函数:以后求两点之间的距离,只要传入参数,获得的返回值就是函数的处理结果比如:  double d = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

复杂的开平方算法就被封装到了sqrt函数之中。好吧,函数似乎诞生了:

但是需要注意的是:

(1)注意一点,设计一个函数的功能,远远比实现一个函数要有价值的多,这是码农和工程师之间的区别

(2)函数的设计,一定要遵循函数功能单一的原则,一个函数只干一件事。哪天,你如果你设计了一个:一个函数就可以实现让飞船去月球的复杂函数,我会很开心,因为我会再让你设计飞船去火星的程序,那你就惨了,似乎函数几乎还要再写一遍,重用性太差了,而我则偷偷看你笑话。。。。而另一个家伙设计的函数只能算出两个参数之和并返回,我会和开心的请他喝茶。。。

(3)总有些算法是我们所不能写出来的,不过安心,因为函数的存在,很多大牛已经帮我们实现了函数,你需要做的就是使用它们,比如:sqrt这个开平方函数

(4)在看一个程序时:顺着往下看时,遇到一个函数,请你不要关心他是怎么实现的,你只要知道,他能干什么就行,不要深入研究。。。等你将这个程序的流程搞清楚了,熟练的明白这个程序是怎么运转的了,再回过头研究函数的实现,于是这样就出现了函数的分层现象

2、2:抽象的数据类型

我设计了一个很难看的函数:

double distance(double x1,double y1,double x2,double y2) {

       return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

}

之所以我说他难看,是因为double x1,double y1,double x2,double y2这四个参数,实际上仅仅描述了两个点的信息,及(x1,y1)和(x2,y2)这两个点,真是讨厌,明明x1和y1是一个点的信息,却写成了两个参数,不合理呀

所以出现了抽象数据类型:

typedef struct point {

    double x ;

    double y ;   

} Point ;

这是C语言的抽象类型,这样省事好多了

Point p1 = {2.0,2.0};

Point p2 = {1.0,1.0};

这样就可以用p1和p2代表两个点。。。

当然啦,java类似的是

public class Point {

double x;

double y;

3、3.面向对象是抽象的数据类型的进化呀。。。

public class Point {

     double x;

     double y;

     public Point(double x,double y) {

          this.x = x;

          this.y = y;

     }

有了抽象类型之后,一个点的信息可以这样表示

Point  p1= new Point(1.0 , 1.0);

很方便吧,p1就是原来double x1,double y1两个参数所代表的信息,可是麻烦又来了,如何求两点之间的距离呢?

比如p1到原点之间的距离。。。。。。求两点之间的距离函数是对p1所指向的(1.0,1.0)这个点与原点(0.0,0.0)这两个点之间的距离运算。。。。函数所要操作的是p1 所封装的数据x和y 与原点之间的距离,是专门为p1所封装的x和y而存在的。。。那么这样,干脆把函数也封装到这个抽象类型里面吧,这样又方便了好多

public class Point {

    double x;

    double y;

    public Point(double x,double y) {

        this.x = x;

        this.y = y;

    }    public double distance() {

        return Math.sqrt(x*x+y*y);

    }

这样Point  p1= new Point(1.0 , 1.0);

只要p1.distance()就可以调用封装的函数。。。返回值就是函数的返回值。

所以喽,一个点被设计成一个类型,他所封装的信息是x和y。。。另外这个类型封装的函数是为了操作x和y而设计存在的。。。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢