首页 > 编程知识 正文

面向过程和面向对象是什么意思,理解面向对象编程思想

时间:2023-05-04 13:32:55 阅读:116563 作者:2304

自从开始学习编程以来,这三个词就依次和开发语言一起出现在我的世界里,并在步步为营做着奇怪的事情,但一直缺乏对三者深入思考和理解的过程,知道的都是来自各知识获取渠道的观念,还没有形成自己的认知直到美国boss问我,区别是什么之前,我突然很无知,提出那些已知的概念,告诉美国boss,看到眼睛的瞬间我就知道了。 经过这段时间我想,不知道有没有正确的理解,写下自己的认知吧。 这样,万一觉悟打开了,也能知道哪里错了。 如果发现了什么样的理解偏差,请告诉我。

面向过程(PO )面向过程与VB一起来到我的世界,那时能做的非常有限,如果能写程序,我会觉得自己非常棒。 VB创建其可视化接口,在工具栏上画框并将其放在面板上,为每个事件编写完整的逻辑。 如果不知道任何软件包、抽象和继承,可以列举实现流程所需的逻辑。 是面向过程的分析步骤。 这样太抽象了,举个例子,洗衣机的洗涤。

1、打开洗衣机2,放衣服3,放洗衣液4,关洗衣机分流程,完成这件事,不在乎做什么流程,是谁做的。 这样行吗,首先没问题,有什么问题吗? 在洗涤流程中加入柔软剂的话,这个洗涤流程有变更的风险。 也就是说,维护性低、难以扩展、难以再利用。

简单来说面向过程,自顶向下,逐步细化!面向过程,就是按照我们分析好了的步骤,按部就班的依次执行就行了!所以当我们用面向过程的思想去编程或解决问题时,首先一定要把详细的实现过程弄清楚。一旦过程设计清楚,代码的实现简直轻而易举。

面向对象(OOP )面向对象伴随着. Net和Java来到了我的世界。 此时,我知道过程导向存在一些问题。 还学习了设计模式,知道了编程的七项原则。

1、单一职责,2、开关原则,3、回风交替,4、倒置,5、界面隔离,6、朴素季节规律,7、合成多重

我们也知道面向对象的三个特征:封装、继承和多态性。

你知道什么是对方吗? 在现实世界中,任何操作和商业逻辑的实现都需要实体。 也就是说,实体是动作的主宰,没有实体,就一定不会发生动作。 其实与程序世界相对应,实体是对象,对象由属性和方法构成。 例如,人的属性是身高、体重等特征内容,方法是指能做什么。 面向对象视为问题由对象的属性和对象进行的行为构成。 基于对象概念,以类为对象的模板、类和继承为结构机制,围绕对象考虑问题进行解决。

有了这些理论,我们该如何解决面向过程存在的问题呢? 继上例之后,洗衣机的洗涤,主要涉及两个对象,洗衣机。 打开洗衣机,关闭洗衣机的方法有两种。 人有三种方法。 把衣服放进去,把洗衣液放进去。 使用面向对象的编程方式

1、洗衣机。 打开洗衣机2、人。 放下衣服3、人。 放洗衣液4、洗衣机。 关闭洗衣机会在编程上有所区别。 对象将成为方法的执行者,每个进程的执行都需要对象(代码中的类)。 这样的好处是,在刚才的面对面过程中,想加入柔软整理剂的过程非常简单。 在人这个对象中添加方法就可以了。 也就是说,虽然经常被称为高结合低凝聚,但也会成为更柔弱的美人,扩展开来,复用也变得容易。

所谓的面向对象,就是在编程的时候尽可能的去模拟真实的现实世界,按照现实世界中的逻辑去处理一个问题,分析问题中参与其中的有哪些实体,这些实体应该有什么属性和方法,我们如何通过调用这些实体的属性和方法去解决问题。

函数式编程(FP )函数式编程是Java的lambda表达式进入我的世界,深入到GO语言中。 我只知道在Java中使用lambda表达式可以简化代码编写过程,但我还不明白它后面的含义。 另外,我还记得使用lambda有一个限制,就是变量赋值一次就不可变了。 最明显的是,必须这样写才能编译。 下面,通过函数编程的概念来认识它

1、函数式编程的显著特征-不可变|无副作用|引用透明

在函数式编程中,一个变量赋值后就不能更改。 没有可变的变量意味着没有状态。 中间状态是软件管理困难的重要原因之一,尤其是在并发状态下,由于一点疏忽,中间状态的存在容易引起问题。 如果没有中间状态,就可以避免这种问题。 没有中间状态意味着更抽象地说没有副作用。 一个函数只是接受一些准入,进行计算并给出结果,除此之外对软件没有任何影响,这就是说没有副作用。 因为没有中间状态,一个函数的输出仅取决于输入,如果输入匹配,则输出必然匹配。 这也被称为引用透明

2、函数式编程的目标 - 模块化

结构化编程和非结构化编程的区别,从表面上看,一个很大的区别是结构化编程中不再有“goto”语句。 但是更深的层次是结构化编程使模块化成为可能。 存在goto语句这样的能力可以提供一定的便利,但打破了模块之间的边界,不容易实现模块化。 模块化有很多优点,首先模块内部是更小的单个逻辑,易于编程,其次模块化是最后一个有利于复用的模块化,使每个模块的测试也更容易。 模块化是软件成功的关键,模块化的本质是分解问题,对细分子问题编程解决,将小解决方案一一整合解决完整问题。 这里需要一个个整合小模块的机制。 函数型编程有利于小模型

块的整合,有利于模块化编程。

3、将函数整合起来 - 高阶函数(Higher-order Functions)

     高阶函数的定义。满足以下其中一个条件即可称为高阶函数:

 接受一个或者多个函数作为其入参(takes one or more functions as arguments) 返回值是一个函数 (returns a function as its result)

假如我们需要计算出学校中所有女生的成绩,和所有女老师的年龄。传统的编程方式我们是这样做的:

//用函数式编程的方式求解,可以这样做://求所有女生的成绩List<Integer> grades = students.stream().filter(s -> s.sex.equals("femail")).map(s -> {return s.grade}).collect(Collectors.toList());//求所有女老师的年龄List<Integer> ages = teachers.stream().filter(t -> t.sex.equals("femail")).map(t -> {return t.age}).collect(Collectors.toList());

例子中使用的是比较著名的高阶函数,map, filter,此外常听到的还有reduce。这些高阶函数将循环给抽象了。map,filter里面可以传入不同的函数,操作不同的数据类型。但高阶函数本身并不局限于map,reduce,filter,满足上述定义的都可以成为高阶函数。高阶函数像骨架一样支起程序的整体结构,具体的实现则由作为参数传入的具体函数来实现。因此,我们看到高阶函数提供了一种能力,可以将普通函数(功能模块)整合起来,使得任一普通函数都能被灵活的替换和复用。

4、惰性计算

        除了高阶函数和仿函数(或闭包)的概念,还引入了惰性计算的概念。在惰性计算中,表达式不是在绑定到变量时立即计算,而是在求值程序需要产生表达式的值时进行计算。延迟的计算使您可以编写可能潜在地生成无穷输出的函数。因为不会计算多于程序的其余部分所需要的值,所以不需要担心由无穷计算所导致的 out-of-memory 错误。一个惰性计算的例子是生成无穷 Fibonacci 列表的函数,但是对第n个Fibonacci 数的计算相当于只是从可能的无穷列表中提取一项。

在函数式编程中函数是"第一等公民",所谓"第一等公民"(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

举例来说,下面代码中的print变量就是一个函数,可以作为另一个函数的参数。

var print = function(i){ console.log(i);};[1,2,3].forEach(print);

看待函数式编程,如果只看到一些具体的特性,像map,reduce,缓求值等等,就会觉得不过如此,甚至觉得不过是把一些常用的逻辑整理了一下而已,那就错过了函数式编程的精彩。我们需要从函数式编程的思想基石--基于函数构建软件,以及函数式编程对于模块化的益处,我们就能看到函数式编程思想的魅力。

函数式编程,大量使用函数,减少代码重复,提升开发效率;接近自然语言,易于理解;因为不依赖外界状态,只要给定输入参数,结果必定相同,方便代码管理;因为不存在修改变量,天生更易于并发,也能理解,GO语言默认是传值的。

三者的理解

面向过程

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
不足:不柔弱的美女、不易复用、不易扩展

面向对象

优点:柔弱的美女、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:因为需要创建大量的类,性能不高,不适合对性能要求很苛刻的地方。

函数式编程

优点:变量不可变,引用透明,天生适合并发。表达方式更加符合人类日常生活中的语法,代码可读性更强。实现同样的功能函数式编程所需要的代码比面向对象编程要少很多,代码更加简洁明晰。函数式编程广泛运用于科学研究中,因为在科研中对于代码的工程化要求比较低,写起来更加简单,所以使用函数式编程开发的速度比用面向对象要高很多,如果是对开发速度要求较高但是对运行资源要求较低同时对速度要求较低的场景下使用函数式会更加高效。

缺点:由于所有的数据都是不可变的,所以所有的变量在程序运行期间都是一直存在的,非常占用运行资源。同时由于函数式的先天性设计导致性能一直不够。虽然现代的函数式编程语言使用了很多技巧比如惰性计算等来优化运行速度,但是始终无法与面向对象的程序相比,当然面向对象程序的速度也不够快。函数式编程虽然已经诞生了很多年,但是至今为止在工程上想要大规模使用函数式编程仍然有很多待解决的问题,尤其是对于规模比较大的工程而言。如果对函数式编程的理解不够深刻就会导致跟面相对象一样晦涩难懂的局面。

总结

       函数式编程和面向对象编程各有利弊,一个语法更加自由,一个健壮性更好。作为程序员应该对两种编程方式都有所了解,不管是哪种方式,只要能够很好的解决当前的问题就是正确的方式,毕竟对于软件工程来说解决问题是最主要的,用的工具反而没有那么重要,就像对程序员来说语言不重要,重要的是解决问题的思想。

        现在这两者的发展趋势是相互借鉴的,许多以面向对象作为基础的语言例如Java等都在新的版本中添加了对函数式编程的支持,而函数式编程则借鉴了一些在面向对象语言里用的一些编译技巧使得程序运行更快。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。