拨开云雾看模式

这几天我发布的博客连载了我的新书《软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计》的简化版,可能由于“深奥”的理论知识让人却步,其实我也知道这些^_^,这也是我有意为之。曾经在多年之前我就仔细品阅过《敲响OO时代的丧钟》系列著作,让人振奋!这几篇系列文章针砭时弊,深入透彻地分析了面向对象的诸多不足,让观者无不拍手称妙。但是,所谓有破有立,因为我看到了较多的“破”,却没有看到根本的“立”,这让我感到无限的迷茫。于是久而久之,大家不再关注面向对象的这些不足。而让人唏嘘不已的是,面向对象的发展依然如火如荼,仿佛一切安好,完全可以静想生活的无限美好了。也就是这样,软件设计经历了一个高潮之后逐渐的陷入了低谷,而接踵而至的是人工智能的深度学习,以及区块链、量子计算等等新兴的技术进入了快速发展期(不要责怪因为它们都在试图建立在坚实的理论基础之上),这其实也是反观软件设计一直走在经验化的道路上,一直拒不悔改,因为我们没有给予最为基本的理论基础,完全是通过经验的总结在推进这个领域,当然经验的确给予了我们高效的接收,我们能够较好的把握这些具象化的东西,但是经验给予不了我们如何更好的运用之妙,更为致命的是有太多的经验往往是一些错误的认识,就如同我们认为天圆地方的经验,还是太阳围绕地球的旋转。而且经验无法穿透表象直达本质,这就好如国人都知道龙生龙、凤生凤、老鼠生儿会打洞,但是我们不知道遗传疾病的原因,不知道基因的转化过程。其实就是这样的原因,才不得不感叹:成也经验,败也经验。

所以,我下定决心应该继续完成这一未完成的事业,从基本面上去探讨软件设计,由此开创新的未来。因此经过多年的潜心研究,我找到了通过构建在数学为基础的方法,通过准确的演绎、公理化、证伪、实践等手段,再度针对软件设计进行重塑,而写成这本书也只是必然的结果。虽然我知道这本书中存在太多的谬论(也找到太多的有用价值^_^),但是我坚定的认为这是一个必然之路,而目前我最担心的是缺少关注,缺少大家的分析讨论甚至最为强烈的怀疑。如果这样就将是整个软件设计的悲哀,特别是战斗在一线的各位架构设计同仁们的悲哀。

这几篇文章其实是“破”的更多,我将继续沿作《敲响OO时代的丧钟》的路径,继续探讨目前我们的不足。而为什么我要通过先发表成果,而到了现在才回过头来分析目前的不足呢?这是因为我是真小人,不是伪君子!没有收入怎么养家糊口,拜托现在是市场经济时代O(_)O哈哈~,我目的就要推出我的佳作。在这个我为人人,人人为我的同时我可以顺便推动软件设计的发展,这不也是一个绝好的事情嘛!当然,另外的一个原因也很重要,那就是不希望如同前辈那样被人默默的忽视,最后沉入无穷的深渊。所以,我要做的更好的是即有“破”,更需要的是“立”。

书归正传,这几篇我将使用比较容易理解的方式来概述我书中的一些观点,当然,保证不会出现头痛的数学公式,我大多数通过一些结论的方式给出观点以及我的思路和解决方法,可能有的地方会从我的书中载录过来,大家可以先阅读这几篇文章,然后再去读我的著作,这样会更加的容易一些。同时我也希望写的幽默有趣一点,不要那么的沉闷!

好的,我还是从“破”开始吧!(因为我几乎不喜欢在我的书中大篇的转载别人的著作,除非是为了说明我讨论的主体,所以,大家可以在网上搜索“敲响OO时代的丧钟”,庄先生的著作),这里我先把作者的观点进行一些摘录,如果需要获取详细情况请参阅原文

1. 满足需求的设计才是好的设计,软件就是有限的情况下,满足需求。

2. 面向对象原本声称的描述真实世界的目标,采用的工具却是朴素的“种加属差”的方式。

3. 面向对象分析中,发现具体的对象还算是容易的,发现“种”的概念却是困难的。

4. 在实际应用中,种概念的发现与定义,被偷换为公共代码的抽取。

5. 由于基类的定义的随意性,导致子类不但可以扩展基类的行为与特性,还可以覆盖(改变)基类的行为与特性。

6. 由于哲学概念与开发概念的混淆,使得在OO领域IS-A、Has-A、Like-A成为最为绕人的概念。

7. 一个类型,是由其本质决定了所能表现出的可操作性,而不是有其所能接受的操作决定了其本质。然而,OO正好把这个问题搞反了!

8. 有了OO容器之后,所有的创建模式都被一个概念所代替了。在没有这样的概念之前,我们需要用各种模式技巧,来实现“支离破碎”的环境。而在真正的容器环境出现之后,我们就不再需要这些设计模式了

9. RDB中自然存在的“关系”这一概念,在OO当中,却没有明确的对应概念。在OO的世界里,对象之间存在各种各样的关系,却非常难以进行规范化的描述。

10. OO在数据模型设计上不具有思维简洁性。

当然作者在其中充满了OO的蔑视,诸多的不是说的也是有理有据的,但是,感觉其实还没有说的太透彻,我这里再根据我的理解进行进一步的阐述。

首先,无论是作者还是作者批判的面向对象都试图使用本质概念来描述,这其实都不太正确,因为,本质概念不是一个绝对的概念,其实都是相对而言的,就连哲学家、物理学家都没有搞清楚世界的本源,那我们又何从去所谓“准确”定义一个对象呢?我们只知道一个对象是我们需要研究的目标,由于我们具有一定的目的性,我们看到的是其中某一方面的特性,比如猪,动物学家是研究其动物特性,而营养师看到的却是其营养价值,同时客观的猪的对象,但是在不同目的下却是不同的意义。所以你能说谁是准确的看法呢?而面向对象就认为我们是找到一个本质特性的对象,其实,这是不现实的,我们只能关注其一面或几面,而不能面面俱到,因此我们找到的对象其中就和我们的需求相关,而这个需求就是我们的目的性。由于价值的原因(将所有方面都装载进去,成本就是一个无限大值),导致了软件设计中对象的定义:根据客观实体在需求体现的某些维度上进行最有价值的确定,这是才是软件设计中的对象定义,和其他学科的定义是不一样的,所以,不要用哲学来解释,这是解释不通的,会越说越糊涂。

对象具有客观性,只是会受到主观的影响,而类是我们的一个划分,而划分的条件就是我们的需求在客观的上的维度,最优的类的划分是一个等价的划分(我在著作中用数学语言详细定义过),而对象和类之间的关系,我们的教科书搞错了,其不是元素和集合的关系,而是一种映射关系(最优最容易处理的描述方式就是函数关系),在我的著作中进行了详细的推导,由于出现矛盾而否定了元素集合这样的关系。

而对于面向对象为什么是一个模糊的东西呢?其实这主要是在很长的时间里,没有一个更加原子的基础结构来描述,所以找到这个基础结构才能更好的去伪存真,而在我的著作中,我采用“置换”作为原子基础结构,然后通过公理化的方法(就是在数学中通过少量的基本假设,然后进行演绎推理)来研究,虽然还无法做到如同数学大厦一样完全通过公式、证明的方法来构建,但是这一定是一个正确的路,即使将来证明不是“置换”这一原子基础,那也是一件让人高兴的事情,因为我们在正确的道路上行走,即使是一个弯路。

其实,面向对象不是一无是处,我的新的理论其实是要包含这些有益的特征,去伪存真,这才是合理的处理方式,而不同于作者的全盘否定,为什么面向对象在实践中会出现这样那样的问题,我们是需要去寻找原因,并找到解决的办法,其实每一个理论都是具有一定的局限性的,我们都需要一种新的系统来包容这个系统,在一个更高的层面上来看待问题。面向对象之所以无法将很多事情讲清楚,这和它一贯坚持的经验化的道路是很有原因的,这其实是一门学科在早期的必然出现的情况,因为应用的发展太过激烈,我们还没有更多的精力从更理论的层面来研究,而随作软件设计的发展,到了一个新的高度的时候,我们就需要进行准确的定义。这就如同数学分析的发展也是这样,包括牛顿这样的伟大数学家、物理学家都在使用一个无穷小,但又不是零的数来表示其极限,而直到柯西等人的对极限、微分、连续等概念进行精确定义以后,这才构建其了一个坚实的大厦。所以,在裸奔了几十年的面向对象的软件设计,其实我们是能够原谅,形势逼人嘛!至少我是认同的。

而设计模式在过去由于无法通过一个基础结构进行定义,所以,一直以来我们使用了一些经验和方式来交流、传授,而当我们找到“置换”这一个基本结构后,我们就可以将这些设计模式进行“拆分”,通过“拆分”,针对其局部特征进行详细的分析,所以在我的著作中,其实我有意避开讨论设计模式的意图、需求,而是从其结构来进行探讨,而这底气主要还是我建构在一个更加基础的结构之上来探讨问题,这样也获得了更多意想不到的东西!

另外,作者其实已经要跨入到数理化解决软件设计的范畴中来,但是,只是踏入了半步,其也看到了关系型数据库的一些优势,希望通过这些来改造面向对象,其实,这里面还有很多的东西需要研究,而关系这另一个特性,在面向对象笼统的认识中是无法体现的,而只有建构在基本的结构上的时候,再使用关系特征,这其实就更加合理合情了,所以我就事后诸葛说一下,这的确还有一段较长的路需要走。

 


猜你喜欢

转载自blog.51cto.com/13832308/2134797