呵呵
我对 OCL 没有太多看法,只是 粗浅、感性 地认为它是 UML 有益的补充。这是朝正确的方向(语言的无歧义性)走的一步,无论是多大的一步。WHATAVERY 给大家开导开导,OCL 能不能象编译器那样检验“作品”的正确性?
UML,和 UML 表述的“模式”,问题在于它的消费者是人,而不是一个编译器,或者RUNTIME。这和编程语言,甚至硬件描述语言(比如 VHDL 等)有本质区别。在这一点上,UML 其实还不可以称作为语言。比如,ASSEMBLY/C/JAVA 是可以数学证明正确性的,所以编译器和 RUNTIME 甚至 CPU 可以在“功能等价”的前提下进行优化。VHDL 也可以数学证明其正确性,所以工具可以进行大规模逻辑线路化简。甚至于传统的机械制图,也具有“无歧义”的特征,可以用 CAD 软件数学证明图的正确性。
UML 肯定做不到。OCL + UML 可以么?如果不行,那么 MDA 就还是“艺术”,或者科学“探索”,而不是理论体系。昨天 GOOGLE 出一篇 UNIV. OF HELSINKI 计算机系的文章,关于用CSP 在 UML 架构框图里采掘模式和反模式,目的是在设计期量化预测架构设计质量。我的看法是,在 UML 具备无歧义的语义之前,这样的工作之多只能算是“经验估算”性质。有意义,但是很有限。归根结底,整个“软件工程”学科的软肋还是在于语义的模糊上。
从整体方向上看,OCL 应该是向正确方向迈的一步。但是在最终出现一个有完备数学理论的 UML+ 之前,模式还是只能表述为“经验抽象”,主要功能是“人对人”之间的共同工具,而不是象编程语言那样严格的逻辑表达工具,最多是象 TOGETHER 那样搞一个“代码模板”式的 MDA。但是这样的 MDA,和 VC 里的代码模板,也没什么本质区别,不过多了些没有明确涵义的 UML 框图。
在一定程度上,我开始怀疑(呵呵,本人是天生的怀疑者)“面向对象”的整体方向是问题的根源所在。“面向对象”的哲学根基是建立在人对世界的“感性认识”上。历史证明,“感性认识”往往是靠不住的。尤其是,如果你的问题域足够复杂,即使你的问题本身看似很直观,也必须用数学的“理性抽象”来解决问题。比如,曾几何时,商业数据库的基础数据结构和操作语言都是基于直观而感性的“树”的。但是既不直观又不感性的“关系代数”改变了这一切。再比如,逻辑线路设计问题的理论基础是与电子线路毫不相干的多项式化简算法。再比如,(现学现卖地说:)从代码里反向模式发掘 的理论模型是看似风马牛不相及的有向图抽象和CSP算法。
所以,也许,在基于状态机的编程语言之上,作为软件世界观的更高阶的“抽象”,和作为软件工程方法论的架构“语言”,不该构造在“面向对象”的“模式”上,而应该够在在面向“数学抽象”的“函数语言(功能语言)”上?
本人是数学 FREAK,OCL 和日常工作又完全没有关系。性之所致,信口道来。哪位对 OO, OCL 有理论研究的,给启蒙一把?
Whatavery?
Dmuyy?
Banq?