面向对象与函数式编程的区别: 动词-名词与名词-动词的区别 - simblob


我的主要主题是研究如何将函数性编程语言和面向对象的编程语言结合在一起。我当时注意到的是,函数语言的语法倾向于动词,然后是名词,如f(x),而面向对象语言的语法倾向于是名词,然后是动词,如:x.f()。在某种程度上,这些可以被认为是等效的。您可以用一种表达等同于另一种表达。不过,两者在可用性存在很大差异,这种可用性表现在:自动完成。

f(x)自动完成
首先,我们需要知道f在这种情况下有效的所有可能。由于程序员刚开始输入表达式,因此任何函数都是有效的,这意味着有很长的列表可供选择。需要多次击键才能选择一个。其次,我们需要知道x在这种情况下有效的所有可能。这些通常是本地名称,因此没有那么多。知道f缩小类型会缩小列表的范围,但是列表已经很小,因此收获不多。

x.f()自动完成
首先,我们需要知道一切可能x。程序员刚刚开始输入内容,因此任何本地名称均有效,但数量不多。仅键入一个字符可以将列表缩小到一两个元素。其次,我们需要知道f在这种情况下有效的所有可能。这些是根据的类型定义的方法x,因此与所有可能的函数相比,没有那么多的方法。知道x缩小类型会大大缩小列表的范围,因此有很多收获。

这两种语法在理论上似乎是等效的,但实际上却不是。我想知道使用常规文本编辑器的人是否最终会相信这两种语法是等同的,而使用IDE的人更喜欢面向对象的语法,即使他们没有利用面向对象的编程(继承,子类型化等)。 )。

这种不对称与您使用函数式编程还是面向对象的编程正交。对于程序员来说,如果他们可以从两个中等长度的列表中进行选择,则比必须从一个非常长的列表中进行选择更好。
您也可以在其他情况下看到这一点。DOS,VMS和Unix Shell等命令行界面通常先指定一个动词,然后再指定一个或多个名词。Mac和Windows之类的GUI通常首先通过单击图标来指定名词,然后通过从右键单击菜单中进行选择来指定动词。
在文本编辑器中,vim的命令d0是动词,然后是文本选择(名词),而在更传统的文本编辑器(包括Emacs)中,您首先要选择一些文本(名词),然后调用动词,例如delete。Kakoune是使用名词动词而不是动词名词的模态编辑器。
在游戏中,玩家最好先从环境中选择一个对象,然后从少量动作中进行选择,而不是先从大量动作中进行选择,然后再从一组对象中进行选择。但是,我没有调查足够多的游戏来了解更常见的游戏。下次玩游戏时,请查看命令的结构,看它是动词名词还是名词动词。