作者:朱剑锋(广智公司技术部)

    除了用例,应该说概念模型是OO开发过程中另一个充满主观色彩的工件。 什么是概念模型?简单说,它是对真实世界中的概念的描述。注意,是实实在在的事物概念,而不是软件实体,弄清这点很重要。在表达形式上,它一般是由一组静态的结构图来表示。

    不同的十个人对同一个场景进行研究,可能提炼出来的概念模型都不一样,所以说这是颇受主观认识影响的一个过程。然而,概念模型的质量对整个系统的影响至关紧要,因为,所谓的面向对象,就是从这里开始。

    一般来说,构建概念模型的过程与程序员的关系并不大。最适合进行这项活动的人,应该是那些有较深资历的领域专家,极端一点,甚至可以就是最为熟悉自身业务流程的客户代表。只要稍稍学习简单的建模知识,他们就可以胜任了。技术出身的人要做好这个工作,在开始之前他可能首先需要做的就是:忘掉VB,忘掉JAVA,忘掉.Net, 忘掉C++ 。。。 不过,现在作为开发人员,我倒是觉得有一个使自己的思维跳出技术的条框,学习真正从“映射现实世界”的角度考虑问题的好办法,就是——假想一下,自己正在通过某部电影的故事来制作一个RPG游戏,电影里的桥段与游戏中的场景相对应,然后思考,其中需要表达哪些不同概念。好吧,试着弄一个简单的例子,这里,我用《无间道》来试试(不要笑我eld啊)。

    构建概念模型,需要从场景中提取各种“对系统目标有用”的概念。通常的方法是通过识别主要的领域词汇,或者通过已有的概念目录检查表来查找。由于时间关系,我已经预先想好了一些。看过的朋友知道,像“卧底”、“警察”、“黑社会”、“情报”等等,都是《无间道》这部电影里的一些核心概念。很自然地,开始时我会倾向于发展这样一个模型:这样看起来比较直观。“警察”和“黑帮成员”是两个较大的概念,下面分别有较小的两个子概念。像黄Sir和韩琛这样的角色,是可以很直接地归入到“正规警察”和“普通黑帮成员”的范围中去的,而陈永仁和刘健明都分别属于不同的卧底角色。但这样出现了一个问题,就是陈和刘都是同时具有警察、黑帮的双重身份(尽管一个在明,一个在暗)的人,他们都有可能同时拥有警察和黑帮的某些行为。比如陈永仁在拥有黑帮“劈友”,“收数”的行为时,也有可能执行警察“逮捕”,“救死扶伤”这样的责任,刘健明表面上是警察,暗中也有进行黑帮“洗钱”的行为。两个人的行为相似,但本质立场不同,怎样在模型中表达出这样的概念呢?曾经也想过将“卧底”同时作为“警察”和“黑帮成员”的子概念,但觉得这样比较复杂且僵硬,实现起来也不容易(对不起,我又想到实现了)。

    后来觉得可以试试将“身份”和“行为”概念提取出来,于是建立下面这样的一个模型: 在这个模型中,每个人物可以机动地拥有1个以上的身份,多个行为。每个行为也可以与特定的身份挂钩。这样的话,对表达不同角色的复杂身份就可以比较灵活了。对陈、刘之间的本性问题,又引入“价值观”这样的概念描述。但可以看到,改变后的模型复杂度提高了,尤其当人物的“行为”很多的时候,就可能会在其下面出现比较大的概念群了。

    系统的灵活性和复杂度的矛盾,是在提炼概念模型时必须慎重思考的问题。 可想而知,如果真的要做成RPG的话,更多的概念需要被提取出来。譬如“情感”、“人际关系”、“情报”、“武器”、“女朋友”。。。。。。由于时间关系,就不在这里乱唱了。这次做的这个粗陋的模型,就权当抛砖引玉吧。高手不要笑得太大声哦 ^_^