这些编程范式之间的区别是什么,它们是否更适合于特定的问题,或者是否有任何用例偏爱其中一种?
非常感谢架构示例!
这些编程范式之间的区别是什么,它们是否更适合于特定的问题,或者是否有任何用例偏爱其中一种?
非常感谢架构示例!
当前回答
我认为现在可用的库、工具、示例和社区完全胜过了范式。例如,ML(或其他)可能是最终的通用编程语言,但如果你不能为你正在做的事情获得任何好的库,你就完蛋了。
例如,如果你正在制作一款电子游戏,c++中有更多好的代码示例和sdk,所以你可能会更好地使用它。对于一个小型的web应用程序,有一些很棒的Python、PHP和Ruby框架可以让你快速启动和运行。对于大型项目来说,Java是一个很好的选择,因为它有编译时检查以及企业库和平台。
过去的情况是,不同语言的标准库都很小,很容易复制——C、c++、Assembler、ML、LISP等等。有了基础,但当涉及到网络通信、加密、图形、数据文件格式(包括XML)等标准化时,它往往会退缩,甚至像平衡树和哈希表这样的基本数据结构也被遗漏了!
像Python、PHP、Ruby和Java这样的现代语言现在都提供了更体面的标准库,并且有许多可以轻松使用的优秀第三方库,这在很大程度上要感谢它们采用了名称空间来防止库之间发生冲突,并采用了垃圾收集来标准化库的内存管理方案。
其他回答
我认为它们通常不是“相对”的,但你可以把它们结合起来。我还认为,你经常提到的词语只是流行语。很少有人真正知道“面向对象”是什么意思,即使他们是它最狂热的传播者。
它们都有各自的优点——它们只是解决相同问题的不同方法。
在纯过程式风格中,数据往往与操作它的函数高度解耦。
在面向对象的风格中,数据往往带有一组函数。
在函数式风格中,数据和函数往往彼此有更多的共同点(如在Lisp和Scheme中),同时在函数的实际使用方面提供更大的灵活性。算法也倾向于根据递归和组合来定义,而不是循环和迭代。
当然,语言本身只影响首选哪种风格。即使在像Haskell这样的纯函数式语言中,您也可以使用过程式风格(尽管这是非常不鼓励的),即使在像C这样的过程式语言中,您也可以使用面向对象的风格进行编程(例如在GTK+和EFL api中)。
To be clear, the "advantage" of each paradigm is simply in the modeling of your algorithms and data structures. If, for example, your algorithm involves lists and trees, a functional algorithm may be the most sensible. Or, if, for example, your data is highly structured, it may make more sense to compose it as objects if that is the native paradigm of your language - or, it could just as easily be written as a functional abstraction of monads, which is the native paradigm of languages like Haskell or ML.
您使用的选择只是对您的项目和您的语言支持的抽象更有意义。
对于GUI,我想说面向对象范式非常适合。窗口是一个对象,文本框是对象,ok按钮也是对象。另一方面,像字符串处理这样的东西可以用更少的开销完成,因此用简单的过程范式更直接。
我也不认为这是语言的问题。你可以用几乎任何流行的语言编写函数式的、过程式的或面向对象的,尽管在某些语言中可能需要额外的努力。
这些范式并不一定是相互排斥的。如果你看python,它支持函数和类,但同时,所有东西都是对象,包括函数。你可以在一段代码中混合和匹配函数式/oop/过程式风格。
我的意思是,在函数式语言中(至少在Haskell中,这是我唯一学习过的语言)没有语句!函数中只允许有一个表达式!!但是,函数是一等公民,你可以把它们作为参数传递,还有其他一些能力。他们可以用很少的代码做强大的事情。
而在像C这样的过程式语言中,传递函数的唯一方法是使用函数指针,仅靠这一点并不能完成许多功能强大的任务。
在python中,函数是一级公民,但它可以包含任意数量的语句。所以你可以有一个包含过程代码的函数,但你可以像函数式语言一样传递它。
OOP也是如此。像Java这样的语言不允许在类之外编写过程/函数。传递函数的唯一方法是将它包装在实现该函数的对象中,然后传递该对象。
在Python中,你没有这个限制。
我认为现在可用的库、工具、示例和社区完全胜过了范式。例如,ML(或其他)可能是最终的通用编程语言,但如果你不能为你正在做的事情获得任何好的库,你就完蛋了。
例如,如果你正在制作一款电子游戏,c++中有更多好的代码示例和sdk,所以你可能会更好地使用它。对于一个小型的web应用程序,有一些很棒的Python、PHP和Ruby框架可以让你快速启动和运行。对于大型项目来说,Java是一个很好的选择,因为它有编译时检查以及企业库和平台。
过去的情况是,不同语言的标准库都很小,很容易复制——C、c++、Assembler、ML、LISP等等。有了基础,但当涉及到网络通信、加密、图形、数据文件格式(包括XML)等标准化时,它往往会退缩,甚至像平衡树和哈希表这样的基本数据结构也被遗漏了!
像Python、PHP、Ruby和Java这样的现代语言现在都提供了更体面的标准库,并且有许多可以轻松使用的优秀第三方库,这在很大程度上要感谢它们采用了名称空间来防止库之间发生冲突,并采用了垃圾收集来标准化库的内存管理方案。