作者:honey爱一个人好难 | 来源:互联网 | 2023-09-01 11:30
很久以前,软件开发的世界还是一片浑浑噩噩,不管开发什么软件都面临着复杂性这个问题,代码里面到处是goto语句,程序的流程随意跳转。很多程序员写代码时,经常会遇到,越写到后面越不知道
在很久以前,软件开发的世界还是一团泥,无论开发什么软件都面临着复杂性的问题。 代码中充满了goto语句,程序流随意乱飞。 很多程序员写代码的时候,经常遇到。 越往后写,就越不知道自己在写什么。 就在这时,巨人出现了。 那就是“结构化编程”。
「结构化编程」基本思想有序控制进程,即将程序的执行顺序限制为顺序、分支、循环三种; 将共同的处理总结成例行程序(函数)。 「结构化编程」好处三大限制:三大限制意味着结构化编程只存在三种基本结构。 这三个基本结构分别是顺序结构、循环结构和分支结构。 这三种结构有共同的特点,只允许一个一个流动的出口和入口。 这样可以降低程序的自由度,减少各种组合,但不会使程序过于复杂。 另外,在降低程序复杂性的情况下,程序的实现能力没有降低。 例行程序(函数) :不需要知道“黑匣子化”这个进程内部的详细信息,只需要知道进程(函数)的名称。 # # PGC-card.PGC-card-href {文本修饰3360非}; outline :无; 显示:块; width :百分之百; height: 100%; # # PGC-card.PGC-card-href :移动器{文本修饰3360非}; (/)个人电脑样式(/.PGC-card )机箱大小调整:边框; height: 164px; 订单: 1px固态# e 8e8e 8; 位置:相对关系; 添加: 20px 94px 12px 180 px; 溢流:隐藏; PGC -卡:3360后{内容: ' '; 显示:块; 左: 1px固态# e 8e8e 8; height: 120px; 位置:绝对; right: 76px; top: 20px; PGC-cover {位置: absolute }; width: 162px; height: 162px; top: 0; left: 0; 后台大小:防护罩; PGC -内容{溢流:隐藏区}; 位置:相对关系; top: 50%; - WebKit -转换3360转换y (-50 %; 变换:变换y (-50 %; PGC -内容标题字体大小:18 px; 颜色: # 222; 线高度: 1; 字体:粗体; 溢流:隐藏; 文本溢出: Ellipsis; 空白: nowrap; PGC -内容桌面字体大小:14 px; 颜色: # 444; 溢流:隐藏; 文本溢出: Ellipsis; 顶级: 9px; 溢流:隐藏; 线高度: 1.2 em; 显示:-WebKit -在线盒; -webkit-line-clamp: 2; - WebKit-box-orient :垂直版; PGC -内容价格字体大小:22 px; 颜色: # f 85959; 顶级: 18px; 线高度: 1em; PGC -卡总线{ width : 75px }; 位置:绝对; right: 0; top: 50px; 颜色: # 406599; 字体大小: 14px; 文本对齐:中心; PGC-buy-text {填充-顶级:10 px; PGC
-icon-buy { height: 23px; width: 20px; display: inline-block; background: url(https://lf1-cdn-tos.bytescm.com/obj/cdn-static-resource/pgc/v2/pgc_tpl/static/image/commodity_buy_f2b4d1a.png); } 面向对象是怎样工作的 第2版(图灵出品) ¥57.8 购买
虽然结构化解决了程序控制流的复杂问题,但程序里面不仅包括控制结构,还包括要处理的数据。随着处理数据的增加,程序的复杂性也会上升。这时候,面向对象来了!
起初,“面向对象”只是是指在程序设计中采用封装、继承、多态等设计的方法。现在,面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,ObjectOriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及面向对象的编程实现(OOP,Object Oriented Programming)。
面向对象编程来自于“分别管理程序处理内容和处理数据对象所带来的复杂性”,可问题是,为了得到正确的结果,必须保持处理和数据的一致性,这在结构化编程中是非常困难的,解决这一问题的方案就是数据抽象技术。
数据抽象是数据和处理方法的结合,这便是最初“对象”一词的得来,面向对象编程也因此而得名。
然后,从抽象原则来说,多个相同事物出现时,应该组合在一起,即DRY原则(Don't Repeat Yourself),便又引出了类这一概念。
其中对象是用于计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。他可以是人们要进行研究的任何事物,不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态;对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。
类则是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
类可以看成一类对象的模板,对象可以看成该类的一个具体实例。打个比方:生产每辆汽车都要按照图纸,经过生产组装,最终加工而成。而同样的车型,原始的生产图纸是同一个。那么这张生产图纸就相当于类。而生产出的具体的每辆车就相当于对象。类有一个,根据类实例化的对象可以有多个。所以我们可以理解为类的实例化的结果就是对象,而对对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。
参考文献:面向对象(OOP)的进一步理解_low5252的博客-CSDN博客
类的三种功能
这里,我们将类的功能总结为汇总、隐藏和“创建很多个”。
汇总子程序和变量。隐藏只在类内部使用的变量和子程序。从一个类“创建很多个”实例。
类结构本身并不难,但它却能给编程带来很多积极的效果,可以说是种非常强大的结构。
类的功能一:汇总
类能汇总变量和子程序。这里所说的变量是指 C 和 COBOL 等语言中的全局变量。OOP中将由类汇总的子程序称为方法,将全局变量称为实例变量(又称为“属性”“字段”),之后我们会根据情况使用这些术语。
汇总的效果并不是减少整体构件的数量,举例来说一个家庭中所有成员的名字应该都不相同,但是和姓氏不同的邻居家的家庭成员重名则没有关系。
类的功能二:隐藏
我们借用《面向对象是怎样工作的》中的这张图来说明。
图中子程序和全局变量都汇总到了类中。但是在这种状态下,从类的外部仍然可以访问fileNO变量TextFileReader类的open,read和close方法会访问fileNO变量,但其他处理则无需访问因此最好限定为只有这三个方法能访问该变量。这样一来,当 fileNO变量中的值异常而导致程序运行错误时,我们只要调查这三个方法就可以了。另外,以后在需要将 fileNo变量的类型由int改为long等时,还可以缩小修改造成的影响范围。
类的功能三:创建很多个
类的这个功能总结起来就是八个字——“指定实例,调用方法”。
关于指定实例我们以动物为例,将狗作为类,将斑点狗和柴犬等具体的狗当作实例。不过实例并不是直接表示现实世界存在的事物结构,而是类定义的实际变量所持有的内存区域。另外定义了类就可以在运行时创建多个实例,也就是说能够确保多个内存区域。
关于调用方法:如果同时创建多个实例,那么在调用方法时就不知道到底哪个实例变量才是处理对象了,因此OOP的方法调用代码的写法稍微有点特殊。
在传统的子程序调用的情况下,只需简单地指定所调用的子程序的名称。而在OOP中,除了调用的方法名之外,还要指定对象实例。根据Java语法,应在存储实例的变量名后加上点,然后再写方法名,如下所示。
存储实例的变量名.方法名(参数)
基于这两点就可以指定哪个实例变量是处理对象。
根据“创建很多个”的结构,类中方法的逻辑就变得简单了。定义类的一端完全无须关心多个实例同时运行的情形。传统的编程语言中没有这种结构,所以要想实现同样的功能,就需要使用数组等结构来准备所需数量的变量区域,因此执行处理的子程序的逻辑也会变得很复杂。
一般来说,由于在应用程序中同时处理多个同类信息的情况很普遍,所以这种结构是非常强大的。文件,字符串,GUI中的按钮和文本框,业务应用程序中的顾客、订单和员工,以及通信控制程序中的电文和会话等,都会应用这样的结构,而OOP仅通过定义类就可以实现该结构,非常方便。(节选自《面向对象是怎样工作的》)
如今,面向对象已成为软件开发领域不可或缺的技术,这种现状会持续到什么时候呢?毕竟在软件领域,新技术时而出现、时而消失也是常有的事。
虽然应用面向对象的产品和技术就像雨后春笋一样不断涌现,但面向对象的根本内容在过去20多年基本上没有什么变化。编程语言的结构由967年的 Simula67 和20世纪70年代的Smalltalk确立,类库和框架等大规模软件构件群在20世纪80年代出现,设计式和作为UML前身的图形表示在20世纪90年代初出现。如今的面向对象只不过是对它们进行了提炼和普及而已。在今后10年,即使这些技术再进行扩展,其基本结构也不会发生较大改变。
所以,面向对象不会掀起一阵热潮后就凄凉收场,今后10年仍会继续占据主导地位。因此,对于面向对象的学习,对于软件开发领域的同学来说还是比较重要的。人邮君在这里向大家推荐这本《面向对象是怎样工作的》。
这本书被称为“计算机程序设计思想”图解趣味版,通俗易懂地介绍了面向对象的各种技术。相信通过阅读本书,大家应该可以从Java和Ruby等编程语言,以及使用UML的设计等面向对象的“表象”中探索到更加朴素的“本质”,对面向对象有新的理解。