多语言展示
当前在线:506今日阅读:23今日分享:25

面向对象编程思维的进化

面向对象编程思维的建立是成为软件工程师的必备能力,但是你真的理解面向对象么?我感觉,理解一个东西最好是从他的演化历史来理解,因为从他的历史的演化,我们可以很清晰的理解他为什么存在,他的好处是什么等等。。。
方法/步骤
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而设计存在的。。。

推荐信息