C++是一种可怕的语言

关键点就是indirect 这个指针第一次指向的是 head
的地址,第二次指向的是节点1.next的地址,
第三次指向的是节点2.next的地址。

优雅的代码不仅仅是格式规范,命名良好,更重要的是思维方式和抽象层次,以及由此带来的良好的设计。

indirect = &((*indirect)->next);

// Walk the list, looking for the thing that

图片 1

TED上对Linus 的一段访谈视频“The mind behind Linux” 给出了一点线索。

他喷别人的Pull Request : Your code is shit …..

while (walk != entry){

他曾经说Intel提交的漏洞修复程序是彻底的垃圾!

图片 2

walk = walk -> next;

*indirect = entry -> next;

prev = NULL;

另外,这段代码还考虑到了一个特殊情况, 待删除的节点不是中间节点,
而是头节点。
即使有这个特殊的情况,这段代码还是相当容易理解的,绝大部分人都会写出这样的代码,学校的老师也会这么教我们。

// *address* of the thing we’ll update

Linus
Torvalds的“暴脾气”是出了名的,看到令自己不爽的事情就会怼过去,比如:

// .. and just remove it

while ((*indirect) != entry){

head = entry->next;

(这段代码没有考虑待删除的节点不在链表中的情况。)

// The “indirect” pointer points to the

// poins to the entry we want to remove_list_entry

我看到这段代码的第一印象就是很简洁, 根本没有if else,
不管你删除的是头结点还是中间节点,都可以用同样的逻辑来表达。

甚至直接对着摄像机说了一句“So NVIDIA, Fxxk you.”同时给了一个中指。

这两段代码只是很简单的例子,它们甚至不完美,
但我理解Linus所说的意思,它给我们的启示是:在写代码的时候,要努力地从更高的层次去思考问题,找到更抽象,更通用的解决方案,而不是简单地对各种情况写满if
else, 那样的代码,难以理解,难以维护。

if

当别人说Git没用C++开发的时候, 他反击说“C++是一种可怕的语言”

学过数据结构的同学(即使你没学过C语言中的指针),估计也能明白这段代码的大致意思:
这是在删除一个单向链表中的某个节点。

prev = walk;

}

}

由于是单向链表,在寻找某个节点的时候,需要不断地记录下这个节点前面的节点

// Walk the list

Linus对比了这两段代码以后说道:

我是有点好奇,领导着世界上最大的开源项目,Linus欣赏谁,尊重谁,喜欢和谁一起共事?

我本来也想用图来表达一下,但是发现画出这个indirect的变化过程有点麻烦,大家充分发挥下想象力,自行脑补一下吧。

在这段访谈中展示了两段完成同样功能的代码,
第一段是这样的:remove_list_entry{

他吐槽XML可能是有史以来最糟糕的格式……

}

walk = head;

然后Linus给出了另外一段代码,完成了同样的功能。remove_list_entry{

(ps. Linus
不喜欢在公众面前演讲,如果非要参加一些活动的话,他更喜欢和主持人一对一地对话,这会让他感觉到舒服)

但是这段代码使用了指针的指针,我看了一会儿才明白到底是怎么工作的。
一旦理解以后,就发现,这确实是个更优雅的方法。 消除了if else,
消除了previous。

// Remove the entry by updating the

prev->next = entry->next;

第一段代码并不好, 它需要区别第一个节点和中间节点,有特例。

第二段代码展示了用一种不同的方式来看待一个问题,它可以把一个特例当成正常情况来处理,这就是好的代码。

好的代码“品味”
能够让你从更大的范围来看待问题,本能地知道怎么才能把事情做对,做好。

indirect = &head;

else

我就喜欢和这样的人一起工作,他们有着更好的代码的“品味”。

有人说这是天才的个性,但是这种性格确实是得罪了不少人,去年9月份,他发邮件做了一个反省,说自己也许要照照镜子,为自己的人身攻击言论道歉。

// head or the previous entry

}

Copyright @ 2015-2020 js金沙 版权所有
网站地图xml地图