从置换到面向对象
对象化的划分,需要通过逻辑的分解进行,然而分解不过是我们有限的思维能力下的一种使用方法而已,我们在进行逻辑分解的过程中过多夸张了其独立性,是从某一个角度和一个方面来分解,然而对于无限的客观对象,我们只能够近似的逼近,客观对象永远是彼岸无法企及。
客观对象具有无穷多的参照方面,因为其本身的无限,是无法通过有限的分解将其分离。所以分解完成以后,组合这些分解完成的对象是无法表示未分解客观对象的整体特征,这些整体特征将按照其他的原理在运作,所以虽然肉体都是由大大的细胞组成,但是这些细胞组合在一起,是不能解释灵魂的意义。
当然,“置换”也是一种分解,同样,这种分解只是针对某一面来进行分析,只是关注于如何更好的表示计算机设计领域中如何通过最简单,最科学的方式来表达设计的基本特征。置换公理也仅仅局限于本层面(计算机设计统一方法层面)的认同,它无法表征上层(通过场景来表示设计的意义层面)所表示的意义和价值。但是这种分解又是必要的,因为仅仅通过模式使用场景来概括也是分解的一个方面,而这个方面也只是在其本身的层面进行的。
的确,面向对象的很多思想完全没有站在一个坚实的理论基础之上,在面向接口的思想中,我们可以通过规划接口中的各种动作来达到对继承体系进行有效的约束,然后让之达到多态的处理,这里对于方法(或者称为函数)进行的抽象,其实在外部调用方面就是一个约束化的处理。但是由于这里只是对动作进行抽象,对实体并没有进行有效的约束,所以在继承于具体实现类的时候,就存在虽然是相同的动作的抽象,但是由于其不同实体,所展示的相似的动作,但是并非是这个继承体系。比如对于一个飞的动作,对于雄鹰来说,飞翔是其本来的能力,但是对于一个在飓风口的野猪,当其飞起来的时候,我们顿然发现雄鹰和野猪在飞翔实体上本来就是风马牛不相及,一个是本能起飞,一个是被动起飞,所以面向对象这种不经过实质性的分析,仅仅按照接口来进行划分,不知道会带来多少混乱呀!
所以我们引以为豪的面向接口编程,是否也是在一定范围一定条件下才能成立呢?但是另一方面,面向接口写的程序,其扩展性和低耦合性都表现的非常好,那难道是我们的软件系统的划分标准与人类智力的认识的划分完全迥异呢?或许面向对象的思想号称是最接近人类抽象思维的思想。
面向对象不是对事物的本质进行描述,而是对事物的外在特征的描述。所以才会出现上面讲到的存在无法准确定义的面向对象的特点,然而如果我们反过头来看看,其实什么又是其本质描述呢?因为所有的准确定义都是在某个层次上进行的定义,例如对于人的定义,如果在生物特性来说,我们定义为一种高级的灵长类哺乳动物,如果按照社会学意义来定义就是一种具有语言的劳动者和实践者的动物就是人类(马克思的观点),定义有多种,在不同层次上,不同领域中所下的定义,我们应该选择哪个呢?我想哪个都不能选择,我们只能通过外部体现的特性来进行定义,而外部体现的特性就和当时、当地的定义者来进行抽象。外在特征才是最适合的定义方式,也就是上面谈论到的按照需求进行定义和抽象。所以面向对象不仅仅和描述的事物的有关系,同时也和观察者有关系,就像微观世界中的观察者影响被观察者的描述,是一个无法准确测定的过程。
也许汽车和伞的例子更能够说明这点,在分类方面,或者本质定义方面,汽车和伞可能很难划分为一个种类,但是,如果我们在处理避雨的外在功能的时候,我们很可能就将其继承于是否能够避雨的接口下,而此时满足了我们的应用,而且对于泛型编程思想来说,我们也是通过一些外部特征来进行处理,例如这里可以将汽车和伞都放置到能够进行避雨操作的typename中,甚至我们的软件设计的各种手法都是按照外部特征来进行定义,都是注重“形式”,而忽略“本质”。同时数学模型化软件设计也是从结构这样的外部特征来进行分析。所谓的“本质论”其市场越来越小,也逐渐会被抛弃。
如果我们在进行方面选择的过程中排除了观察者的因素的影响,那么我们无法全面认识到我们在分析中我们的选择是否科学,观察者的视角往往影响到被观察者的变化和特征,而且在很多具有辩证的自矛盾的因素中我们是无法同时兼顾。例如我们在使用置换过程中,在增加了其扩展性方面的同时必然增加了局部的熵值。
同时,观察者都是根据自己过去的经验来考虑新的模型,只是在使用这样的模型中,如果有违背最开始的一致性,那么才采用一种新的方式来扩展这样的模型,这里不要说计算机设计领域,就是在数学领域,也是通过一致性来判断,因为不同的公理系统之间是没有正确和错误之分,只有在这个公理系统中是否达到一致性原则。
那么如何考虑观察者对此的影响呢?其实很简答,所选择的方面是否具有逻辑的独立性,这里需要注意是逻辑的独立性不是物理的独立性,逻辑独立性很强,那么我们就可以这样选择,所以这里没有正确和错误之分,而只有恰当或不恰当之分。所以针对面向对象这样的选择来说,其实是没有正确和错误之分的,确切的说是无法进行证伪的,形成的逻辑概念只有判断恰当与否,所以上面谈到的试图去证明面向对象是正确还是错误都是徒劳。
原文地址:http://blog.51cto.com/13832308/2133030