编辑整理:整理来源:爱奇艺,浏览量:71,时间:2022-10-25 12:35:01
多视角,多视角有哪些视角,多视角的好处
效率最高,对机器最友好的自然是机器语言程序(按机器指令集直接编写机器可以识别的二进制代码序列)。对机器友好,对人却不是很友好,难写,难读,难维护。就如同象形文字一样,虽然够形象,但不够抽象,不方便表达和交流。
所以,机器语言需要抽象,用一些英文词或字母组合缩写来表示机器指令,做成一个手册来描述机器或CPU,程序员按这些字母组合来写程序,然后替换一下,这样似乎可行,而查找替换正是计算机所擅长的,另写一个这样的查找替换的翻译程序即可,其实这就是汇编语言,翻译程序就是汇编器。
人的欲望是没有止境的,我们希望写程序更快捷,更易读,更易维护,更接近人类语言,那就来更高一层的抽象吧,将一些复用场景较高的代码块规范化为一个英文词,由汇编的一对一的关系转变为一对多的关系,一些操作直接用运算符来代替,流程跳转用goto代替,后来甚至发现,只用三种流程结构(顺序、选择、循环)和 和任意数量的布尔型标志就能表示任何功能或算法,这就是结构化编程语言。结构化编程语言也叫面向过程编程语言,用数据描述问题,对函数描述解决问题的步骤,将关联性较高的数据和函数放到同一文件中,通过文件来区隔接口和模块。
当面对成百上千、成千上万的函数时?是不是有心乱如麻的感觉?一种常用的方法就是分类,自然又会是更高一层的抽象,使用更大一点颗粒,如果组装产品,组件越大,组件的接口越友好,组装更便捷(需要注意的是,有些产品是不适合组装的)。这种更高抽象,更大颗粒的编程思想就是面向对象(OOP, Object Oriented Programming )。
在面向对象编程中,抽象的核心是数据,操作这些数据的成员函数是辅助, 以数据为中心,由 成员 函数提供接口,以消息进行联系。相对而言, 面向过程抽象的核心是处理数据的过程。
面向过程也只是一种抽象方式而已。
面向对象编程的主要思想非常简单:尝试将一个功能强大的程序整体分解为功能同样强大的多个部分。这样就可以将一些数据和那些只在相关数据上使用的函数耦合起来。
注意,这仅涵盖封装的概念。也就是说,位于对象内部的数据和函数对于外部是不可见的。我们只能通过消息(通常通过 getter 和 setter 函数)与对象的内容进行交互。
继承性和多态性并没有包含在最初的设计想法中,但是对于现在的面向对象编程而言是必需的。继承基本上意味着开发者可以定义具有其父类所有属性的子类。直到 1976 年,即面向对象的程序设计的概念问世十年之后,继承性才被引入。
又过了十年,多态性才进入面向对象的编程。简单来讲,这意味着某种方法或对象可以用做其他方法或对象的模板。从某种意义上说,多态性是继承性的泛化,因为并不是原始方法或对象的所有属性都需要传输到新实体。相反,你还可以选择重写一些属性。
多态性的特殊之处在于,即使两个实体在源代码中互相依赖,被调用实体的工作方式也更像插件。这使得开发人员的工作变得轻松,因为他们不必担心运行时的依赖关系。
值得一提的是,继承性和多态性并不是面向对象编程所特有的。真正的区别在于封装数据及其包含的方法。在计算资源比今天稀缺得多的时代,这是一个天才的想法。
结构化编程,面向对象编程、函数式编程)这三个编程范式分别限制了goto语句、函数指针和赋值语句的使用。
结构化编程是对程序控制权的直接转移的限制。
面向对象编程是对程序控制权的间接转移的限制。
函数式编程是对程序中赋值操作的限制。
这三个编程范式都对程序员提出了新的限制。每个范式都约束了某种编写代码的方式,没有一个编程范式是在增加新的能力。
也就是说,我们过去50年学到的东西主要是:什么不应该做。
应当说,面向对象和函数式不冲突。但还是很多人觉得用函数式就等于要丢下面向对象。
但只有小孩子才做选择,单一范式总是存在缺陷的。
最初的时候,代码都很短小精干,几十上百行而已,一行一行的语句写下去就OK了;
随着需求的增加,慢慢地,代码量开始加大,出现了成千上万行的代码。这时候,代码的组织管理就出现了问题。怎么办?引入函数。上万行代码被组织成了百十来个函数,是不是好管理多了?就像上万名士兵,按师团连排组织起来一样。
然而,软件工程的规模进一步扩大,导致一个项目出现了成千上万个函数!这时候怎么办?我们是不是又只能“分门别类”地把这些函数组织起来?于是出现了类,继而出现对象和面向对象……
一开始学习的时候,你不要去管什么“重用”“耦合”、“可扩展”、“封装变化”……等等这些东西,首先理解:不得已!
使用函数,使用类是我们不得已而为之的事情啊!
不能理解“不得已”,是不能理解“面向对象”的关键。
我们很多课程书籍,一介绍面向对象,就开始介绍面向对象的优势,吧啦吧啦,这其实是一个……一个什么呢?不能说这样做错了,但是,会增加入门者理解面向对象的难度。
更进一步,不能理解“不得已”,也会阻碍理解“设计模式”:
理解面向对象,一定要首先理解:面向对象解决的是“代码组织”的问题。不是代码实现。
在 历史 上OOP最辉煌的时刻之一,应该是MFC。
虽然MFC现在看起来十分简陋和难用,但是这套复杂系统从出现到普及,到解决很多实际问题、提供了各种扩展方案。这个庞大而复杂的系统成功解决了windows这种基于GUI的软件的开发,完成了当时的 历史 使命。
OOP的普及和程序界面图形化的大潮是密不可分的,GUI恰恰是OOP最擅长的领域之一。甚至到了今天,在某些纯C语言编写的 游戏 引擎中,一旦到了UI部分,还是要在C语言里使用OO的写法和思路。在设计控件时使用继承真的是再合适不过了。
在 游戏 引擎中,都没有也不可能脱离OOP,或多或少。因为模拟世界中的各种物体,这件事也是OOP所擅长的。但是现在很多人在编写具体逻辑时,确实喜欢避免继承,这和纯粹的OOP思路不太一样。简单来说,引擎提供的组件本身是用到了继承的,但是进一步编写 游戏 逻辑时又要避免深一步的继承。
-End-
纪录片多视角是指针对某人某事某物的纪实,要从不同的背景,不同的时间,不同的角度等方面去分析了解,才能得到真实正解的解译。