很久没写C++代码了,今天想起一朋友问我要些模型设计及WINDOW IO模式的例子。一直没有时间弄。最近怀念下写代码的日子。就着手写了一个。
总体采用类工厂的模式+适配模型。模型中充分体现了模块间的解耦性,快速适配性,及代码的重用性。其实稍懂程序的都可以用到这里有一个多态模式在里面,也可以说是一个职责链模式,但并纯意义的职责链模式。对于终端看到的对外接口只有ISERVE,ICLIENT。无需关心其中的实现。
项目工程图:本DEMO使用的是VS2008 + QT4.7 WIN平台进行开发。
客户端:
服务器端:
最近一直在关注豆瓣上Zhang3关于新型程序语言研究的情况[1],及一些相关的讨论。这里有一个与我的重点领域模型与建模以及架构契合的地方,即软件程序架构或简单称为“程序架构”(programming architecture)。这是一个不太常用的提法,相对于常见的软件(系统)架构和应用架构,它更单纯、狭窄。在这个范围内,我们主要关心程序(programs)的组织框架与设计原则,相对忽略更高层次上的东西,例如组件、模块、服务器、配置与部署等等。从另一个角度,这个话题与编程语言的结构和设计紧密相连。
实际上,当前主流的程序架构就是“面向对象”(OO)。我一直认为,OO原本应该是一种有特定适用范围的架构风格。然而在近几十年的软件开发领域,OO被主流们推到了一般软件架构这样一个几乎是至高无上的位置,甚至还进一步被当作一般问题分析与建模的基础,乃至“哲学”。例如在MDE/MDA领域也是如此。对此,Zhang3和我一样,属于“不同意见者”。他对这个话题有着相当深入的分析之[2]。而他的开发计划目标之一,就是开辟OO之外的,更合理和有力的编程技术空间:非OO的方法学和编程体系(编程语言及集成开发环境IDE等)。
更经典的程序架构是 Niklaus Wirth 的“程序 = 数据结构 + 算法”(Algorithms + Data Structures = Programs)。最近,随着一般模型理论方面的一些进展,我“意外”地发现,这一在OO时代被认为过时的公式,恰恰揭示了软件程序的根本结构,应是万变不离之宗。OO也是建立于其上的;非OO的编程架构,同样必须建立其上。但这绝对不是要回到3GL时代,需要通过新的模型与建模理论,更清楚地揭示其理论基础和作用方式,建立新的理解和应用准则。
这正对应着现有软件理论最苍白的一环:在图灵机之上,“数据结构+算法”(还可带上“关系模型”)之外,另一些重要的东西,无论在理论还是技术上。这个层次也是决定计算机从序列演算(图灵机)变成信息(数据的意义)处理机——电脑的关键。OO是当前公认的主要解决方案,但实际上它是直觉的,缺乏理论基础的;而其它的应用程序实现?几乎都是更加随意、纯经验的构造。
可以清楚地看到,近二十余年国际软件工程主流,同样将注意力集中到了建模与模型上,但遗憾的是,主流们同时也不容置疑地把建模与OO划上了等号,集OO方法大成的统一建模语言UML成为绝对核心,以至于在当前几乎所有与软件建模相关的国际学术与技术交流中,形成了某种谈建模,就必须基于UML这样一种既狭隘,又霸道的氛围。
另一方面,还可以看到,被称为软件发展一贯的主线:抽象层次升级,在CASE, 4GL等那里开始撞墙。声明性编程、函数式编程、面向方面等,各有独特,但未现王者之相。建模成为软件工程技术及学术界探索的焦点,其中最有代表性的是随着对象管理组织(OMG)的模型驱动架构(MDA)浮现出来的模型驱动工程(MDE)[3],虽然国内对此重视不多,但这实际是软件工程前沿(其它如云,各种Web应用技术,包括SOA等与之相比,都是更加应用技术层的东西)。然而,近年对MDE的观察让我觉得它在某种意义上,仍然没有突破CASE, 4GL的一些局限,很可能又在撞墙[4]。MDA刚出炉我就有这种判断,最近一年的跟踪以及参与到国际MDE社区中的直接交流,让我这种看法更强了。
正因为如此,我们可以作出这样一个判断:当前的电脑应用建构技术,依然没有找到最合理与基本的架构;在有坚实数学基础的图灵机之上,还需要一个重要的基础层次,它同样必须坚实地坐落在数学之上,它还没有出现[5]。我认为,OO目前处在这个不能胜任的位置上,最终将沦为一场猴子称大王的故事。
逻辑系统如何连接到现实世界逻辑系统(即形式系统)是一个封闭的、自洽的符号/运算(推理)系统,其本身并不包括(决定)它的用途。换言之,一个完善的逻辑系统内部并不需要包括它与外界世界相连的固定方案。实际上,这也可以看作其称为“形式化的”(formalized)的原因。Zhang3的基本思路,就是构造一种完全基于逻辑的非OO编程语言,这这一形式系统,毫无疑问、必然地,基于图灵机,如他所说[1]:
“真实世界过于复杂,与语言的纠缠关系难以梳理,不如先退回到图灵机所构造的确定性世界,在这个世界中探索语言的奥秘。”
这种自底向上的构造策略,很符合我的建构主义哲学。事实上,任何现代计算机编程语言都是在构造一个基于图灵机的形式系统,但如何构造,途径很多,这也就是本文所讨论的程序架构问题。Zhang3在这个方面提出了独特的想法,其中一个很重要的方面,就是抛弃目前似乎是主流的面向对象的架构(OO),而完全基于逻辑(和关系代数),遵循分析哲学中的基本原则实现。
然而,形式化构造只是这个课题一半。无论形式系统怎样构建,最终必须以某种方式连接到现实世界,才能发挥其作用——这就是建立有意义的计算机程序重要的另一半。换言之,我们可以策略性地将形式系统建构以及它如何工作(在现实世界中)适当分离,但终究要完善地解决。Zhang3的工作无可避免地要面对这个问题,而他最近的两篇日志说明,对这个问题还没有一个稳定的、满意答案[6]。同时,虽然出发点不同,我发现有关模型与建模基本理论的研究,正包含着对这个问题的基本回答。我相信,模型与基于模型的操作是将逻辑系统连接到现实世界最基本的桥梁。要具体地建构和应用这个桥梁,就必须充分地运用我们所看到(研究中)的一般建模理论,及模型工作机制等基本原理。
Rapaport等的启示前面提到,Zhang3在提出的基本问题之一,是形式系统如何与现实世界联接。从另一个角度,它也就是语言的语义问题,语法和语义关系的具体实现方式问题。再广一点,可以追溯到经典的“意义问题”上。回到与计算机及其语言相关的领域,这同样是长期被学术界重点研究的基础课题之一。我发现,W.J. Rapaport 等的一些工作,可以直接与我在一般建模方面的一些进展联系起来,形成一个基本完整理论框架,对于本文讨论的主题,同样可以起到关键的指导作用。
这些工作包括对“怎样从语法中产生语义”这一基本问题的回答[7]。Rapaport从什么是“理解”的角度,详细地分析了其中的语法、语义结构及关系问题。理解就是获得语义,他认为,我们总是要基于一个域(domain)理解(解释)另一个域。而这是一个递归的过程,最终总会归结到一个域(称为基域,base),没有任何域来解释它,必须基于自身(也就是语法)做出解释,这样就形成了一个语义解释的连续统(continuum)[8]。他指出[7]:
当一个语法域拥有其自己的语义域,其语义解释函数或者将记号映射到其自身,或者映射到其它记号。对前一种情况,我们通过对语法“达成习惯”来理解域。对后一种情况,若所有的记号都映射到另一个不同的记号——则此情形相当于在使用一个字典。[...]在任何情况下,我们都有封闭的意义网络——一种整体性的、“概念性角色语义”。这就是为何语义能由语法中出现的答案。
实际上,我认为,从认知主体如何理解语言的意义角度,他的方案也许还有很多争论,但反过来,从构造一个有限/实用的形式语言系统,并关联到问题领域(现实世界)角度,这却给了我们很好的启发。尤其是针对本文讨论的话题,如Zhang3所明确提出的开发课题:如何在最简单/基本的图灵机(可将其视为最基本的语法/语义域)的基础上,建立一个形式体系,它能够构造出我们期望的各种复杂构造,来对应到现实世界的各种事物(语义)。从软件工程领域提倡的“抽象层次升级”的角度看,一种自底向上的,建构性的“表达连续统”,可以看作是“抽象层次”的内涵,以此为线索,再结合我们对于一般模型理论及其工作机制的一系列新认识,就发现,不仅对于抽象层次,我们可以在这个基础上全面地重新审视诸如4GL/DSL、或所谓“声明性”概念背后的一些东西,对几乎所有MDE的关键理论,做出更明确的解读或梳理。由此可能实现一种框架,将4GL/DSL的某些内涵,数据库,包括信息科学另一个重要、活跃的领域,本体工程方面的东西,自然地聚和在一起。在这个体系中,数据结构/模型,都有特定的含义,并非(完全)等同于过去的理解,甚至对于程序、算法这样的基本概念也是如此。其中,我称之为“一般建模理论”的那部分工作,最重要的贡献之一,
1. cat –n text1 >text2 把text1的档案内容加上行号后输入到text2这个档案里;
2. cat –b text1 text2 >>text3 将text1 text2的内容加上行号后输入到text3这个档案里;
3. cd ~跳到自己的home directory
4. cd ../.. 跳转到目前目录的上上两层
5. chmod ugo+rwx file1 将file1设置成所有人皆可读写执行的权限
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限
6. chown jessie:users file1 将档案file1的拥有者设置为user群体的使用者jessie
7. cp 将一个档案拷贝至另外一个档案 cp aaa bbb将aaa拷贝至bbb并命名为bbb
8. cut –c0-6 打印开头算起前6个字元
9. find –name “*.c” 将目前目录及其子目录下所有延伸档名是c的档案列出来
10. less 浏览文字的内容,允许使用者往回卷动;
11. ln –s yy zz 将档案yy产生一个符号链接zz
12. ln yy zz 将档案yy产生一个硬链接zz
13. locate chdrv 寻找所有叫chdrv的档案
14. locate –n 100 a.out 寻找所有叫a.out的档案,但最多只显示100个;
15. locate –u 建立资料库
16. ls 显示指定目录下的内容
17. more –s textfile 逐页显示testfile之档案内容
18. more +20 textfile 从第20行开始显示textfile之档案内容
19. mv aaa bbb 把档案aaa命名为bbb
20. rm 删除档案以及目录
21. rmdir删除空目录
22. split 一个档案分割成数个
23. touch
24. at 5pm+3day /bin/ls 3天后的下午5点钟执行/bin/ls
25. at 5pm+2week /bin/ls 两周后的5点钟执行/bin/ls
26. at 17:20 tomorrow /bin/date 明天17:20执行/bin/date
27. at 23:59 12/31/1999 echo the end of world 1999年的最后一天的最后一分钟印出the end of world
28. cal 显示本月日历
29. cal –m 以星期一为每周的第一天方式,显示本月日历
30. cronttab
31. date –s
32. sleep 可以用来目前动作延迟一段时间
33. date;sleep 1m;date 显示目前时间后,延迟一分钟,之后再显示时间;
34. time
35. time -v ps -aux
36. uptime
37. chfn 提供使用者更改个人资讯
38. chsh 更改使用者shell设定
39. finger查询一些其他使用者的资料
40.
last –r 2