工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(上)

简介: 工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(上)

你好,我是 yes。

面向对象编程想必大家都耳熟能详,但是写了这么多代码你对面向对象有清晰的认识吗?

来看看这几个问题:


  • 到底什么是面向对象编程?
  • 和面向过程编程有什么区别?
  • 什么又称为面向对象语言、面向过程语言?
  • 用面向对象语言写的代码就面向对象了?
  • 面向对象编程真的就这么好吗?
  • 复杂的业务用面向对象编程就合适了吗?


我还真没具体地定义过到底什么是面向对象编程。

所以假设有人问到底什么是面向对象编程?有什么好处?

一时还真不知道怎么说,或者说成体系的解释。

这篇文章我就谈谈我的理解,也试着看能不能说清啥叫面向对象编程。


正文


从二进制命令到汇编语言。

从汇编语言到面向过程语言再到面向对象语言。


计算机语言的发展是为了便于人类的使用,使其更符合人类的思考方式。

计算机的思路就是取指执行,一条直道走到底,它可不会管你什么抽象,不管什么业务建模,通通得给它变成一条条指令,排好顺序让它执行。


而我们人类不一样,我们的思维在简单场景来看是一条道,但在复杂场景就需要做各种分类,才能理清楚关系,处理好事务。


就像法庭,分为法官、书记员、法警、原告、被告、证人等角色。

这么多人分好类,按照法庭审理各司其职,一个案子才能高效、顺利得审判。

再回到计算机语言来,汇编我就不说了,面向过程其实就是一条道的思路,因为起初就是按计算机的思路来编写程序。

我就拿用咖啡机煮咖啡为例,按照面向过程的流程是:


  1. 执行加咖啡豆方法
  2. 执行加水方法
  3. 执行煮咖啡方法
  4. 执行喝咖啡方法


很简单直观的操作,你可能没什么感觉,我再按面向对象思想来分析下这个流程。


在执行煮咖啡操作前要抽象出:人和咖啡机(分类),然后开始执行:


  1. 人.加咖啡豆
  2. 人.加水
  3. 咖啡机.煮
  4. 人.喝咖啡

是不是有点感觉了?

面向过程,从名字可以得知重点是过程,而面向对象的重点是对象。

从这个例子可以看出两者的不同:面向过程是很直接的思维,一步步的执行,一条道走到底。


而面向对象是先抽象,把事物分类得到不同的类,划分每个类的职责,暴露出每个类所能执行的动作,然后按逻辑执行时调用每个类的方法即可,不关心内部的逻辑。

从例子可以看出面向对象编程执行的步骤没有变少,整体执行流程还是一样的,都是先加咖啡豆、加水、煮咖啡、喝,这个逻辑没有变。


无非就是划分了类,把每一步骤具体的实现封装了起来,散布在不同的类中。


对我们程序员来说是最最直接的感受:变的其实就是代码的分布,煮咖啡的代码实现被封装在咖啡机内部,喝咖啡的代码实现被封装在人内部,而不是在一个方法中写出来。

代码的分布确实是最直观的,但是变得不仅只是分布,而是思想上的变化。


就是上面提到的计算机思维到人类思维的变化。


我认为这个变化是因为软件的发展,业务越来越复杂。


人们用面向过程语言编写复杂的软件时,需要按照不同的功能把一些数据和函数放到不同的文件中,渐渐地人们就发现这不就是先分类吗?


并且好像业务分析下来都能和现实世界的东西对应上?


于是人们慢慢地总结、提炼就演变成了面向对象,再根据面向对象的特性提炼出关键点:封装、继承和多态。


而这个面向对象思想就类似我们人类面对复杂场景时候的分析思维:归类、汇总。

所以面向对象编程就成为了现在主流的编程风格,因为符合人类的思考方式。

面向过程编程和面向对象编程从思想上的变化是:从计算机思维转变成了人类的思维来编写编码。


所以我们知道面向对象编程其实是一种进步,一种更贴近人类思考方式的编码风格,是源于人们用面向过程编程时的经验总结。


至此我们知道了面向对象编程的来源,相信知晓了来源能更好的理解面向对象。


那到底什么是面向对象编程?


面向对象编程(Object Oriented Programming,OOP)是一种编程范式或者说编程风格。

学术一点讲就是把类或对象作为基本单元来组织代码,并且运用提炼出的:封装、继承和多态来作为代码设计指导。

这其实就是面向对象编程。


其实从上面煮咖啡的流程应该能 get 到这个含义了。


OOP 说白了就是拿到需求开始分析,进行抽象建立业务模型,每个模型建立对应的类。

思考业务的交互,根据交互定义好接口并做好接口的控制访问,将于此类相关的数据和动作都封装起来。


抽象出父类,子类继承父类来进行代码的复用和扩展。


执行功能时用父类来调用,在实际代码运行过程会进行动态绑定,调用子类的实现达到多态的特性。


多态,学术点讲就是:运行时用相同的代码根据不同类型的实例呈现出不同行为的现象。

如果有新功能要实现,只需要创建一个新子类,以前的执行逻辑不需要发生变化,这就是「开闭原则」,对修改关闭,对扩展开放”。


来简单的看个代码可能会有更直观的感受,没记错的话大学时也是拿动物举例。

狗是动物、鸭子是动物,所以有个 Animal 类。

然后能发声,所以有 voice 方法。


public class Animal {  
      public void voice(){  
          System.out.println("动物的叫声");  
      }  
    }  

然后搞个 Dog、Duck 继承 Animal 实现各自的 voice。


public class Dog extends Animal {  
      public void voice(){  
         System.out.println("汪汪汪~");  
      }  
    }  
   public  class Duck extends Animal {  
      public void voice(){  
         System.out.println("gagaga~");  
      }  
    }  

然后到时候就可以实例化不同的对象来达到多态的效果。


public class Test{  
      private Animal animal;  
      public void setAnimal(Animal animal) {  
        this.animal = animal;  
      }  
      public void voice(){  
          animal.voice();  
      }  
    }  

多态带来的好处,无非就是 Test 里面代码不用动,你想要狗叫你就 new Dog 然后 set 进去,如果要鸭子就  new Duck 然后 set 进去。

如果加入了新动物那就建一个新动物类 set 进去就行,符合开闭原则。


和面向过程编程有什么区别?


其实从上面煮咖啡和动物的这两个例子应该能感受出来区别。

最重要的是思想上的区别,上面也已经提到了。

还有一点就是数据和动作。

面向过程编程这种编程风格是以过程作为基本单元来组织代码的,过程其实就是动作,对应到代码中来就是函数,面向过程中函数和数据是分离的,数据其实就是成员变量。

而面向对象编程的类中数据和动作是在一起的,这也是两者的一个显著的区别。


相关文章
|
3月前
|
算法 测试技术 持续交付
技术感悟:代码之外的智慧
【8月更文挑战第14天】在技术的海洋中,我们常常沉浸于代码的编写和调试,追求着更高效的算法和更优雅的解决方案。然而,技术的世界远不止于此。它还包括了对问题的理解、对工具的运用、以及与他人的协作等多个方面。这些看似与代码无关的技能,实际上对我们的技术成长有着深远的影响。本文将分享一些在代码之外的技术感悟,希望能够为大家提供一些新的视角和思考。
|
算法 程序员 芯片
程序猿的产品思考:2C与2B产品思维的区别
程序猿的产品思考:2C与2B产品思维的区别
127 0
|
6月前
|
人工智能 算法 前端开发
想转行IT,有前途嘛?30个详细理由中会得到你想要的答案
想转行IT,有前途嘛?30个详细理由中会得到你想要的答案
124 0
|
前端开发 JavaScript 程序员
程序员祝福圣诞快乐的方式(内涵完整代码)
程序员祝福圣诞快乐的方式(内涵完整代码)
180 0
|
前端开发 Android开发
我奇怪的安卓开发历程(内含本人不太成熟的技术观)(四)
工作一天下来,最大的收获便是我发现项目写了半年我还是不知道这是个啥架构的,通过几次和同事沟通交流,以及浏览许多介绍和实例MVP、MVVM架构的文章,还是不了了之,当然,不能否认的是同事认为这是MVP架构的项目,我也挺倾向这个观点。
|
程序员 开发工具 Android开发
我奇怪的安卓开发历程(内含本人不太成熟的技术观)(三)
半年的开发工作通过统计git的提交记录发现其实我提交行数最多的项目也就1228行:
104 0
|
安全 程序员 虚拟化
【Windows核心编程+第一个内核程序】爆肝120小时整理-80%程序员最欠缺的能力,一半以上研究生毕业了还不懂?理解各种深度技术的基本功
【Windows核心编程+第一个内核程序】爆肝120小时整理-80%程序员最欠缺的能力,一半以上研究生毕业了还不懂?理解各种深度技术的基本功
114 0
【Windows核心编程+第一个内核程序】爆肝120小时整理-80%程序员最欠缺的能力,一半以上研究生毕业了还不懂?理解各种深度技术的基本功
|
存储 Android开发
我奇怪的安卓开发历程(内含本人不太成熟的技术观)(二)
初出茅庐的我在开发工作中成长,收获了许多,但其实也引出了一堆问题。
109 0
|
设计模式 算法 Java
工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(下)
工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(下)
工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(下)
|
程序员
程序员工作中的三个锦囊
程序员工作中的三个锦囊
程序员工作中的三个锦囊
下一篇
无影云桌面