面向对象一些形而上的思考

个人认知中,面向对象(特别是面向对象的分析设计)建立在这样一种美好的愿景之上:将现实世界建模到计算机世界中,如此一来现实世界中大部分简单的需求变动同样可以在程序中较为便捷的实现。说的极端些,其实是在模仿造物主的现实世界而创造一个人即是上帝的“计算机世界”。那么,现实世界到底是怎样的呢?

虽然很认同“天地不仁以万物为刍狗”,但既生而为人难免以人的视角考虑问题,我不知道造物主眼中的世界是怎样的,但我们往往用一个词来概括现实世界中的一切——万事万物。那暂且将现实世界中的存在分成两类,一是“物”,二是“事”。

所谓“物”,即是静态的,不因人的存在而存在的本身通过认识能用空间概念来描述的一切。“物”有着明显的边界,以相对稳定的形式存在。我将“物”简单分成两类,有生命的、无生命的。有生命的,如人,从静态的角度看有三种能力,分别是接受信息、处理信息(改变自身状态)、发出信息,而人与人的交互过程可解释为一方发出信息,另一方接受信息,并结合当前的场景和对方的角色分析该信息,进而决定是否改变自身状态或是发出信息回应。无生命的,如订单,则仅有展示自身信息(供接收方分析处理)的能力(功能、特性)。

而所谓“事”,可以认为是动态的,“物”的一系列相关活动的总称,有着明显的时间相关性,即可以用时间概念来描述的一切就是事。

简单描述一下现实世界后,回到面向对象,或者说领域建模上来。

“物”,可以对应实体entity,同样有着明显边界,维持自身稳定。实体也可分为两类,所谓的领域对象与值对象。领域对象包含最本质的操作,操作改变自身状态,如人可以举手,将手从默认的垂直于地面举到一定角度。领域对象间的交互用四色原型或DCI解释(结合事件源event sourcing):某领域对象做出一个动作,该动作发出信息(或称为讯号、事件),信息由关注者接受,关注者结合当前场景、该领域对象此时扮演的角色,用自己的逻辑解释该信息,做出回应(改变状态、做出动作,又或什么也不做),如小孩作为学生在课堂举手,老师认为他要回答问题;而小孩作为游戏者在和同学嬉戏时作出同样的动作,同学或许认为他在扮演奥特曼呢。除了操作外,领域对象本身状态的改变也常常会引发事件。(注:虽然状态的改变均由操作引起,但对外的操作并不能够也不需要完成对状态的整套监控,而应由领域对象自身的方法完成监控。就譬如每个人都可以在冬天裸奔,但并不是奔完就都会感冒,是否感冒将由人体自身的免疫机制监控并给出反馈)领域对象可以缓存场景、角色和动作的组合,以便快速做出做出反应而非每次收到信息都一步步分析判断,这样可以模拟人通过学习可获得习惯、技能或是知识经验。值对象就只仅包含、展示信息,供其他对象使用。
“事”,可以对应“事件流”,或称为“消息总线”,其采用并发方式传递事件(即领域对象操作),同样有着明显的时间相关性。

最后,模型中仍有一些“纯虚构”模式产生的对象。他们大多处在基础设施层,负责与计算机底层的交互。反观现实世界可能很难找到其对应的存在,但我们可以从游戏中发现。游戏世界中,玩家玩的一套图形界面,同样有各种对象,而开发人员必然也有一套类似后台控制系统存在,它为游戏世界提供着基础的服务和支撑。或许,现实世界中,在我们未知的领域,造物主也有着工具记录整个世界的运转,设定世界的基本规律呢?

以上纯属归家途中无聊之念,结合了近日对领域建模的一些学习和理解,过于形而上学,于解决当下实际问题无益,若有只言片语可得诸位老师评论,幸甚至哉!
[该贴被RyanHD于2013-01-24 22:53修改过]
[该贴被RyanHD于2013-01-24 22:55修改过]
[该贴被RyanHD于2013-01-24 22:57修改过]

物和事这两个分类比较好,“事物”实际就是“事”和“物”,事件和静物,前者是动词,后者是名词。这是人的思维范式。