Google 的 go 语言是不是解决了 Paul 的 Graham 的帖子“为啥 Arc 不是特别面向对象”中的问题?

Posted

技术标签:

【中文标题】Google 的 go 语言是不是解决了 Paul 的 Graham 的帖子“为啥 Arc 不是特别面向对象”中的问题?【英文标题】:Does Google's go-language address the problems in Paul's Graham's post 'Why Arc isn't Especially Object Oriented'?Google 的 go 语言是否解决了 Paul 的 Graham 的帖子“为什么 Arc 不是特别面向对象”中的问题? 【发布时间】:2010-12-15 09:37:08 【问题描述】:

Google 的 Golang 是否解决了 Paul 的 Graham 的帖子“Why Arc isn't Especially Object Oriented”中提到的语言问题?

【问题讨论】:

什么问题?那篇文章讨论的是过度使用庞大的面向对象设计的问题,而不是语言的问题。 @mquander:这个帖子实际上是关于虚假优势而不是问题。 【参考方案1】:

我对此的最初感觉是“现在说还为时过早”

1)如果你有一个面向对象的编程是令人兴奋的 没有静态类型的语言 词法闭包或宏。对一些 学位,它提供了解决这些问题的方法 限制。 (见 Greenspun 的第十 规则。)

Go 支持函数字面量(请参阅 docs),如果我没看错的话,您可以将函数作为参数传递,无论是在别处定义的还是临时创建的。

2) 面向对象的编程在大公司中很流行,因为它 适合他们编写软件的方式。在 大公司,软件往往是 由大写的(并且经常 变化)平庸的团队 程序员。面向对象 编程强加了一个纪律 这些程序员可以防止任何 其中一个做得太多 损害。价格是 结果代码臃肿 协议和充满重复。 这对大牌来说价格不算太高 公司,因为他们的软件是 可能会变得臃肿而饱满 无论如何都要重复。

这一点远非主观回答。

3) 面向对象的编程产生了很多看起来像的东西 工作。回到风靡一时的时代, 有一种程序员 只会放五到十行 页面上的代码,前面有 20 精心格式化的行 厘米。面向对象编程 对这些人来说就像裂缝:它 让您将所有这些结合起来 脚手架直接进入您的源代码 代码。 Lisp 黑客的一些东西 可以通过将符号推到 一个列表变成了一个完整的类文件 和方法。所以它是一个很好的工具,如果 你想说服自己,或者 别人,你做了很多 工作。

由于 Go 不是真正的面向对象语言,因此您可能可以用任何您喜欢的方式来解决问题。

4) 如果一门语言本身就是一个面向对象的程序,它可以是 由用户扩展。也许会。要么 也许你可以做得更好 提供子概念 面向对象编程 点菜。例如,重载是 本质上与类无关。 我们拭目以待。

Go 似乎对对象有一种有趣的方法,您无需担心/开发大型对象树。看起来语言中存在这些工具,可以以面向对象的方式构建数据,而不会将您锁定在纯面向对象的环境中。

5) 面向对象的抽象巧妙地映射到某些领域 特定类型的程序,例如 模拟和 CAD 系统。

...

【讨论】:

Go 支持一等和高阶函数,这很酷。此外,它还支持 MLs/Haskell/Racket 的类型转换。我个人喜欢 Go 的一点是,虽然其中有一些成语,但设计师似乎明白不同的情况需要不同的工具——这与 Graham 不同。不要误会我的意思,格雷厄姆很棒。只是关于编程习语的争论最终是徒劳的:它归结为有偏见的工匠之间关于工具的争论,或者有偏见的语言哲学家之间关于思维过程的争论。【参考方案2】:

Paul 有一些有趣的观点,总的来说,我读过很多他的思考。在这个问题上,我们不同意。他是一个口齿不清的疯子,一个蹩脚的程序疯子。他似乎将难以理解的程序当成伟大程序员的作品。是的,我意识到它比这更微妙,但归根结底就是这样。归根结底,您的代码要么易于使用,要么不易于使用。一些程序员,Paul 认为很棒的程序员,将能够忍受比其他人更多的废话,并且仍然能够对代码的意图做出正面或反面。这是一种技能,但肯定不是优秀程序员需要的唯一技能。

说到 Arc,它很糟糕,除非我弄错了,否则即使 Lisp 社区的人也这么认为——我的意思是,即使是聪明的人也会犯错。

再次强调,Paul 是个聪明人,但他在这件作品中的整个做法似乎不合时宜。

【讨论】:

【参考方案3】:

等等,Go 真的是面向对象的吗?在这方面似乎完全不可知论。您可以在 Go 中使用 OOP 或 FP 或命令式编程。我的意思是,prolog 风格的“编程”会有点牵强,但除此之外......

事实上,我认为 Go 在这方面类似于 scala:存在一些对象范式,但也存在 lambda 和类型转换。

【讨论】:

Go 是面向对象的。它使用通用调度方法来面向对象,Common Lisp 和 Dylan 也是如此。

以上是关于Google 的 go 语言是不是解决了 Paul 的 Graham 的帖子“为啥 Arc 不是特别面向对象”中的问题?的主要内容,如果未能解决你的问题,请参考以下文章

网友:Go 你是 Google 的,Go:我不是。

干货 | Google Go语言入门科普

Go 语言技术大佬们在 Twitter 上打起了口水战

Go语言 go get 找不到 google.golang.org/protobuf/encoding/prototext 解决办法

开启go 05.Go语言和其他语言的对比

Go语言和Javapython等其他语言的对比分析