面向对象的认识论基础与对其的编程方法论的分析

说一切都是对象是错误的。首先,对象表明的是认识的“对象”。因此任何与认识“过程”相关的东西,都不是对象。好比研究,学习,坐车,失败,,,,人类语言的能力是极其强大的,其所涵盖的领域超出任何人的想象。因此任何简单地说一切都是什么的想法,都值得一一斟酌!程序员

对象自己其实只是做为“认识”的对象而提出来的。对象在英语中即客观,是惟物主义的基础。也就是说,一切认识都是从“对象”开始的(这可能就是“一切都是对象”的说法的来源)。一切认识都是从对象开始的并不意味着一切都是认识。由于显然在人的生活中有些东西不是认识或不能被归为认识的领域,或者说,到底什么才是“认识”呢?无论答案是什么,能够确定的是它确定最终仍然包含有必定的边界。它并不涵盖一切。至于它的边界到底在哪里先放一边,由于如今要作的并非讨论哲学。编程

如今的论域是编程方法。函数式编程

面向过程与面向逻辑或面向任何其它东西的编程方法都基于必定的假设。面向过程假设一切都是过程。面向逻辑则假设一切都是逻辑。这里的“一切都是”意指能够被最终分解成。因此当说“一切都是过程时”,说的实际上是:一切均可以最终分解成过程。而对应到构建过程,就意味着“从过程开始”。对于一切都是逻辑,则意味着一切均可以或是从逻辑开始的。也就是说,从过程或逻辑,能够开始一切。这是它们的构建逻辑。函数

从过程或逻辑开始的构建过程,天然隐含着认为一切都是逻辑或过程的认识论基础。一门语言可能同时提供多种构建手段,但那与编程方法不要紧。有关系的是真正指导编程过程的思想是什么。语言特性固然matters,甚至在不少时候天然而然地将人引入了某种编程方法论。但这是语言与编程方法之间的适配度问题。跟对编程方法的讨论仍然没有任何关系。由于只要你使用了某种编程方法,你天然就不得不接受使用此种编程方法所能获得的一切。不论是好的仍是坏的。工具

因此问题是,从逻辑或过程开始,是一种最好的构建过程吗?学习

这个能够从现实生活中找到答案。由于现实生活的覆盖面其实很广,而且编程的问题域正好“对应”整个现实生活。因此分析一种方法是否构建的最佳手段,其关键就在于在现实生活中,它是否适应面最广的或最好的方法?编码

先分析逻辑。因此问题就是:在现实生活中,咱们能够从逻辑开始构建一切吗?显然不。不少东西都显然跟逻辑没有任何关系。好比感受:“疼痛”要怎么跟逻辑扯上关系呢?高兴呢,激动呢。任何情绪都没有办法跟逻辑扯上关系。对不少现象的描述也没有办法跟逻辑扯上关系。事实上,逻辑的应用面其实很窄。这可能正是逻辑编程没有被普遍应用的缘由。由于逻辑并非一种被普遍应用的知识或工具。spa

而后分析过程。问题变成:在现实生活中,能够从过程开始构建一切吗?显然不。一个答案就是对象。或者逻辑(其实只要把几个概念在内部对比一下就已经能够发现对象是最好的方案。由于对象能够用来表达逻辑,也能够用来表达过程。面向对象最伟大的地方是为编程方法引入了主语的形式化表达)。视频

对象如此方便,是由于它原本就是人类认识论的基础。一切认识都从对象开始。而一切(惟物主义)知识都是从认识的基础上发展起来的。若是没有认识,恐怕任何表达都会变得困难。从对象开始,解决了一切认识的问题。而认识又解决了绝大部分人类知识的描述问题。因此对象能够解决绝大部分知识的描述问题。而一旦解决了描述问题,基本上咱们就解决掉了编程的大部分问题。由于编程的目的在大部分时候并非为了求解新知识,而只是为了利用人类已知的知识去信息化或自动化一些过程。甚至自动化自己也能够用来解决一些求解问题。对象

对象的另外一个好处是它是客观的。相对于面向过程或面向逻辑的编程方法中将一切都抽象成过程或逻辑的与事实不符,缘由是一旦你开始进行非第一层(即高于第一层。如过程,逻辑)的抽象(对象---对象并不意味着物理存在。对象意味着认识或知识表达的起点),就离开了认识的基础。而离开了认识的基础,描述的困难天然就跟着上来了。由于从最基础的认识出发向上抽象,过程与逻辑并非所有的路径。从最基础的认识即对象出发,被抽象出的概念种类繁多,其中的绝大部分都不是过程与逻辑可能描述的。由于过程与逻辑根本就不位于那些概念的构建路径上。面向对象固然也不能帮助构建这些概念,可是它经过往下退一层,使得构建这些概念成为可能,为程序员提供了一个描述空间。程序员从对象出发能够构建任何东西,包括过程,也包括逻辑。这就是为何如今有些原本彻底是面向对象的语言同时还能够被用来进行面向过程的编程的缘由。实际上,我以为这多是如今的面向对象的语言最普遍的应用------这也解释了面向过程的编程方法曾经而且正在那么/如此流行的缘由------在大部分时候,咱们并不须要面向对象。面向过程能够用很简单的方法解决大部分没有可进化性需求问题。实际上,在面向对象的语言中进行面向过程的编程正是面向对象方法极其强大的正面证据(好比,使用一个对象做为函数的承载者来实现函数式编程)。

 

有一句很是生活化的话:退一步海阔天空。 这句话极大地描述面向对象做为一种编程方法的价值。

另外,在网上看到搜索编程方法论时发现前面几页结果所有是斯坦福的编程方法论课程视频。这个视频几乎从一开始就直接切入编码方法。这是不对的。事实上,这正是不少人编程多年未得“升华”的根本缘由:编程领域历来就没有出现过任何真正的理论。历来没有人真正研究过如何编码,由于它实在太“容易”了。

但事实却远非如此。由于Programming实际上是一个涉及知识很是宽泛的领域,好比形式语言学、形式语义学、编程范式、硬件特性、协做模式、系统工程学、产品学等多个领域。何况这些还只是我如今能列出来的东西,并非所有。由于找不到相关的理论我只能凭本身的想象象征性地列一下而已------可是这些绝对是做为一个好程序员必需要研究的东西。而斯坦福的课程不包括这些东西的任何部分。能够想象经过它能够学到什么了。

固然,这也不是说那个课程就彻底不能学。只是说Programmig methodology是一个基本上未经探索的领域。斯坦福这个课程的内容是能够学,但千万不要把它当成真正的编程方法论来学。由于它不是!勉强一点的话它也顶多只能算是一种高级语言层次上的编程方法论。但在我心目中做为一门真正学科的编程方法论,即便不算系统工程学与产品学方面的内容,至少也应该要上升到编程范式的层次来讨论编程方法才能被勉强冠以编程方法论的名称。而它却连面向对象都不讨论,固然不能算Programming methodology。它更象是一种Programming technology。