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

06 | 长参数列表:如何处理不同类型的长参数?

你好,我是郑晔。
前面两讲,我们分别讲了长函数和大类,它们都是那种“我一说,你就知道是怎么回事”的坏味道,而且都让我们深恶痛绝,唯恐避之不及。这样典型的坏味道还有一个,就是长参数列表。
好吧,我知道你的脑子里已经出现了一个长长的参数列表了。每个程序员只要想到,一个函数拥有几十甚至上百个参数,内心就难以平静下来。
那么,函数为什么要有参数呢?我们知道,不同函数之间需要共享信息,于是才有了参数传递。
其实,函数间共享信息的方式不止一种,除了参数列表,最常见的一种方式是全局变量。但全局变量会带给我们太多意想不到的问题,所以,在初学编程的时候,老师就会告诉我们,不要使用全局变量。从程序设计语言发展的过程中,我们也可以看到,取消全局变量已经成为了大势所趋。
但函数之间还是要传递信息的,既然不能用全局变量,参数就成了最好的选择,于是乎,只要你想到有什么信息要传给一个函数,就自然而然地把它加到参数列表中,参数列表也就越来越长了。
那么,长参数列表有啥问题呢?这个问题其实我在上一讲已经说过了,人脑能够掌握的内容有限,一旦参数列表变得很长,作为普通人,我们就很难对这些内容进行把控了。
既然长参数列表的问题是数量多,秉承我们一以贯之的思路,解决这个问题的关键就在于,减少参数的数量。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文从实际代码出发,探讨了长参数列表的问题及解决方法。作者首先介绍了长参数列表的问题所在,即参数数量多导致人脑难以掌握,并提出了减少参数数量的思路。其后,作者提出了两种解决长参数列表问题的方法:一是将参数列表封装成一个类,二是动静分离,将静态不变的数据作为类的字段,只将每次变动的数据作为参数传递。通过具体的代码示例,读者可以清晰地了解这两种方法的实际应用。文章强调了参数封装成类的重构手法,以及动态数据和静态数据分离的重要性,为读者提供了解决长参数列表问题的实用思路。文章还提到了解决标记参数的方法,即根据标记参数将函数拆分成多个函数。总结时刻强调了减小参数列表的重要性。整体而言,本文通过深入分析长参数列表问题及解决方法,为读者提供了实用的技术思路和重构手法。

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

全部留言(23)

  • 最新
  • 精选
  • 3.141516
    关于通过拆分函数的方式来移除标记有一点疑问: 这种方式不是意味着,外部调用函数的时候需要标记去判断调用哪个函数吗? 这是不是说,这种方式变化过后,标记判断逻辑从当前函数转移到了调用函数部分,但是由于该标记是由调用函数产生,所以总的来说相当于减少了标记作为参数传递的部分。 请老师解答!谢谢

    作者回复: 如果只有一处地方传递标记,其实还好。如果标记是一路传递,透过多个函数,也许说明,这是另外一条路径,可以完全拆分出来。

    2021-01-12
    2
    28
  • Y024
    get/set 的普及,很容易让人先入为主的把 get 开头的方法当做是“轻量级访问器”这样的用法:它只是简单地返回一个内部成员变量。文中的 getChapters,使用 fetch 或者 query 可能更合适?它们看起来更像是有一些代价的操作。

    作者回复: 很好的角度,是这样的。

    2021-01-12
    3
    13
  • 业余爱好者
    一个方法第一选择是没有参数。 第二选择是一个参数。 稍次之是两个参数。 三个以上参数简直无法忍受。 ----代码整洁之道

    作者回复: 这是要努力追求的。

    2021-01-12
    4
    11
  • 知行合一
    有一个疑问,添加标记参数有的时候是为了减少函数之间的重复,但如果移除标记参数而构建了多个函数,可能导致重复率提高,这时候如何抉择

    作者回复: 如果标记过多,说明缺少了一个模型,应该考虑构建一个类。

    2021-06-21
    10
  • 一言尔莫笑
    有个疑问,如果方法A的参数列表原先就需要八九个参数,重构以后把参数放一个类B里面。 调方法A之前不一样要有一个参数很多的构造方法?

    作者回复: 构造一个对象的方法有很多,比如,builder 模式。

    2021-01-19
    7
  • Demon.Lee
    告别标记:被调用者将业务进行拆分,移除了标记参数。但有这样一种情况:函数B调用函数C时,给C传了一个flag标志位,但B的这个flag不是B定义的,而是A传给B的,所以,我理解B也要进行业务拆分,这样层层拆分,业务就明确了。请老师指正。

    作者回复: 对,比一个函数本身有标记更可怕的是,把标记传来传去。

    2021-01-17
    2
    6
  • 大京
    枚举作为参数时,函数里就得根据枚举做不同处理;如果把枚举参数去掉改为多个对应的函数,那根据枚举做不同的处理就提前到调用的地方了。除非用其它一些设计模式

    作者回复: 这种情况其实可能需要多态

    2021-01-19
    5
  • 桃子-夏勇杰
    通过封装类形式上缩短了参数列表,但是传递的信息量其实还是那么多,本质上我们是不是应该减少非必要的信息传递呢?一个函数传递多少信息量较为合适呢?

    作者回复: 是的,你这个思路是对的,真正应该思考的是,到底哪些信息是必要的。

    2021-01-14
    2
    4
  • adang
    在前一家公司,因为项目里几个相同的逻辑散落在各处,维护起来很不方便,所以做了一次重构,将逻辑放在一个方法里,根据标记参数处理特性化的地方。那次重构的结果就是其中一个方法的参数巨多,大约有十几个,其中好几个参数就是标记参数。看完今天这节课的内容,知道了,原来这也是一种坏味道。已经离开上家公司很久了,期望后面维护业务的小伙伴一切安好。:)

    作者回复: 恭喜脱离苦海。

    2021-01-13
    2
    4
  • 润豪
    那怎么去构建 NewBookParamters 嗯, 是不是也得把全部属性在构造函数里面传进去? 特别是每个字段都没有默认值, 需要设置.

    作者回复: 可以,也可以使用Builder模式

    2021-04-27
    3
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部