罗伯特·马丁(Robert Martin)所说的“只有功能才能从早期的编程时代生存下来,而不是例行公事”是什么意思[已关闭]

What does Robert Martin mean by “Only function survive from early programming days, not routine” [closed]

提问人:Andy Lin 提问时间:10/13/2019 最后编辑:Andy Lin 更新时间:10/17/2019 访问量:215

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

4年前关闭。

摘自 Robert Martin 撰写的《Clean Code》一书:

在编程的早期,我们编写了例程系统 和子例程。然后,在 Fortran 和 PL/1 时代,我们组成了我们的 程序、子程序和函数系统。如今,只有 功能从早期就幸存下来。

在我看来,这段摘录是在告诉人们,例行公事是一件坏事,并且正在走出编程时代。

我做了一些搜索,发现 Fortran 中的子程序和函数之间的区别是:

  • 子例程对输入变量执行一些操作,并作为 调用子例程的结果,输入变量被修改。
  • 函数将一个或多个参数作为输入,并返回单个 产值。

虽然我没有写 Fortran 而只写了 C,但 C 支持与 和 相同的结构。int foo(int x)void foo(int* x)

引起我注意的是,我从未听说过 C 语言中的不良约定,所以我想弄清楚 Robert Martin 的这段摘录是什么意思。void foo(int* x)

还有一个问题。从 OOP 的角度来看,如果我想用 C 语言模拟 OOP,例程比函数更好吗?

OOP 语言不可知论 设计 范式 语言历史

评论

0赞 Joachim Isaksson 10/13/2019
试想一下,从长远来看,当代码变大时,什么更容易理解,一个保证无法更改的函数,或者一个很可能将 x 增加 1 的例程,而唯一知道的方法是点击文档?check(x)xcheck(x)
0赞 Vladimir F Героям слава 10/13/2019
@JoachimIsaksson 好吧,这并不能真正解释 C 和 C++ 中的许多函数,它们要么只返回状态代码,要么是函数。void
2赞 Vladimir F Героям слава 10/13/2019
我真的建议每篇文章问一个问题,并尽可能避免基于意见的问题。我会认真考虑一些姊妹网站作为更好的场所。其次,您可能应该询问其他语言标签的人。使用 Fortran 的人对子程序很好。想想你用来吸引合适人选的标签。
0赞 Andy Lin 10/14/2019
@VladimirF 感谢您的推荐。请问我可以去哪个姊妹网站?
4赞 Vladimir F Героям слава 10/14/2019
查看 softwareengineering.stackexchange.com 的主题。如果你在那里问,最好删除这个。还有计算机科学堆栈交换,但那里可能偏离主题,请查看他们的描述。

答:

1赞 Vladimir F Героям слава 10/13/2019 #1

一旦你允许函数不返回任何内容或丢弃函数结果,拥有单独的语言结构基本上是多余的。C 或 C++ 函数实际上就像一个子例程,它看起来就像一个函数并使用相同的关键字。因此,您节省了一个关键字的需要,并且语言更加统一。C是当今实践中使用的大多数语言语法的起源。void

评论

0赞 francescalus 10/13/2019
虽然我同意删除关键字在这里是一种效果,但在某种程度上,在纯函数式语言之外,对“子程序是一个没有结果的函数”的简化导致了其他地方的相应复杂性。例如,在 Fortran 术语中,“函数引用是主要函数”应改为“对返回结果的函数的引用是主要函数”或“不返回结果的函数只能用作独立语句”。call
0赞 Vladimir F Героям слава 10/13/2019
我认为关键字只是 Fortran 源代码形式语法规则为消除歧义而必需的工件。另外,我真的不是在添加 Fortran,而是在添加 C 系列语言。call