设计模式之美
王争
前Google工程师,《数据结构与算法之美》专栏作者
立即订阅
17458 人已学习
课程目录
已更新 20 讲 / 共 100 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 (1讲)
开篇词 | 一对一的设计与编码集训,让你告别没有成长的烂代码!
免费
设计模式学习导读 (3讲)
01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?
03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
设计原则与思想:面向对象 (11讲)
04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?
05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?
08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?
10 | 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?
11 | 实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
设计原则与思想:设计原则 (3讲)
15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
不定期加餐 (2讲)
加餐一 | 用一篇文章带你了解专栏中用到的所有Java语法
加餐二 | 设计模式、重构、编程规范等相关书籍推荐
设计模式之美
登录|注册

03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?

王争 2019-11-04
在上一节课中,我们讲到,要具备编写高质量代码的能力,你需要学习一些编程方法论,其中就包含面向对象(我们可以把它看成一种设计思想)、设计原则、设计模式、编程规范、重构技巧等。而我们整个专栏的内容也是围绕着这几块展开讲解的。所以,今天我就先来简单介绍一下这几个概念,并且说一说它们之间的联系。
今天的内容相当于专栏的一个教学大纲,或者说学习框架。它能让你对整个专栏所涉及的知识点,有一个全局性的了解,能帮你将后面零散的知识更系统地组织在大脑里。
话不多说,我们就一块来看一下,接下来的这 8 个月我们到底要学习哪些内容吧!

面向对象

现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。现在比较流行的编程语言大部分都是面向对象编程语言。大部分项目也都是基于面向对象编程风格开发的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。
所以,在专栏的最开始,我们会详细地讲解面向对象编程的相关的知识,为学习后面的内容做铺垫。对于这部分内容,你需要掌握下面这 7 个大的知识点。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《设计模式之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(188)

  • 阿卡牛
    面向对象是武器,设计模式是招式,设计原则是心法
    以心法为基础,以武器运用招式应对复杂的编程问题
    2019-11-04
    6
    276
  • 帆大肚子
    函数是相对比较小的可复用单位
    面向对象把可复用单位提升到类层次
    设计模式把可复用单位提升到框架层次
    2019-11-04
    96
  • 段启超
    我觉得今年对我来说,是重新认识“面向对象”的一年。
    今年事我工作的第三年了(从八月份开始算第三年),年初的时候误打误撞的学了一段时间的DDD,让我瞬间感受到了什么才是面向对象编程,之前自己做的都是用面向对象的语言写面向过程的代码。究其原因,可能是MVC 三层架构的影响,太多人的代码里头只剩下了pojo这种贫血模型。封装,继承,多态,抽象是啥,早就忘干净了。
    在软件设计方面,很多人习惯了一开始就设计数据库表结构,结果就是代码逻辑跟数据库构成了强耦合,数据库一改,代码基本上会被改个彻底。在这种情况下,我们用的java面向对象的语言,结果却写的是面向过程的代码,这种代码基本没有可维护,可扩展,更没有可测试性一说。所以,面向对象的这个词语,被太多的人只是挂在嘴边上了,落实到代码里边,就成了面向过程。
    在意识到这个问题后,我花了一段时间重新回顾了一遍面向对象的知识,并试图用来改进代码质量,这个过程是充满坎坷的,我总结了一些自己的体会:
    1: 要真正落地面向对象编程,面向对象设计是前提,没有面向对象的设计意识,写着写着就成了面条代码。
    2:以前只知道封装、继承、多态,全然忽视了最重要的抽象,抽象是封装、继承、和多态的基础。合理的抽象源于对业务主体的合理分析和认识。合理的抽象,应该是自洽的,易于理解的。
    3:关于组合和聚合的关系,最核心的区别就是生命周期的区别,组合关系中,整体和部分是一个整体,离开了整体,部分没有意义,同时产生,同时销毁,而聚合关系中,部分单独存在也可以是有意义的。
    4:别滥用继承,继承的作用更多的时候使用多态的特性。
    关于UML :
    在工作的过程中,试着画过UML图,UML图有着自己一条完整的语言和生态,学习成本还是相当高的,问题在于,即使用了标准的UML 图,如果沟通过程中,对方不懂,也依然效果不大,所以我对UML的感觉就是: 能看懂,会画基本的即可,没必要太追求标准化,虽然如此,但是UML 还是很重要的,它的意义是提供一种面向对象设计的表达方式,是学习面向对象设计中不可缺少的一部分(个人理解)。
    2019-11-11
    3
    57
  • AF
    第二题,文中已经给出答案了?
    主要是因为面向对象编程因为具有丰富的特性(封装抽象继承多态),可以实现很多复杂的设计思路,
    是很多设计原则、设计模式等编码实现的基础。
    2019-11-04
    34
  • 丁丁历险记
    建议和左耳的程序员练级攻略结合起来一起读。
    上述道理 ,知易行难,一起加油。
    2019-11-04
    3
    21
  • 于留月
    个人认为重构对提高代码质量最有效,原因:
    重构的基础就是面向对象、设计原则、设计模式、编程规范;
    重构是一个持续的过程,能够兼顾项目进度、项目开发效率和项目质量,既可以避免前期的过度设计,又能避免后期代码腐化,从而保证代码的质量不下降以致不断提高代码质量;
    通过单元测试等相关手段,保证重构的正确性
    重构可从代码层次、项目阶段、开发周期、人员规模等不同纬度进行

    其他提高代码质量的方法:
    阅读高质量框架代码,先模仿;
    代码Review,定期总结;
    技术分享,倒逼输出,看了、做了都不如说给比人听更有效果;
    工具检查(如lint、leakcanary等),开发过程中避免常识性错误和隐藏问题;

    为什么它在标题中会特意提到“面向对象”呢?
    因为设计原则、设计模式实现大部分都是基于面向对象的特性(封装、抽象、继承、多态)实现的
    2019-11-06
    16
  • Yayu
    面向对象的特征也未必包含“继承”这一点吧,比如 Go 语言就没有提供“继承”这个特性,取而代之的是,推荐使用“组合”。但不能说它不支持面向对象编程。那么我们在探讨“面向对象”这个范式时,需要更深刻的去思考“面向对象”的本质是什么。而不是用Java 中的概念来一以概之。希望王争老师参考。

    作者回复: 后面会讲到,等讲到了就明白了

    2019-11-05
    9
    12
  • Monday
    看起来都明白,讲起来都不清
    2019-11-05
    1
    11
  • 哥本
    设计原则是高手的内功,设计模式是少林,武当,峨眉派的武术套路,规范是招式 出拳还是横扫,重构是组合拳 融汇贯通各种组合,而想练好这些武功还要有扎实的基本功 面向对象。
    2019-11-06
    8
  • lijun
    有的时候业务复杂,代码就被业务牵着鼻子走,尤其是老项目,既存代码写的可读性差,但是时间紧任务重,能跑就行……哎
    2019-11-04
    6
    8
  • 刘大明
    最近一直在思考一个问题,就是我们在开发过程中,写好代码,应该是一个程序员必备的基本功。这个好字就是这老师说的高质量的代码,以前一直觉得要追求最热最新的技术,不然就会被淘汰。其实忘记了一个最基本的事情,怎么写好代码,写高质量的代码,这个才是我们开发过程中的重点,写好代码应该是一个合格的程序员必备的技能,毕竟写代码才是我们真真正正吃饭的家伙。老师出的这个专栏真的是太好了,教大家怎么样做好我们程序员最基本的事情。
    2019-11-05
    6
  • 兔2🐰🍃
    总结:提高代码质量的方法论,包含面向对象(基础),设计原则(指导方针),设计模式(三大类,提高扩展性),编程规范(提高可读性),重构(保证代码质量)。
    2019-11-06
    5
  • 陈拾柒
    再好的理论,应用不到实际中也是白费。所以对于提升代码质量,最有效的是编码规范,其次是设计原则,再次是代码重构,最后才是面向对象和设计模式。
    整个排序是按照我理解的难易程度来进行的。一般一个项目都是多人开发,多人并行开发中,考虑到团队中技术水平不一,保持代码质量最好的方式就是先制定编码规范,大家最容易达成一致并遵守。其次是设计原则,因为它相对来讲更明确,违反设计原则基本等于硬伤,更容易得到认同。代码重构是需要长期去做的,甚至不是在开发过程中而是在维护过程中去做的,所以排在第三位。后面两项更多的要考虑实际情况,不同水平的人甚至相同水平的人都会有自己不同的理解,比较难以达成统一,项目排期足够还好,一旦排期不足,很可能在当时没那个成本去谈论这些。

    第二个问题老师已经回答了,因为面向对象的特性是其他的基石。

    建议老师在后续课程中,除了讨论如何提升自己的代码质量,也讨论一下在一个多人团队中如何提升团队的代码质量,有哪些比较好的手段可以去应用。包括在项目排期比较紧的时候,可以有哪些方式去保证代码质量。

    作者回复: 嗯嗯,加餐里有讲到的。

    2019-11-15
    3
  • Miaozhe
    我看到设计原则中还有迪米特法则(Law of Demeter, LoD),这个也是解决God类的一种方式。另外这个法则,好像跟组合复用相背呢。帮忙解释一下。

    作者回复: 学了后面章节就明白了

    2019-11-08
    3
  • zachary
    争哥,设计模式有三种类型:
    创建型:这个好理解,就是用来创建对象的一些模式
    结构型和行为型不好理解,结构体现在哪里?行为又体现在哪里?能否说的更具体点?

    作者回复: 后面会讲到的,别急哈

    2019-11-06
    3
  • 辣么大
    GoF的提出是针对解决面向对象编程中遇到的问题,所以书名中强调“面向对象”。It’s a book
    of design patterns that describes simple and elegant solutions to specific problems
    in object-oriented software design.
    2019-11-05
    3
  • Geek_222ec6
    设计原则是指导设计模式的更抽象的理论(这么说应该对吧)

    另外有个困惑就是在编码规范的时候,自我感觉英语还可以,但是函数,变量命名的时候经常会犯纠结症和强迫症。。。不知道怎么命名才好。

    作者回复: 理解是对的。这个正常,一个好的命名确实要花点时间想的

    2019-11-09
    1
    2
  • 修缘
    编码规范和设计原则解决的是可读性和可维护性,而面向对象是一种设计方法或者说是一种抽象思维,更符合人类的思考方式,所以它们的属性偏向于静态的概念;代码重构和设计模式是一种动态的概念,是具体的执行方法,当然代码重构本身就包含了:编码规范,设计原则,设计模式。
    另外,面向对象和设计模式本身就有着紧密的联系,设计模式是解决特定问题的有效方法,是经验的总结。
    2019-11-06
    2
  • 浅夏
    个人觉得首先应该提高代码可读性,然后在应用相关的面向对象思想,设计原则,设计模式等去重构
    2019-11-05
    2
  • 胖大海
    对于重构,我有话(槽)要说(吐):我是做企业项目外包的,我们给客户交付的项目大多在客户方面庞杂缺少弹性的IT合规性要求和业务快速变动的现实的双重夹击下痛苦地演进着。重构意味着不改变系统已有功能的情况下优化项目代码,但面临着合规性和流程的限制导致这类无业务功能更新的发布不会被甲方IT放行;另一方面不断的新需求的变更又不断地劣化着已有代码的系统架构以及业务代码的设计。不知道有没有面临同样问题的同学,在无法改变现有大环境的前提下进行有限的优化?我们现在能做的也就是在每一次追加的新需求变更时进行小幅度的改善,但这无法受到任何工作流程的保护和管理,仅能靠程序员个人的良心来做。另外,如何保证重构不会因为代码结构的变化引入新的bug呢?单元测试以及覆盖率较高的自动化测试吗?

    作者回复: 单元测试是一个非常有效的手段,后面的章节中会讲到。

    2019-11-05
    1
    2
收起评论
99+
返回
顶部