这些编程范式之间有什么区别,它们是否更适合特定问题,或者某些使用情况是否偏好其中任何一种?
欢迎提供架构示例!
这些编程范式之间有什么区别,它们是否更适合特定问题,或者某些使用情况是否偏好其中任何一种?
欢迎提供架构示例!
它们各有优点-它们只是解决同样问题的不同方法。
在纯过程式编程风格中,数据往往与操作它的函数高度解耦。
在面向对象编程风格中,数据往往伴随着一系列函数。
在函数式编程风格中,数据和函数倾向于彼此更相似(如Lisp和Scheme),同时在实际使用函数方面提供更大的灵活性。算法也往往是基于递归和组合定义的,而不是基于循环和迭代。
当然,编程语言本身只影响了哪种风格更受欢迎。即使在像Haskell这样的纯函数式编程语言中,您也可以采用过程式编程风格(尽管这是不被鼓励的),即使在像C这样的过程式编程语言中,您也可以采用面向对象编程风格(例如,在GTK +和EFL API中)。
需要明确的是,每种范式的“优势”仅在于算法和数据结构的建模。例如,如果您的算法涉及列表和树,函数式算法可能是最明智的选择。或者,如果您的数据高度结构化,则将其组合为对象可能更有意义,如果这是您的语言的本地范式-或者,它同样可以作为monad的函数式抽象来编写,这是Haskell或ML等语言的本地范式。
您使用哪种方法只是取决于您的项目和语言所支持的抽象。
我认为现在可用的库、工具、示例和社区完全超越了范式。例如,ML(或其他)可能是终极通用编程语言,但如果你不能获得任何适合你所做的事情的好库,那么你就会失败。
例如,如果你正在制作一个视频游戏,C++中有更多好的代码示例和SDK,所以你最好选择它。对于小型Web应用程序,有一些很棒的Python、PHP和Ruby框架可以让你快速上手。Java是大型项目的不错选择,因为它具有编译时检查和企业库和平台。
过去,不同语言的标准库相当小且容易复制 - C、C++、汇编语言、ML、LISP等都带有基础知识,但在标准化网络通信、加密、图形、数据文件格式(包括XML)甚至基本数据结构如平衡树和哈希表等方面,它们往往退缩!
现代编程语言如Python、PHP、Ruby和Java现在都配备了更好的标准库,并且有许多优秀的第三方库可以轻松使用,这在很大程度上要归功于它们采用命名空间来避免库之间的冲突,以及垃圾回收机制来规范库的内存管理方案。
这些编程范式不一定是相互排斥的。以Python为例,它支持函数和类,但同时一切都是对象,包括函数。你可以在一段代码中混合使用函数式、面向对象或过程式风格。
我的意思是,在函数式语言中(至少在我学习的Haskell语言中),没有语句!函数只允许其中有一个表达式!!但是,函数是一等公民,可以像其他能力一样将它们作为参数传递。他们可以用少量的代码实现强大的事情。
而在过程式语言如C中,你只能通过使用函数指针来传递函数,但仅此一项并不能实现许多强大的任务。
在Python中,函数是一等公民,但它可以包含任意数量的语句。因此,你可以有一个包含过程式代码的函数,但你可以像函数式语言一样传递它。
面向对象也是如此。像Java这样的语言不允许你在类之外编写过程/函数。将函数传递的唯一方法是将其封装在实现该函数的对象中,然后将该对象传递。
但在Python中,你没有这个限制。
对于GUI,我认为面向对象的范例非常适合。窗口是一个对象,文本框是对象,确定按钮也是一个对象。另一方面,像字符串处理这样的东西可以用简单的过程性范例完成,因此开销更小,更直接。
我不认为这是语言的问题。你几乎可以在任何流行的语言中编写函数式的、过程式的或面向对象的代码,虽然在某些语言中可能需要额外的努力。
我认为它们通常不是“相对立”的,而是可以结合起来使用。我也认为,很多时候,你提到的这些词只是流行语。即使是最狂热的支持者,也很少有人真正知道“面向对象”是什么意思。
我的一个朋友正在使用NVIDIA CUDA编写图形应用程序。该应用程序非常适合面向对象编程范式,并且问题可以被很好地分解为模块。然而,要使用CUDA,您需要使用不支持继承的C语言。因此,您需要聪明一些。
a)您可以设计一个巧妙的系统,在某种程度上模拟继承。这是可以做到的!
i)您可以使用钩子系统,该系统期望每个父类P的子类C都具有对函数F的某种覆盖。您可以让子类注册其覆盖,这些覆盖将被存储并在需要时调用。
ii)您可以使用结构体内存对齐功能将子类转换为父类。
这可能很整洁,但是要想出一个具有未来性和可靠性的解决方案并不容易。你将花费大量时间设计系统,并且不能保证在项目进行到一半时不会遇到问题。如果要实现多重继承,甚至更难,几乎是不可能的。
b) 你可以使用一致的命名策略和分而治之的方法来创建程序。它不会有任何继承,但由于你的函数小巧、易于理解且格式一致,所以你不需要它。你需要编写的代码量会增加,很难保持专注,不陷入简单的解决方案(hack)中。然而,这种忍者式的编码方式是C语言的编码方式。在低级自由和编写良好代码之间保持平衡的好方法是使用函数式语言编写原型。例如,Haskell非常适合原型算法。
我倾向于b方法。我使用a方法编写了一个可能的解决方案,说实话,使用那段代码感觉非常不自然。