设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?

Keep It Simple and Straightforward.
Keep It Short and Simple.
Keep It Simple and Stupid.
不要过度优化。
不要重复造轮子,要善于使用已经有的工具类库。
不要使用同事可能不懂的技术来实现代码。
本身就复杂的问题,用复杂的方法解决,并不违背KISS原则。
而KMP算法本身具有逻辑复杂、实现难度大、可读性差的特点。
当我们需要处理长文本字符串匹配问题,或者字符串匹配是某个产品的核心功能,又或者字符串匹配算法是系统性能瓶颈的时候,我们就应该选择尽可能高效的KMP算法。
KMP算法以快速高效著称。
从性能的角度来说,选择第三种实现方式是不是更好些呢?
不过,你可能会说,第三种实现方式虽然实现起来稍微有点复杂,但性能要比第二种实现方式高一些啊。
第三种实现方式,不使用任何工具函数,而是通过逐一处理IP地址中的字符,来判断是否合法。
第二种实现方式使用了StringUtils类、Integer类提供的一些现成的工具函数,来处理IP地址字符串。
讲完了第一种实现方式,我们再来看下其他两种实现方式。
答案是否定的。
它的代码行数最少,那是不是就最符合KISS原则呢?
第一种实现方式利用的是正则表达式,只用三行代码就把这个问题搞定了。
而KISS原则就是保持代码可读和可维护的重要手段。
我们知道,代码的可读性和可维护性是衡量代码质量非常重要的两个标准。
它不仅经常用来指导软件开发,还经常用来指导更加广泛的系统设计、产品设计等。
KISS原则算是一个万金油类型的设计原则,可以应用在很多场景中。
KISS原则的英文描述有好几个版本,比如下面这几个。
话不多说,让我们带着这些问题,正式开始今天的学习吧!
等你听完这节课,我相信你很自然就能回答上来了。
如果你还不能非常清晰地回答出上面这几个问题,那恭喜你,又得到了一次进步提高的机会。
理解这两个原则时候,经常会有一个共同的问题,那就是,看一眼就感觉懂了,但深究的话,又有很多细节问题不是很清楚。
今天,我们讲两个设计原则:KISS原则和YAGNI原则。
上几节课中,我们学习了经典的SOLID原则。
标题:我为何说KISS、YAGNI原则看似简单,却经常被用错?
什么时候应该使用现成的工具类库、开源框架?
什么时候要重复造轮子?
你怎么看待在开发中重复造轮子这件事情?
对于如何写出满足KISS原则的代码,我还总结了下面几条指导原则。
本身就复杂的问题,用复杂的方法解决,并不违背KISS原则。
代码行数越少并不代表代码越简单,我们还要考虑逻辑复杂度、实现难度、代码的可读性等。
KISS原则是保持代码可读和可维护的重要手段。
从刚刚的分析我们可以看出,YAGNI原则跟KISS原则并非一回事儿。
再比如,我们不要在项目中提前引入不需要依赖的开发包。
比如,我们的系统暂时只用Redis存储配置信息,以后可能会用到ZooKeeper。
YAGNI原则的英文全称是:You Ain't Gonna Need It。
如何写出满足KISS原则的代码?
代码逻辑复杂就违背KISS原则吗?
代码行数越少就越“简单”吗?
参考文章
课堂讨论
重点回顾
YAGNI跟KISS说的是一回事吗?
如何理解“KISS原则”?
我为何说KISS、YAGNI原则看似简单,却经常被用错?

该思维导图由 AI 生成,仅供参考

上几节课中,我们学习了经典的 SOLID 原则。今天,我们讲两个设计原则:KISS 原则和 YAGNI 原则。其中,KISS 原则比较经典,耳熟能详,但 YAGNI 你可能没怎么听过,不过它理解起来也不难。
理解这两个原则时候,经常会有一个共同的问题,那就是,看一眼就感觉懂了,但深究的话,又有很多细节问题不是很清楚。比如,怎么理解 KISS 原则中“简单”两个字?什么样的代码才算“简单”?怎样的代码才算“复杂”?如何才能写出“简单”的代码?YAGNI 原则跟 KISS 原则说的是一回事吗?
如果你还不能非常清晰地回答出上面这几个问题,那恭喜你,又得到了一次进步提高的机会。等你听完这节课,我相信你很自然就能回答上来了。话不多说,让我们带着这些问题,正式开始今天的学习吧!

如何理解“KISS 原则”?

KISS 原则的英文描述有好几个版本,比如下面这几个。
Keep It Simple and Stupid.
Keep It Short and Simple.
Keep It Simple and Straightforward.
不过,仔细看你就会发现,它们要表达的意思其实差不多,翻译成中文就是:尽量保持简单。
KISS 原则算是一个万金油类型的设计原则,可以应用在很多场景中。它不仅经常用来指导软件开发,还经常用来指导更加广泛的系统设计、产品设计等,比如,冰箱、建筑、iPhone 手机的设计等等。不过,咱们的专栏是讲代码设计的,所以,接下来,我还是重点讲解如何在编码开发中应用这条原则。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了KISS(保持代码简单和易于理解)和YAGNI(你不会需要它)原则在软件设计中的实际应用。作者通过对比三种实现方式检查IP地址合法性的代码,阐述了代码行数并非简单与复杂的唯一标准。KISS原则并不以代码行数来考量简单,还要考虑逻辑复杂度、实现难度、代码的可读性等。文章指出,KMP算法虽逻辑复杂、实现难度大、可读性差,但在处理长文本字符串匹配问题时是高效的选择。然而,在大部分项目开发中,应避免过度设计,不要使用同事可能不懂的技术,不要重复造轮子,不要过度优化。YAGNI原则则强调不要去设计当前用不到的功能,不要编写当前用不到的代码。总之,KISS原则强调“如何做”,而YAGNI原则说的是“要不要做”。文章提供了如何写出满足KISS原则的代码的指导原则,以及在开发中重复造轮子和使用现成的工具类库的讨论。

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

全部留言(146)

  • 最新
  • 精选
  • 小毅
    “不要使用同事可能不懂的技术来实现代码”这一条我觉得是可以值得商榷的~ 比如在项目中引入新技术就可能会违反这一条,我觉得关键点在于这个新技术是否值得引入?新技术是否可以在团队中得到推广? 有时候,在code review看到不理解的新技术时,其实刚好也是可以触发讨论和学习,如果只是单纯的不去使用,很容易造成整个技术团队停滞不前。

    作者回复: 嗯嗯 我的意思不能为了用新技术而引入新技术 不过也没那么绝对 设计问题本来就没有绝对的对重庆更多的是弄明白道理之后 根据实际场景自己去权衡

    2019-12-18
    4
    28
  • Ken张云忠
    提个疑问: 文中"所以,评判代码是否简单,还有一个很有效的间接方法,那就是 code review。",这里的code review有个前提该是团队成员的技术要有一定的水平,如果全是些初级人员,不按照面条式写代码就看起来费劲,这种代码评审就没意义了,所以前提是评审必须要有一定的内功修为.

    作者回复: 你说的没错 要有大牛 不然code review就流于形式 大眼瞪小眼

    2019-12-18
    18
  • 拖鞋党副长
    老师,以java为例,什么样的写法可以被称为不建议使用的过于高级的语法呢

    作者回复: 比如一些函数式编程语法 有人就不了解

    2019-12-19
    6
    9
  • 盒子
    争哥好,想请问一个问题,文中说到不要写同事可能不懂的技术实现,这该如何权衡呢; 对于 Java 8 的 lambda 表达式,我认为这样的代码会更为直观;可是由于同事都习惯使用存储过程,Java 7 的语法糖; 是否因为团队大部分人都不使用 lambda,就应该在项目中放弃使用呢?

    作者回复: 应该暂时放弃 等团队慢慢学习接受

    2019-12-19
    10
    5
  • 一名小学生
    打卡~ 我觉得做项目中是不需要去重复造轮子的,但如果一个轮子特别大,但我只需要这个轮子很小的一部分内容,那是不是考虑借鉴它的思想去造个轮子呢?

    作者回复: 是的 这是重复造轮子吗一个比较重要的理由

    2019-12-19
    2
    4
  • 小先生
    那请问像正则表达式这样的东西是不是就没有用武之地?

    作者回复: 当然不是 简单的正则表达式 大部分人都能看懂 就可以用 别整那种极端难看懂的就行 凡事都有个度 合理把握

    2019-12-19
    4
  • Boogie 捷
    想请问一下老师对于使用正则匹配的看法,因为在平时的工作中还是会时不时看见,而且感觉确实可以省掉一些代码。

    作者回复: 简单的正则表达式可以用的 不要太极端就好

    2019-12-18
    2
  • 万历十五年
    KISS就是杀鸡别用牛刀, YAGNI就是要少而美。

    作者回复: ������

    2020-11-12
    2
    1
  • Harlan
    KISS :简单做 YAGNI:需要才做 但大多数设计模式都是超前设计,也许项目初期根本用不到,那是否违背这两个原则,等需要用到的时候再重构?

    作者回复: 这个只能意会不能言传了

    2020-09-11
  • 阿狸爱JAVA
    @Test public void getNextsTest(){ String s = "helloWorld"; char[] chars = s.toCharArray(); int[] nexts = getNexts(chars, 10); System.out.println(nexts); } // b表示模式串,m表示模式串的长度 private static int[] getNexts(char[] b, int m) { int[] next = new int[m]; next[0] = -1; int k = -1; for (int i = 1; i < m; ++i) { while (k != -1 && b[k + 1] != b[i]) { k = next[k]; } if (b[k + 1] == b[i]) { ++k; } next[i] = k; } return next; } 这个函数的意义是啥,为啥最后输出的结果是{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}

    作者回复: kmp算法,可以去看下数据结构和算法之美专栏

    2020-07-29
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部