Linus Torvalds 在 TED 演讲上所说的有品味的代码

2022-05-19 22:02:14 +08:00
 Biwood

需求是从单向链表中删除一个指定节点。

教科书上的(普通的)写法:

void remove_cs101(list *l, list_item *target)
{
        list_item *cur = l->head, *prev = NULL;
        while (cur != target) {
                prev = cur;
                cur = cur->next;
        }
        if (prev)
                prev->next = cur->next;
        else
                l->head = cur->next;
}

优雅的(有品味的)写法:

void remove_elegant(list *l, list_item *target)
{
        list_item **p = &l->head;
        while (*p != target)
                p = &(*p)->next;
        *p = target->next;
}

目测充分利用的指针的特性,代码量少了不少。

代码仓库和详细解释在这里: https://github.com/mkirchner/linked-list-good-taste/blob/main/README.md

11385 次点击
所在节点    程序员
120 条回复
pengtdyd
2022-05-19 22:04:52 +08:00
代码是优化出来的,一开始写,没经验的人是很难写出优雅的代码的
zhengxiaowai
2022-05-19 22:06:17 +08:00
不好,如果性能没有明显差异,第一种比第二种好一百倍

至少我能一眼看出来第一种在做什么
k9982874
2022-05-19 22:08:16 +08:00
看项目组成员水平吧,linux 内核开发组都是大佬第二种没问题,放到小厂就是装逼
pca7a2
2022-05-19 22:08:17 +08:00
能让更多的人更容易看懂的代码才是好代码!
levelworm
2022-05-19 22:13:21 +08:00
大佬写代码都几十年了,整天和指针什么打交道。
cmdOptionKana
2022-05-19 22:18:55 +08:00
从 geeker 的角度看,肯定是追求 Linus 那种代码。从企业螺丝钉的角度看,那就是简单直白,新人容易接手的代码好。
codefever
2022-05-19 22:23:59 +08:00
好雨知时节,当春乃发生
Jooooooooo
2022-05-19 22:27:01 +08:00
"目测充分利用的指针的特性,代码量少了不少。"

如果这是"优雅的", 那"优雅的"并不好.
leimao
2022-05-19 22:28:10 +08:00
妙啊妙啊
leimao
2022-05-19 22:29:40 +08:00
我自己写代码的时候,喜欢把代码优化过程都 comment 保留下来。但是工作上被人要求只保留一份,其余全部删除。
leimao
2022-05-19 22:30:49 +08:00
话说工作好多年了,从来没在工作中有机会写 linked list
loading
2022-05-19 22:31:46 +08:00
谁给老子写优雅那种我就炒掉谁,我们这写的不是底层代码。
Danswerme
2022-05-19 22:53:57 +08:00
对于普通的程序员来说写这么有“品味”的代码是在折磨自己和队友,大佬当然无所谓。
xfriday
2022-05-19 23:01:37 +08:00
@zhengxiaowai 第二种可读性比第一种好多了,真不知道你的 “第一种比第二种好一百倍” 结论哪里来的
xfriday
2022-05-19 23:02:51 +08:00
@loading 你是老板?我看你在大厂里只有被优化的份
masterclock
2022-05-19 23:08:08 +08:00
优雅啥的不管,即使是单句的代码块,我也喜欢加 {}
但,看、写内核代码,都是没有 {} 的,难受啊
enchilada2020
2022-05-19 23:14:56 +08:00
吵这种事情没有意义 对语言的掌握程度不同 对代码可读性与优雅的理解也不同 对于大部份人来说难以阅读不好理解的写法 可能对于某些特别擅长该语言的使用者来说是常规操作

不用说 Linus 这种级别的怪物 不理解的可以可以去 LC 上看看 Stefan 的代码 他的所有题解中所有语言的写法都非常巧妙
L4Linux
2022-05-19 23:15:05 +08:00
说这是利用指针特性其实不准确。这其实是对重复的过程,在这里是修改某一指针的指向,进行一般化。

一般来说应该鼓励这么写。
adoal
2022-05-19 23:20:06 +08:00
Linus 这种写法的妙处不在于代码量少了多少。行数少不一定是好代码。关键在于,通过使用指针的指针,把需要修改->head 和 prev->next 的情况统一起来,不需要给边界情况 l->head 单独写一个分支来修改,把特殊情况化为一般情况,一致性好,实际上代码(因为边界情况考虑不周而)出错的概率更小了。
PMR
2022-05-19 23:25:43 +08:00
各有各有点 协同开发要看接头人的能力

在寸土寸金的编程 垦定要上第二种

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/854016

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX