一个真正的系统,与其UI是分离的。
这一点还涉及到另外一个问题即任务定义的问题。前面在ANDROID相关的文章中讨论过ANDROID的任务模型。ANDROID里面,用户区与系统核心区是分离的。具体界限我没有研究,但是ANDROID做得非常好的地方并不只有这一个,还有一个就是其编程框架的用户化。这一点也在某个程度上展示了任务与执行分离的软件发展趋势。
我一直有一个思想,那就是任务定义应该是用户友好的,而系统核心应该是分离的。也就是说,任务与系统核心应该处于不同的区间。这一点可以从操作系统的层次理解,也可以从应用程序的层次理解。两者都各自有各自的任务,可以整合也可以分开实现。但是有两种任务的存在,这个是确定的。
而分离的原因,就是无关性。即任务不应该与对任务的执行相关,这样才可以最大程度地得到任务执行的自由度。比如我要定义一个任务,用户要以用它打电话。但是用户所需要的一切并不需要跟我们对它的执行对应起来。我只需给用户一个完成这些东西的界面就可以了,具体怎么执行应该要抽象化。比如设计一种专门的任务定义语言,然后以这种语言为接口,各个厂商可以实现其不同的方案,这样即保证了两边的分别发展,也有利于形成一个产业化的分工链条。
比如电视机,从CRT到背投到液晶,到PLASMA。都有一个开关按钮,都有调节音量的按钮,都有选台的按钮。关于选台这个我觉得抽象程度肯定是不够的,但是这里暂时不讨论它所以先假设它是一个合理的设计。这样的一个合理的设计,它还可以再用一百年,如果它是合理的话。对不对。而且,即使它不合理,但是因为事先我们有标准的界面定义语言,所以我们也不会在前端与后端的接口上存在任何问题。因为后端从一开始就假设了对前端的完全理解。WHICH IS TOTALLY DOABLE,RIGHT?
语言的力量是无穷的。
回到主题,比如我这么说吧。你现在要开发一个手机应用,要求几大移动OS平台同时兼容。你要怎么办?
显然,每个平台使用不同的UI模型。前面也已经提过,苹果是不使用虚拟机的,它是纯机器模型。这意味着它的代码是裸露的。就单这一点,就足以构成相当多的设计上的区别,就更别提其UI内核上的区别了。
其实最好的面向对象的例子还是STRUTS1。STRUTS1就是最好的面向对象的例子。但是大家都嫌麻烦所以STRUTS2改了。改了大家都觉得更方便,但是方便是有代价的。只是你不在乎而已。因为你是程序员。不是架构师。
方便本身就是程序员的价值观,不属于系统价值观。从产品的角度讲,没什么方便不方便,只有质量,属性,代价。
有人知道面向规则的系统就会很容易理解这个。一切到最后都汇聚到规则,所有逻辑都在规则中。这样的系统,你必须要为它建立单独的UI,想混起来都做不到。因为中间有个规则引擎在那隔着。这也是EJB的逻辑。EJB唯一的问题在于,它位于单独的容器,并且标准好像也没有或者说打算解决这个接口的问题。否则的话它实际上是一个更好的对象容器。
一切的目的,都是为了最后给你或者说得到一个更纯粹,更完整的“面向对象”的系统,或者说“由对象组成的系统”。而不是一个以寄生虫的形式存在于大系统中的小系统。
比如,你如果没有这个完整的对象系统,那么我就只能从整体系统的意义上来理解你的系统。WHICH IS AN ANGLE THAT,从这个角度看,所有的程序到最后都会看上去差不多。都是标准结构。这样的话,你的系统在哪里呢?
区别在于,你要有一个形式化的问题域及解。而不只是去“使用”框架或者说大系统。因为当你在“使用”的时候,你就把你自己放进了“系统”,使得你自己成为了这个系统的一部分。WHICH正是微软的程序哲学:微软的程序世界观由程序中+程序组成。但是真正的系统必须具有独立工作的能力,它必须自己解释自己。必须拥有自演绎的能力,而不是跟程序员一起。它必须要能够离开程序员独立工作。
也就是说,它需要对问题域的完整的形式化而不只是功能式的形式化。因为功能式的形式化是不能自演绎的,它必须要求程序员的加入,因为这样的形式化并不是语义的形式化,而是功能级别上的形式化。它不是一个语义系统,而只是作为一个功能部件存在于系统中的。换句话,它没有承载真正的问题域语义或者说只承载了部分意义上的问题域语义,其大部分部件只能从功能的语义上去理解它而不是问题域的语义上去理解它。
前面已经讨论过,所有的程序对于机器来说都是一样的。因此语义上的区别是两种形式化手段下的唯一区别。
一个正确地语义化的系统,不只是面向对象,还可能是别的形式,比如如果你仅仅是用计算机来完成一定的计算的话,那么LAMDA算子可能是一个正确的语义,这样的一个系统,它与一个相反系统间的区别又在于,这构成了另一个意义上的区别:认识上的区别。
我们写程序的时候,经常会说,这个是变量,这个是常量,这个是函数什么的是吧,这些都是认识。我们的程序世界,正是由这些“认识”组成的。因为要知道,机器并不知道这些,机器知道NOTHING。我这意味着我们所有的工作,其实在很大程度上,都 是在我们大脑中完成的。
这个有点深奥。必须要对哲学有所研究的同学才能理解了。因为我自己都会经常在里面搞晕。总之,比方说,你会以为,比如,我今天去上班了。其实你并没有。世界上从来也不真正存在上班这回事。宇宙不上班。所以你以为的那个东西,它本身就是基于你以为的别的东西。一切都是循环。写到这又可能再回到关于分析命题与综合命题的争论,但是这就是哲学。它无处不在,你无法避免。
也就是说,我们以为我们在基于别的东西进行工作,但是实际上这个所谓“别的东西”本身其实并不是别的东西,它其实正是我们自己。是我们自己的认识。一切都是臆想。过程是臆想,变量是臆相,对象也是臆想,程序也是臆想。
都是臆想。
这样一来,为什么面向对象这么重要,为什么分离这么重要,就解释了。因为不这么分析,我们可能觉得所谓面向对象只是一种方法而已,没有想象中重要。而结论却是,石头有多重要,它就有多重要。因为它们其实是一样的东西。
一模一样。石头与对象,一模一样。完全一样。没有任何区别。