2.3 职责到底是什么?

写这篇文章的时候心里挺愧疚的,觉得挺对不起一直等这篇博客的朋友,因为确实停了太长时间,很多身边的朋友也催了我好几次。我太希望把 GRASP 写好了,这反而成了一个心理负担,多少次想写但又觉得没有准备好,最后慢慢竟然推迟到了现在,我都想刨个坑把自己埋了,但是相关部门不让,说我会影响土地财政。好了,不贫了,甩开膀子加油干吧。

 

这个图书专题虽然已经写了好几篇,也一直话不离口地在说 “职责分配”,可竟然到现在也没有对 “职责” 做明白的交代,信息专家都说完了也没真正掀过 “职责” 娘娘的牌子,只是半遮半掩的提到过她好几次,今天这个牌子不掀不行了,不然没法讲后边的内容了。我之前一直想直接写 创建者 和其他的几篇文章,但总觉得有啥没交代清楚,就是动不了笔(键盘),其实就是没有把 “职责” 讲明白,都说缺啥吃啥,吃啥补啥,那今天咱们就把 职责 吃透,吃透了 “职责”,后边的那些内容就很容易搞定了。

 

之前的文章呢用极为轻佻的语言描述了一下什么是 信息专家 ,当时为了避免读者困惑,我并没有对 职责 进行更为细致的解释,只是用了较为感性和直观的表达方式简单解释了一下 “信息专家”,读了本节内容之后,你就会发现,我之前解释的 “信息专家”,不是真正的专家,只是个半吊子 “信息专家”。为什么这么说呢,因为我重点只解释了 “职责” 中的 认知职责 。“信息专家 ”就是拥有“专业知识”干分内的 “专业”的事儿的人。在程序设计的概念上跟 MVC 中的 M - Model 还挺类似的,但其实它们并不是一回事,“信息专家” 是推导 Model 的一种分析和设计手段,而 MVC 的 Model 是推导出的一种结果。

 

咱们刚刚说了职责中的 认知职责,那看来 “职责” 要是向咱们摊牌的话,它手里的货应该还不少。不要怕,没那么多,只有 认知职责行为职责 这老哥俩。世间的事就是这么奇妙,世间最难做到的事恰恰也是 “知,行 ”二字。我们老王家明朝出了一个大仙级人物 “王阳明”,在得出 知行合一 人生终极指南之前,他老人家经历了极为痛苦的求索过程,彻悟之时,几近油尽灯枯,凋零枯槁。对于这位大师,我无比崇拜,因为他有限生命中真正触达的境界确实太高了,历史上太多人物,沽名钓誉,而这个家伙实实在在地牛X。

 

先来说说 认知职责 吧,我们常说 人贵自知人要有自知之明,这真的很重要。然而人生最大得悲剧也恰恰出在这里:“道理我都懂,依旧过不好这一生”,知行合一太难了,上嘴皮碰下嘴皮很简单,但是要你第二天 5 点就起床真的不那么容易,更不要说每天坚持如此。当我们说“人要有自知之明”时,你是不是隐约想到了 “信息专家” 要表达的内涵,确实是这样的,到了程序的世界里,我们在 OOAOOD 阶段,就是在做 “对象“ 要有自知之明这个事情,虽然我们人这个欲壑难填的物种很难做到 ”知行合一“,但是我们分析和设计好的 ”信息专家“却能完成我们大部分人无法完成的高级 ”行为准则“。那如何做到 ”自知“(认知职责)呢,那首先要对自己所拥有和管理的数据所传递出来的信息(对象封装的数据)有充分的认知,这是最起码的一个标准,我们可以对人进行建模,身高 175 是一个什么样的身高,体重140斤,符不符合大众审美的范围之内,这就是一个很起码的认知。

 

认知职责共有三重境界:“了解自己”,“了解身边的人和事”,“六度分隔隔山打牛”。看起来就不严肃啊,确实是我瞎编的“专业词汇”。一个人知道自己的身高,体重,性别,产地等等,这些只是认知职责中最低层次的境界,对应的就是面向对象中属性封装的概念,一个对象能够获取到自己的属性就像一个人知道自己的身高体重,分内的事儿,没啥好骄傲的,认知职责的第一重境界 “了解自己” 修炼起来还是比较容易的~

 

然后就是第二重境界:“了解身边的人和事”,说的是对相关对象的认知,相关对象并不是一个难以理解的概念。我们说过,程序世界就是现实世界的映射,不光是简单的静态的事物的映射,更是社会规则的映射。虽然在程序世界中,我们可以突破物理世界的规则,但是依旧突破不了人思维上的规则,不然咱们就不是人了,是畜生,是禽兽。而说到社会规则,其实说的就是人与人之间,组织与组织之间,人与组织之间的复杂关系和规则演变。在面向对象编程技术中,我们也会定义 对象与对象之间的关系,对象的关系有一对一的关系,一对多的关系,多对多关系,多样性的一对多的关系,多样性的多对多的关系等等。这个时候就不光要知道自己本身的属性特征,还要能 ”感知“ 到关联对象。这里有直接的关系,也有间接的关系,但是不同“事物”之间的关系是明确的,不是模糊的,这段话有点绕啊,但是举几个大熟栗子就好了。比如说 Codinget 在电商平台下了 3 个订单,那 codinget 这个对象就应该能 “认知” 属于自己的这单个订单。而通过这 3 个订单呢,也可以知道是谁下的订单,在设计对象的时候使用关联字段就能够很容易的实现这个功能了,在订单类中定义 user_id 作为 关联字段 即可,codinget 下单的时候,他的 user_id 值就会保存在订单对象的 user_id 字段中,这是一对多关系的典型事例,也是直接关联的典型栗子,在面向对象中的一对一,一对多,多对多其实都是直接关联,都是通过 一层关联字段 直接定义对象与对象之间关系的。而那些通过多层关联字段进行关联的对象与对象的关系呢,就是间接的关系,但无论直接的还是间接的,他们都是通过强绑定机制关联起来的(关联字段)。

 

最后呢说说 “认知职责” 中最高级也是最霸气也是最复杂的的境界:“六度分隔隔山打牛” 。啥是六度分隔呢,很多人应该听过啊,它又称为 “小世界现象”,大白话说就是:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任何一个陌生人。” 。这也并不难理解,有些相关联的事物无法直接获得,没有关联字段等直接或间接的关联方式和获取方式,但是却能够通过 某种方式推导或者计算出来,是不是挺像数据库的 模糊查询 的,反正就这么个意思吧,可以通过多个筛选条件,把模糊的相关联的对象找出来。不要觉得不好理解,其实我们每天都在被 ”算计“ 中,不管是淘宝还是京东天猫,咱们的用户画像人家早就研究得透透的,每天都会为咱们推荐符合咱们年龄,收入水平,性别,家庭需要的各类商品。我们本身就是活生生被烤熟的栗子啊。这些商品信息中没有直接或间接的关联字段与买家进行绑定,但是通过 “用户画像” 和 “商品画像”,它们却能神奇的关联在一起。有一次我没招别人也没惹别人,但是那厮过来就把我一顿胖揍,就只是因为我在人群中多瞅了他一眼,偏偏他又是个东北人,我和挨揍就这么又缘分吗?而这一重境界的认知职责比模糊查询还要玄幻一些,实现起来也不是简单的模糊查询那么简单......六度分隔只是个浪漫的理论而已,不要因为它出名就觉得它真的行得通。

 

至此呢,大家应该明白为什么我说上一篇文章的信息专家是半吊子专家了,因为上篇文章重点说了它的认知职责的第一重境界,没有说它关联对象这部分内容。而说到半吊子,我们又何尝不是呢,如果我们不了解身边的人和事,没有身边的人作为衡量标准,我们又如何对自己做评判和定位呢?小时候课本上说过一只坐井观天的青蛙,当我们无法与这个世界联系的时候,就会非常悲剧的无法对社会和自己进行基本的认知,认知都出了问题,又何谈行动?

 

通过上面的一通啰嗦,希望你已经知道职责中的 认知职责 是怎么一回事了。职责分为 认知职责行为职责,对应的就是 “知” 和 “行” 这两回事,我们解释清楚了认知职责后,行为职责就非常容易理解了,一个类对象的行为必然“不是跟自己相关”就是“跟与自己关联的类对象相关”,这个时候我可以非常勇敢的贴出官方极为晦涩的定义和描述了,对象的行为职责包括:

 

  • 自身执行一些行为,如创建对象或计算
  • 初始化其他对象中的动作
  • 控制和协调其他对象中的活动

 

人都有犯懒的时候,而我现在就要懒一下了,前面我已经抛了足够盖房子的砖,行为职责这部分的引玉工作就交给朋友们用小脑思考和理解一下吧,基本已经没啥难度了,知行合一是一个很大达到的境界,真的难在“行”吗,很多情况下,可能还是因为我们无知,或者说咱们并不是真的“知”,只是在自以为是而已~