“卡是用户的映射”这并不是我的观点,我的观点早已说明了:“领域中不存在卡”。甚至我认为存折上的记录只是一个View层的东西。
“卡是用户的映射”是我从jdon007的代码中读出来的。因为他从“人使用卡”出发,认为是“卡”才是行为的执行者。
(我的习惯是用记事本写回复,然后复制过来提交的,忘记提交了-。-|||,以下是我之前想要说的:)
看来你,还是不了解我之前所讲的:内存领域中的实体和现实(或应用层的实体)不是同一个实体。这两者不是等价关系的。上面liam就已经说过“领域内的角色(Role)”。我从来也没说过,领域实体(参与者)只能对应一个现实实体(系统用户)。
应用驱动者与领域角色(场景参与者等)不是同一个。你完全可以认为内存领域中的实体“我”,不是我,它是一具行尸走肉,只不过它带着我的信息而已(从这里看,和你card很像),现实中我点击存钱,则系统产生存钱场景,内存领域中的“我”和相关实体进入场景,执行交互。现实中的我换一个帐号,则内存领域中出现另一个实体“我”。因为存在注册登录认证过程,所以可以称这样的一“我”为我的镜像。镜像的意思并没有现实中的我干什么,内存中的“我”干什么,而是我有什么,他也有什么,而镜像不像影子,镜像可以无限多,而影子只有一个(当然不是完全的,与领域相关的个人信息才会存在上面,这跟你的Card理解是一样的,但是我不叫Card,我叫他为Reader,一个领域角色,而且我的Card另有所属——应用层登录)。镜像,没人说过只有一个。
领域中有很多的参与者,但这些参与者并不等于用户。因为注册后领域中就出现“我”,所以叫镜像,多次注册,就会出现多个镜像,你去申请多张卡,就会出现多个“你”镜像。而领域看到的是镜像,而非你,或者说领域认为那就是“你”。领域中所发生的事与现实中的系统用户无关,只与领域中的角色相关。
若果你真要说人使用杯子喝水的方式去理解的话,翻译过来就是人使用卡去借书。于是Card.borrowBook(Book);则有Cup.drink(Water);突然有一天人不用杯子喝水,把嘴张着,直接在水龙头下面接水喝,那这是Tap.drink(Water);?!?!
比起这样,我觉得Reader.borrowBook(Book);Drinker.drink(Water);更加自然。加入场景思维的话,可表示为borrowBookContext(Reader,Book).borrowBook();(BorrowBookContext.borrowBook(Reader,Book);)。这样看起来多自然。若果需要考虑使用物而引起不同效果的话,则增加方法(Reader.borrowHistoryBook();Reader.borrowBook(HistoryBook);),或者引入策略(BorrowBookContext(Reader,Book).borrowBook(HistoryBookStrategy);BorrowBookContext.useStrategy(MathsBookStrategy).borrowBook(Reader,Book);,或者增加使用物实体进入场景,同时把策略放到使用物实体上(这样可以简化)。当然,使用Mixin的写法又不一样了。
人使用刀去杀人,杀人的是刀,人不在领域,不在场景中,所以有不在场证明成立,最后判决——无解。(我觉得,理解驱动者,和参与者就能很好解析这句话错误了。)驱动者可以理解为客观规律(或者“道”),或者上帝,他们促使(规定/要求)这样的场景发生,于是参与者人.杀(人);,当中为啥没“刀”,因为并非关注点。若果刀也需要关注的话,那么刀决定效果,而并非决定行为。(或者当作看电影也可以)
分清楚:“系统使用者”与“领域角色”(或者“场景参与者”)不是同一个东西。人使用卡,是使用系统,并非在谈领域,卡是依赖系统的,并非依赖领域的。若果把卡归到核心领域,那么这样的核心模型就只能适合使用卡的图书馆了。(当然现在大多数是这样)
关于图书馆聚合根,的确,在图书馆领域中,人的方方面面都是和图书馆在打交道。如买菜者是跟卖菜者交互。如jivejdon的account跟forum(不过我个人意见认为account应该分离出passport和user,所以我之前有一篇帖子说过,user不应该存在account和password,因为这些不是领域业务,而是进入领域,一切开始之前的条件,这是题外话了)。
可以把这样的思维写成一个填词句子:( )与图书馆进行借还书行为。我填的是Reader,jdon007填的是Card。我俯视领域,我看到Reader在和Library交互。而jdon007看到的是Card在和Library交互,而我认为这样的Card模型是在拟人化。而非直接性拟人化也未尝不可。
[该贴被SpeedVan于2011-02-13 13:27修改过]
[该贴被SpeedVan于2011-02-13 14:25修改过]