代码之丑
郑晔
开源项目 Moco 作者
19833 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 24 讲
代码之丑
15
15
1.0x
00:00/00:00
登录|注册

05 | 大类:如何避免写出难以理解的大类?

你好,我是郑晔。
上一讲我们讲了长函数,一个让你感受最直观的坏味道。这一讲,我们再来讲一个你一听名字就知道是怎么回事的坏味道:大类。
一听到大类,估计你的眼前已经浮现出一片无边无际的代码了。类之所以成为了大类,一种表现形式就是我们上节课讲到的长函数,一个类只要有几个长函数,那它就肯定是一眼望不到边了(长函数的话题,我们上一讲已经讨论过了,这里就不再赘述了)。
大类还有一种表现形式,类里面有特别多的字段和函数,也许,每个函数都不大,但架不住数量众多啊,这也足以让这个类在大类中占有一席之地。这一讲,我们就主要来说说这种形式的大类。

分模块的程序

我先来问你一个问题,为什么不把所有的代码都写到一个文件里?
你可能会觉得这个问题很傻,心里想:除了像练习之类的特定场景,谁会在一个正经的项目上把代码写到一个文件里啊?
没错,确实没有人这么做,但你思考过原因吗?把代码都写到一个文件里,问题在哪里呢?
事实是,把代码写到一个文件里,一方面,相同的功能模块没有办法复用;另一方面,也是更关键的,把代码都写到一个文件里,其复杂度会超出一个人能够掌握的认知范围。简言之,一个人理解的东西是有限的,没有人能同时面对所有细节。
人类面对复杂事物给出的解决方案是分而治之。所以,我们看到几乎各种程序设计语言都有自己的模块划分方案,从最初的按照文件划分,到后来,使用面向对象方案按照类进行划分,本质上,它们都是一种模块划分的方式。这样,人们面对的就不再是细节,而是模块,模块的数量显然会比细节数量少,人们的理解成本就降低了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了如何避免编写难以理解的大类,通过分析大类的表现形式和产生原因,以及解决方法,强调了程序模块化设计的重要性。作者首先指出大类的典型特征,包括字段过多和职责不单一,导致类的复杂度超出人们的理解范围。随后,作者提出了分模块的程序设计思想,强调了对程序进行模块划分的重要性,以降低人们的理解成本。解决大类问题的方法是将大类拆分成若干个小类,根据职责和字段分组进行拆分,以实现单一职责原则。文章还强调了软件设计对于写好代码的重要性,以及程序设计语言提供的类集合构造方式。总的来说,本文通过讲解大类的问题及解决方法,强调了程序模块化设计的重要性,以及如何避免写出难以理解的大类。

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

全部留言(29)

  • 最新
  • 精选
  • qinsi
    正如类太大会超出人的理解范畴,类太多也会。举个java的例子,做业务开发时大部分需求都可以通过spring boot完成,但如果要对spring进行定制,需要理解的内容就多了一个数量级。框架本身在满足更多需求的同时不断重构,类的职责越来越单一,数量也越来越多。虽然每个改动都有正当的理由,但如果不知道这些改动的历史,一下子就被那么多类糊一脸,任谁也是吃不消的。个人理解这可能是在业务优先的场景下,两害相权取其轻的结果吧。

    作者回复: 认为类太多是个问题,我在文章中已经说了一个角度,这里再补充一个角度。这里有一个假设是,一上来就要把所有的类理解掉, 然而,这种假设是不成立的,作为 Java 程序员,你不会去看所有 JDK 里的类,也不会看 Spring 所有的类。 一般的做法是理解主线,然后,根据需要了解相应的类, 这是做事方法的问题。不能因为我们可能要面对所有代码,就一下子去吃透所有的代码,这是普通人做不到的。 所以,类的数量多少不是问题,通过怎样的方式,降低代码理解的难度才是我们要考虑的问题。

    2021-01-09
    3
    38
  • wang_acmilan
    目前在做嵌入式的项目,里面的C代码如郑老师所言,大部分都是以“效率”为名,写的巨长无比。 我有一个问题想咨询郑老师,我们的项目不算法,4万行左右,我在进行一代往二代的重构,我个人感觉应该把功能都拆开,以不同文件夹的层级方式进行代码的整理;而组内的同事以及外包的员工觉得代码不算多,一个文件夹,几个文件一把就搞定了,没必要搞那么复杂。 这个问题就和老师这篇文章所述有一点不一样了:如果觉得代码架构和代码逻辑能够理解,是不是clean code的必要性或者说急迫性就没有那么大了。先以交付为目标进行coding,后续再看情况。

    作者回复: 马斯洛需求层次理论告诉我们,人有不同层次的追求。生存是底线,总有人会告诉你,温饱解决就行。 写代码也一样,功能实现就可以了,代码规模不大,可以理解。问题在于,等规模大了,你真的改得动吗? 你的代码为什么要改动?还不是一代的代码改起来很吃力了。为什么吃力了?是因为功能实现不了吗?还不是代码可维护性差。为什么可维护性差?还不是根本不知道可维护性好的代码是什么样。 你不妨推演一下,按照他们的建议写代码,距离走回老路上,还有多远的距离。 既然有机会建立新的标准,既然有机会知道可维护的代码长什么样,为什么要按照老路走呢? 如果知道什么是“积重难返”,就会懂得“勿以善小而不为”的价值所在了。

    2021-01-09
    5
    17
  • 邓志国
    看了郑大的例子,正合我当前做法,给自己吃颗定心丸。我现在java一个4万行代码的项目,最大的类不到300行代码。普遍100行以下。很多是得益于对象健身操。操练了对象健身操,对面向对象会有更深刻理解

    作者回复: 你做得已经很好了!

    2021-01-11
    2
    10
  • 布凡
    老师,请问一下,一般来说实体的大小和数据表的列是对应关系的,User类拆分出了Contact这个类,那么数据库的层面是否也应该差分出一个Contact表还是把信息都存储在User表的列中呢?

    作者回复: 都可以,根据自己的需要。很多人纠结的点在于没做过“类分开,表在一起”,其实,很多框架是支持的。

    2021-02-09
    8
  • life吖
    有的时候,拆分和聚合是需要做取舍的。比如,微服务的聚合层,是为了适配和性能考虑会做裁剪或聚合,不可避免的会出现些大类,此时可以进行字段分组,但是聚合后的大类是无法进行拆分。

    作者回复: 我的理解,你问的问题是,在微服务中,有专门把多个服务的结果聚合起来,返回给客户端,这是你所说的聚合层。你的问题是,在这个聚合层里,表示请求和应答的类可能会比较大,改怎么办。 根据这个理解,我的回答是,这里的聚合层扮演的角色其实一个防腐层,它本身的职责就是和请求应答去做一一应对。一般来说,这样类行为很单一,主要的职责就是数据转换。对于这种类,大一点是可以的,因为它不会对业务造成什么影响。重点在于,这个类里没有业务。 如果你想把类里面的字段做一个分组,可以研究一下不同的转换库,比如,在 Java 中把 JSON 和对象进行相互转换的 Jackson。看看它们怎么可以把不同类的字段和协议中的平铺字段直接映射,肯定有方案的。 不过,最后要提醒你的一个重点是,简单的聚合并不是一个好办法,而是需要谨慎地设计通信协议,这才是保证类比较小的根本办法。

    2021-01-11
    2
    8
  • Hobo
    将user里的联系信息单独拆出一个类来以后,我要对外暴露一个修改联系信息的方法是应该放user里还是放contact里?

    作者回复: 如果 user 类是整个的根,修改联系方式就可以在 user 类里提供一个入口,然后,再调用 contact 类。

    2021-01-11
    7
  • 老师,我也有个一直找不到平衡点的问题,就是类爆炸问题,如果拆分的类太多 会不会出现累爆炸的问题呢,从而影响系统性能,这个有没有个比较数字化的标准呢。还是我看这个问题的角度就完全不对。(ps 拍个马屁:我真的越来越崇拜老师了😍😍)

    作者回复: 不要把性能放在这里说事,因为这属于发力找错了对象。性能优化肯定不是在这个层面上的,而是要从一个系统的层面上进行考量。 类爆炸,首先是,啥叫类爆炸?类多就是类爆炸吗?那岂不是所有代码都在一个类里完成就是最好的。类多不是问题,问题是过度设计造成的难以理解的结构才是问题。

    2021-01-11
    2
    7
  • 人月聊IT
    每个类两个字段????

    作者回复: 我知道大多数人做不到,但我们应该知道更高的追求是什么。

    2021-01-09
    5
    5
  • 熊斌
    我们的项目中,或者是用到的类似于JPUSH这种开源软件中,都存在“大类”的问题。最头疼的是遇见没有注释说明的大类,里面罗列了很多字段、函数,但是你都没法一眼就看出来各自都是干嘛的,只能先猜一下,完了之后根据调用关系去梳理。 最近用PHP进行二次开发,用到一个扩展包,里面的入口class写得巨长无比...... 目前来看,把类写小,越小越好能做到的是凤毛麟角呀。也可能是我见得太少了

    作者回复: 不意外,大多数代码都是有问题的,Clean Code是稀缺的。

    2021-01-09
    5
  • Sinvi
    今天有了新的追求

    作者回复: 加油!

    2021-01-09
    4
收起评论
显示
设置
留言
29
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部