开放课题:
1)描述原语的具体语言
静态语言,动态语言?命令式语言,声明式语言?Web给我们树立了一个极好的榜样,模型使用HTML描述,结构特征使用CSS语言描述,行为特征使用JavaScript描述,场景规约使用HTTP描述,场景使用URI命名。事实上Android UI就汲取了Web的灵感,将UI的模型及结构特征使用XML描述。
2)特征剥离的方法
如果特征与模型使用同一种语言(比如Java),结构特征和行为结构的剥离需要付出额外的精力,比如前者侧重“一致性”,后者侧重“交互性”。而在Web中,结构特征和行为特征的剥离易如反掌。一致性要求画面在一段时间呈现相同的风格,这将给用户良好的界面体验的必要基础。CSS的设计者之一Bert Bos,解释了为什么CSS高度强调一致性。
Why “variables” in CSS are harmful?
3)特征凝聚的方法
模型凝聚特征,最简单的方法就是赋值。当模型具有复杂的结构特征时,可以使用“结构型”模式进行凝聚;当模型具有复杂的行为特征时,可以使用“行为型”模式进行凝聚。 凝聚特征的方法远不止赋值和GoF模式,比如JQuery中的selector、 Android中的R.java等等。
4)语言引擎的设计与实现
在不同的“系统”或“层次”之间,可能需要引入“语言引擎”这个概念,语言引擎的工作主要是协调两个说不同“语言”的“系统”之间的信息交流。比如Web应用的前端客户端说的是JavaScript语言,后端服务器使用是其它的语言(比如Java, PHP等)。Ajax(Asynchronous JavaScript and XML,由Jesse James Gaiiett发明)引擎负责两者的信息交流。Ajax的本意是通过JavaScript启动引擎,发送Request,异步接收以XML的数据格式返回的Response。现在XML已逐渐被JSON取而代之,因为相对于XML, JavaScript天生对JSON非常熟悉,是自家兄弟。
这里我修改Ajax的含义使其具有普适的意义。A = asynchronous, J = jabber, A = And, X = X。A 表示异步(同步是异步的特殊状态),Jabber的含义是“快而含糊不清的话”,X代表是任意对话者将的语言。
当某个层次或系统说的语言(Jabber),对于另一个层次或系统(使用X语言)而言可能就是“快而含糊不清的话(Jabber)”(我们多数人听老外讲话不就如此?老外听我们说话亦然!),此时就需要一个“语言引擎”进行翻译,使两者流畅地交流。语言引擎有两个工作模式:异步模式和同步模式。
对于Web UI来说,JavaScript为了自己的话能够被服务器(比如使用Java编写的服务器)听懂,使用Ajax语言引擎告知自服务器自己说了啥,要做什么。
对于Web Server(比如Java编写的服务器),为了Database能够听懂自己的话,知道自己想要些什么,做些什么,也需要构造一个Ajax引擎。语言引擎如果足够智能,可自动切换工作模式。比如在同步工作模式下,与SQL数据库建立会话;在异步工作模式,与NoSQL建立会话。
语言引擎的设计者需要具备精通数据库语言和服务器使用的语言,才可能建立通用的语言引擎。这个有能力的人可以考虑怎么实现,将其开源奉献给社区。 我目前是不知道啦。语言引擎不是Object/Relation Mapping,多多借鉴Asynchronous JavaScript and XML才是正道。
5)架构风格的设计与实现
Roy Thomas Fielding的博士论文《架构风格与基于网络的软件架构设计》是一篇极好的文章。李锟、廖志刚、刘丹、杨光的翻译也非常到位,感谢他们无私的奉献。我提出四象图的灵感部分(模型)源自于这篇论文对“资源”的定义,还有一部分灵感(特征)源于曾经对系统“特征向量空间”的痴迷。
Fielding在文中提及,“更精确地说,资源R是一个随时间变化的成员函数MR(t),该函数将时间t映射到等价的一个实体或值的集合,集合中的值可能是资源的表述和/或资源的标识符。”“REST对于信息的核心抽象是资源。任何能够被命名的信息都能够作为一个资源。”
在四象图中,Resource犹如“凝聚特征的模型”; Representational State表示“模型进入的场景”; State Transfer Protocol表示“场景的规约”;URI则是对“场景的命名”,其应绑定恰当的语义。
四象图与REST描述具有相似的“画面感”。 资源的表述性状态是一个持续一段时间的画面,状态转移协议切换各个画面。模型进入场景持续一段时间的画面,场景规约切换各个画面。两者之所以,具有相似画面感,是因为模型与资源的定义都是时间函数,是一个随着时间变化的概念。
体验与感受REST架构风格、四色原型、GoF设计模式,想象与其提出者进行交流,聆听、汲取其智慧,是我提出“四象图”的源泉。Web是一个成功的REST架构,运行了几十年。碰触Web,与接触TCP/IP协议栈、信号与系统、香农的信息论、机器学习一样,都令我感到震撼,开阔了原有的视野。
架构风格的设计与实现,我也是个在不断学习的初学者。之所以列出这个课题,是因为我觉得其非常重要,不可或缺。
6)程序之道:象数理
Niklaus Wirth提出公式“程序 = 数据结构 + 算法”,我认为这个公式少了一个东西,必须显现出来,即“模式”。古人有“象数理”之说,“象”在程序中抽象为“数据结构”,“数”抽象为“算法”,“理”抽象为“模式”。
“象”可以描述变量,过程,对象,函数,进程,事实,……,基于不同的“象”(数据结构),我们需要思考相应的“数”(算法),发现“象数”之后的“理”。这是无止境开放的课题,我们可能永远都无法找到永恒的真理。
建模原语和程序之道的来龙去脉,可以参考帖子《领域驱动设计之我见》和《Hello, World! 我心中的道》,但那两个帖子充斥着混乱和错误,有时间可以了解一下,没有时间,看这个帖子就行了。这些是我提炼、加工后的结果。
提出“六大开放课题”,因为其与“四象图”在虚拟世界中的落实息息相关。有空我会写一些特征凝聚的代码例子,作为参考。uda1341的设计的作品完成差不多了,可让他普及一下程序之道这个课题出现的新方法论:Fact-Oriented Programming。
希望有更多的人,了解和使用四象图,并对随之提出的“六大课题”感兴趣,去研究和解决他们。
欢迎转载此文。最好注明原出处。
achieveidea@gmail.com