面向对象编程的一点思考和总结

什么是面向对象?

前几天看了 Robert C. Martin 写的 架构整洁之道。作者在第三章编程范式总览的时候用一句话总结面向对象编程:面向对象编程对程序控制权的间接转移进行了限制和规范。 ( 我个人理解,他这里其实是把面向对象编程直观的理解为使用 class, 在使用了 class 后,class 内部的变量,成员函数,和构造方法都变成类作用域下的变量和方法,而非全局的变量和方法,在调用的时候就有了限制和规范。)而在第五章面向对象一章的时候,作者举例说明 c++ java c# 等一众面向对象语言在封装上相对于 C 来说其实是削弱了, 而在继承上表现一般,只有在多态上体现出了安全性和便利性。最后在这一章结尾。作者总结 面向对象编程就是以多态为手段来对源代码中的依赖关系进行控制的能力,这种能力让软件架构师可以构建出某种插件式架构,让高层策略性组件与底层实现性组件相分离,底层组件可以被编译成插件,实现独立于高层组件的开发和部署 ( 我这里不完全赞同他的观点,因为在实践的时候,如果不考虑继承和封装,或者说不考虑高层次和低层次的逻辑关系以及对某些操作的封装,纯多态显然是没法实现的 )

我不是说 Robert C. Martin 大佬的观点是错误的,我只是觉得大佬应该是太强了,面向对象的一些特性和解决的问题,可能大佬在没有面向对象的年代,就已经在使用和解决,所以整件事情就显得稀松平常。就好像我不会甩水银体温计,我如果想甩下去得看视频学习手的用力方法,还要请教我女朋友拿体温计的手势。 而我女朋友拿起来就能甩, 你如果问她什么是甩体温计方法, 她会觉得莫名其妙,如果正儿八经的问她,她会说要手腕上用力。

但是什么是面向对象这个问题的答案是重要的。我入行第一次面试就因为这个问题遇到了挫折。 面试官问我,你简历上写了熟悉面向对象编程, 你给我讲一下什么是面向对象吧! 然后我说面向对象是一种编程思想,面向对象包含了三个基本特征,封装 继承 还有多态。然后面试官说面向对象不是一种语言特性吗? 比如 java 和 c++ 是面向对象语言,而 c 是面向过程语言。然后我说确实编程语言有面向过程的编程语言和面向对象的编程语言之分。但是面向对象作为一种编程思想,更重要的是程序员在编码过程中的实践, 就算是纯面向过程语言一样可以写出面向对象风格的代码。然后我和面试官就由此产生了分歧。后续气氛就变得冷淡, 当然面试也没有通过。

这件事对我影响挺大的, 当然我现在依然认为面向对象是一种编程思想或者说编程技术,它与某个特定的编程语言无关。

面向对象的三大特性。

其实如果看教材的话面向对象应该是四个特性 抽象,封装,继承和多态。只不过抽象更偏向于程序设计而非编码, 这篇文章暂时不考虑面向对象程序设计的问题。

  1. 封装
    封装指的就是对类外部作用域隐藏类内部作用域的信息(其实就属性和方法)的操作。

    • 类结构本身就是类内部变量和方法的封装
    • 类通过访问控制符进行的封装, 不同的访问控制符,类作用域外部对类作用域内部的变量和方法的访问权限也不同。
      • public
      • private
      • protected
    • static 总是 public 的
    • final 像是 pulic 和 private 的结合体
    • 其他
      • 类方法和实例方法的区别
      • 类属性和实例属性的区别
      • 内部类
  2. 继承
    继承指的就是表述同一类型的多个类共性的操作。 比如白狗和黑狗都继承了狗,这个继承说明白狗和黑狗都拥有狗的一些共性

    • extends
    • implements
    • trait
  3. 多态
    多态指的就是同一类型的多个类对同一个操作可能有不同的实现方式。这里隐含着三个不同的条件,使用多态的时候就是要利用好这三个不同的条件。

    • 多态指的是同一类型的多个类
      • 工厂模式, 一个工厂可以创建多个同一类型但不完全相同的类
    • 同一个操作
      • java 中的向上转型
      • 其他语言中的依赖注入,总之就是定义好了传入参数的类型,在脚本运行时 实例总是能正确执行到指定的方法。
    • 不同的实现方式
      • 不同的子类对同一操作的实现可能完全不同。

总结。

当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。如果程序员如果写的代码具有以上面向对象的特征,那么他显然就是在进行面向对象编程。 如果不同意的话, 假设有一个’发明大王’ 创立了一个新语言,他的语言中将 所有的 class 替换为 wo_zui_niu_bi。 他是不是就能基于 wo_zui_niu_bi 发明一种 wo_zui_niu_bi 编程范式。这显然并不合理, 只要一眼就能看出它和其他语言的面向对象根本没有区别。

欢迎各位大佬补充和指正。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 50

有一个操作系统,看起来像安卓,用起来也和安卓没区别,也可以安装安卓的安装包,也可以使用安卓的 ADB,甚至可以看到他的安卓版本号和安卓进程,但是他叫什么呢?____,呐,这个就叫继承多态。

1年前 评论
mshx 1年前

有一个操作系统,看起来像安卓,用起来也和安卓没区别,也可以安装安卓的安装包,也可以使用安卓的 ADB,甚至可以看到他的安卓版本号和安卓进程,但是他叫什么呢?____,呐,这个就叫继承多态。

1年前 评论
mshx 1年前
fatrbaby

使用面向对象的语言写面向过程的代码不要太多,哈哈。

1年前 评论

思考结束了 可以去送外卖了

1年前 评论
九霄道长

我的理解
面向对象:以类和对象为构建系统的基本单元,设计类之间的交互(职责划分),组合构建上层接口。

没有面向对象语法支持的语言也是可以抽象模拟对象的比如 c 语言
结构体和函数指针

推荐文章:tech.meituan.com/2017/12/22/ddd-in...

领域驱动设计应该是面向对象较好的体现了

  • implements
  • trai
    这两个特性应该是组合而非继承
    继承:is-a 麻雀是鸟
    组合:has-a 蚊子有翅膀
    哪能说苍蝇蚊子是一只鸟吗
1年前 评论
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
九霄道长 (作者) 1年前
九霄道长 (作者) 1年前
徵羽宫 (楼主) 1年前
九霄道长 (作者) 1年前
徵羽宫 (楼主) 1年前
九霄道长 (作者) 1年前
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
JinBB 1年前
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前

难道我们面试的是同一家公司?我也遇到这样的问题,不过面试官很好,是让你自己说,态度也很不错,还教我一些知识点 :joy:

1年前 评论
徵羽宫 (楼主) 1年前
Junwind

其实面向对象是为了应对日渐庞大的软件工程,和人员工作分配,减少耦合,方便大家一起高效的完成工作。 你自己的项目想咋写就咋写即可,公司的项目,公司用什么,就用什么,没那么多纠结。

1年前 评论
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前

"面向对象是一种编程思想或者说编程技术,它与某个特定的编程语言无关" 我赞同这个说法~

1年前 评论

面对对象就是一个编程风格,能够把东西做为一个整体。

1年前 评论
徵羽宫 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!