OOP与function编程vs程序
这些编程范例之间有什么区别,它们更适合于特定的问题还是更适合于某些特定的问题,
架构示例表示赞赏
他们都以自己的方式很好 – 对于同样的问题,他们只是不同的方法。
在纯粹的程序风格中,数据往往与其上运行的函数高度分离。
在面向对象的风格中,数据往往带有一系列的function。
在function风格上,数据和function倾向于具有更多的共同点(如Lisp和Scheme),同时在实际使用function方面提供更多的灵活性。 algorithm也倾向于用recursion和组合来定义,而不是循环和迭代。
当然,语言本身只影响哪种风格是首选。 即使在像Haskell这样的纯函数语言中,也可以用程序化的风格来编写(虽然这是非常令人沮丧的),甚至在像C这样的过程化语言中,也可以用面向对象的风格编程(比如在GTK +和EFL API)。
要清楚的是,每个范例的“优势”仅仅是在algorithm和数据结构的build模中。 例如,如果您的algorithm涉及到列表和树,那么functionalgorithm可能是最明智的。 或者,例如,如果您的数据是高度结构化的,那么如果这是您的语言的本地范式,则将它组合为对象可能更有意义 – 或者,它可以简单地写成单声道的function抽象是Haskell或ML等语言的本地范例。
你select哪一个只是让你的项目和你的语言支持的抽象更有意义。
我认为现在可用的库,工具,例子和社区完全胜过了这个范例。 例如,ML(或其他)可能是最终的多用途编程语言,但是如果你不能为你正在做的事情获得任何好的库,那么你就被搞砸了。
例如,如果你正在制作一个video游戏,那么在C ++中有更好的代码示例和SDK,所以你可能会更好。 对于一个小型的Web应用程序来说,有一些很棒的Python,PHP和Ruby框架可以让你快速运行。 由于编译时检查和企业库和平台的原因,Java对于大型项目来说是一个很好的select。
过去的情况是,不同语言的标准库非常小,容易复制 – C,C ++,Assembler,ML,LISP等等都是基础的,但是在标准化像networking通信,encryption,graphics,数据文件格式(包括XML),甚至像平衡树和散列表这样的基本数据结构都被忽略了!
像Python,PHP,Ruby和Java这样的现代语言现在带有一个更加体面的标准库,并且有许多很好的第三方库可以很容易地使用,这主要归功于它们采用命名空间来防止库相互冲突,和垃圾回收来标准化库的内存pipe理scheme。
这些范例不一定是相互排斥的。 如果你看python,它支持函数和类,但同时,一切都是一个对象,包括函数。 你可以在一个代码中混合使用function/操作/程序风格。
我的意思是,在函数式语言(至less在哈斯克尔,我研究的唯一一个)没有任何陈述! function只允许一个expression式里面! 但是,function是一stream的公民,你可以把它们作为parameter passing,还有其他一些function。 他们可以用几行代码做强大的事情。
在像C这样的过程语言中,只能通过函数指针传递函数的唯一方法就是使用函数指针,而这并不能启用许多强大的任务。
在python中,函数是一等公民,但是可以包含任意数量的语句。 所以你可以有一个包含程序代码的函数,但是你可以像函数式语言一样传递它。
OOP也一样。 像Java这样的语言不允许你在一个类之外写程序/函数。 传递函数的唯一方法是将其包装在实现该函数的对象中,然后传递该对象。
在Python中,你没有这个限制。
对于GUI来说,我认为面向对象的范式非常适合。 窗口是一个对象,文本框是对象,而好的button也是一个对象。 另一方面,像string处理这样的东西可以用less得多的开销来完成,因此用简单的程序范例更简单。
我不认为这是一个语言的问题。 你可以用几乎任何stream行的语言编写function性,程序性或面向对象的语言,尽pipe在某些方面可能会有一些额外的努力。
为了回答你的问题,我们需要两个要素:
- 了解不同的架构风格/模式的特点。
- 了解不同编程范式的特点。
Wikipeida上的软件体系结构文章中列出了软件体系结构样式/模式列表。 你可以在网上很容易地研究它们。
总而言之,程序对于遵循程序的模型是有利的,OOP对于devise是有利的,而function对于高级编程是有利的。
我想你应该尝试阅读每个范式的历史,看看为什么人们创造它,你可以很容易地理解它们。
在了解它们之后,您可以将体系结构样式/模式的项目链接到编程范例。
我认为他们往往不是“对”,但你可以把它们结合起来。 我也经常想到,你提到的这些词只是stream行语。 很less有人知道“面向对象”是什么意思,即使他们是最强烈的传道者。
我的一个朋友正在使用NVIDIA CUDA编写graphics应用程序。 应用程序非常适合OOP范例,问题可以整齐地分解成模块。 但是,要使用CUDA,您需要使用不支持inheritance的 C语言。 所以,你需要聪明。
a)你devise一个聪明的系统,在一定程度上仿效inheritance。 可以办到!
i)你可以使用钩子系统 ,它希望父母P的每个孩子C都有一个特定的覆盖函数F.你可以让孩子注册他们的覆盖,这些覆盖将在需要时被存储和调用。
ii)您可以使用结构内存alignmentfunction将子项投入父项。
这可以是简洁的,但要想出面向未来的可靠解决scheme并不容易。 您将花费大量的时间来devise系统,并不能保证您不会在项目中途遇到问题。 实现多重inheritance更加困难,即使不是几乎不可能。
b)您可以使用一致的命名策略,并使用分而治之的方法来创build一个程序。 它不会有任何inheritance,但是因为你的function很小,易于理解和格式一致,你不需要它。 你需要编写的代码数量增加,很难保持专注,不会屈服于简单的解决scheme(黑客)。 然而,这种忍者的编码方式是C编码方式。 保持低层次的自由和编写好的代码之间的平衡。 实现这一目的的好方法是用function语言编写原型。 例如, Haskell对原型algorithm非常有用。
我倾向于方法b。 我用方法a写了一个可能的解决scheme,我会诚实的说,使用这个代码感觉非常不自然。