软件设计之美
郑晔
开源项目 Moco 作者
19890 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
软件设计之美
15
15
1.0x
00:00/00:00
登录|注册

14 | 面向对象之封装:怎样的封装才算是高内聚?

你好!我是郑晔。
上一讲,我讲了你最熟悉的编程范式:结构化编程。结构化编程有效地解决了过去的很多问题,它让程序员们解决问题的规模得以扩大。
随着程序规模的逐渐膨胀,结构化编程在解决问题上的局限也越发凸显出来。因为在它提供的解决方案中,各模块的依赖关系太强,不能有效地将变化隔离开来。这时候,面向对象编程登上了大舞台,它为我们提供了更好的组织程序的方式。
在一些从结构化编程起步的程序员的视角里,面向对象就是数据加函数。虽然这种理解不算完全错误,但理解的程度远远不够。结构化编程的思考方式类似于用显微镜看世界,这种思考方式会让人只能看到局部。而想要用好面向对象编程,则需要我们有一个更宏观的视角。
谈到面向对象,你可能会想到面向对象的三个特点:封装、继承和多态。在接下来的三讲,我们就分别谈谈面向对象的这三个特点。
也许你会觉得,学面向对象程序设计语言的时候,这些内容都学过,没什么好讲的。但从我接触过的很多程序员写程序的风格来看,大多数人还真的不太理解这三个特点。还记得我们在第 12 讲中提到的那个故事吗?小李之所以被老赵批评,主要就是因为他虽然用了面向对象的语言,代码里却没有体现出面向对象程序的特点,没有封装,更遑论继承和多态。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

面向对象编程中的封装是构建内聚单元的基础,它将紧密相关的信息组合成一个单元,并通过减少对外暴露的接口来实现高内聚。封装的重点在于对象提供了哪些行为,而不是有哪些数据。在设计类时应该先考虑对象应该提供哪些行为,再考虑实现这些行为需要哪些字段。减少对外暴露的接口是封装的另一个重要方面,需要谨慎地考虑每个方法是否真的有必要暴露出去。文章还介绍了如何在C语言中运用封装的思想,将头文件作为接口,定义文件作为实现,以及通过定义PUBLIC和PRIVATE来模拟public和private的访问权限。此外,文章还提到了迪米特法则(Law of Demeter),强调了基于行为进行封装,不暴露实现细节,最小化接口暴露的重要性。通过对封装的理解和实践,可以更好地构建内聚的单元,提高程序的可维护性和稳定性。文章内容涵盖了面向对象编程的封装特点,以及如何在非面向对象的语言中运用封装思想,对读者进行了深入的技术讲解和思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《软件设计之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • 沧浪之水
    我平时用java语言开发,java语言的特点就是一切皆对象。我自己的理解是,java中对象的概念跟面向对象中对象的概念是不一样的。前者是语言的特性,后者跟作者说的一样,是一种编程范式。在具体的编码实践中,哪些属于对象,哪些不属于对象,应该是程序员掌控的。比如DDD中的领域实体,就是对象,需要仔细设计其行为接口。 至于平时说的一些POJO的对象,可以看成是数据载体,是可以加getter,setter的(没有这些默认的getter,setter,很多第三方的数据转化都很不方便,比如json,sql等)。在使用的时候,不归结为对象就可以了。

    作者回复: 能分清楚面向对象和 Java 语言,这就是一个很好的区分。 能分清楚传输数据和业务对象,这就是一个很好的区分。

    2020-06-28
    5
    44
  • escray
    首先,Demeter 不是一个人,而是一个项目,项目主页 http://www.ccs.neu.edu/research/demeter/。最早提到迪米特法则的论文出版于 1989 年,Assuring good style for object-oriented programs。还有一本书,1996 年出版,Adaptive Object-Oriented Software: The Demeter Method with Propagation Patterns。没有看过。 Demeter 是希腊神话中的大地和丰收女神,也叫做德墨忒尔。 迪米特法则简单的说,分为两个部分:不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。其实如果用另一个名字“最小知识原则”可能更容易理解一些,这个也算是程序员的“黑话”吧。 虽然接触面向对象编程已经很久了,也知道封装、继承和多态,不过写程序的时候,似乎还是习惯“一个对象一张表”的方式,也没有太多的考虑过封装的问题。整个类里面都是 getter、setter 的事情也做过,有点像是用“面向对象的语言写面向过程的代码”。 软件设计的大部分原则都耳熟能详,但是如何在写代码的时候“落地”,就不是特别清楚了,缺练。

    作者回复: 关于迪米特法则的回答,很赞!

    2020-06-28
    3
    25
  • 业余爱好者
    经常听说一句话,程序设计应该关注数据结构,设计好了数据结构,工作就完成了一半。 今天的封装更偏向能力(方法),内部数据甚至可以去掉。不知道这两个原则是否冲突呢?

    作者回复: 不矛盾,模型和实现的差别。模型关心能力,实现关心怎么做。如果还不会做,先弄明白怎么做,模型考虑的是如何组织这些元素。

    2020-06-26
    3
    15
  • Being
    “迪米特法则”,印象最深的就是“不要和陌生人说话”。今天学习了本节课程,有了些启示,也可以理解为只和陌生人表达确定性意图。 每暴露一个公共API就增加一份职责,所以在每次暴露API时就要问自己,这个职责是自己必要的,还是有可能会增加不必要的负担。

    作者回复: 很好地分享!

    2020-06-27
    14
  • OlafOO
    好奇老师怎么看待Lombok,所有字段生成getter/setter不是一个好的实践,Java Bean的概念是不是也不该被提倡?

    作者回复: Lombok很好,可以少写很多代码,但必须限制它的使用,像Data和Setter都是不应该用的。Java Bean本来也不是应该用在所有情况下的技术,太多误用了。

    2020-06-28
    6
  • 捞鱼的搬砖奇
    老师好,后续的文章能不能说下取方法名/变量 的技巧,

    作者回复: 《代码整洁之道》(Clean Code)第二章讲的都是命名的技巧,你可以去看一下。

    2020-06-26
    2
    5
  • 阳仔
    面向对象的基本原则第一个就是封装 日常开发中最常用到的封装莫过于函数了,一个函数实现一个最小的功能单元, 然后将各个函数与属性组织起来,就成了类 一个类又可视为最小的模块。 如何更好暴露接口是编码实践中的技能,时刻要思考着这个接口是否需要暴露以及最小化暴露的接口 最近我也在思考项目需要重构模块,我发现重构是一种软件进化,在杂乱的代码中理清逻辑,重新组织结构

    作者回复: 很好的思考。

    2020-06-26
    4
  • Janenesome
    意图和实现分离,应该更加关注对象提供哪些行为,起一个好的命名,而不是一股脑的 getter\setter。 谨慎暴露接口,日常中对 public 的滥用的确是随处可见的。 迪米特法则:一个类对自己依赖的类知道的越少越好。类似一个黑盒,我只通过一根绳和你产生联系,至于内部的实现以及面积体积多大等等,这些信息不要暴露出来。

    作者回复: 知道了问题,才好逐步的改进。更具体的代码问题,可以去看《代码之丑》。

    2020-10-20
    1
  • Michael
    我对于老师举的shutdown的例子有一个问题 如果按照我的想法 我会把两个shutdown方法都暴露出去 caller自己去组合 所以除非方法的实现需要变更 否则callee是不需要去更改的 但是老师说的是把两个方法封装一下 再暴露出一个封装好的方法 那么就好像老师说的 如果这两个方法需要改变顺序 caller就要改 这怎么理解?

    作者回复: 注意,这里的关键在于,原来的那两个方法变成了私有的。只对外暴露了一个方法,就是 shutdown。

    2020-06-26
    3
    1
  • qinsi
    "I made up the term "object-oriented," and I can tell you I did not have C++ in mind." --Alan Kay "Java and C++ make you think that the new ideas are like the old ones. Java is the most distressing thing to hit computing since MS-DOS." --Alan Kay

    作者回复: 多谢补充!

    2020-06-26
    1
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部