最近终于稍微有点空了,
jdon007,看了你这个帖子中提到的理论和例子,我有很多问题想确认:
1)问题一:
2011年08月31日 07:51 "@jdon007"的言论
// 3.2) 还书,
ReturnBookContext returnService = new ReturnBookContext();
returnService.returnBorrowedBooks(borrowedBooks ...
BorrowedBook是行为特征,在你的例子中,因为过于简单,borrowedBooks没有从某个持久化层获取;而真正的系统,当你要还书时,borrowedBooks肯定要从某个持久化层(比如数据库)获取的。如果要这样,你会如何做呢?如何在还书之前获取borrowedBooks?按照我的理解Book是模型,BorrowedBook是角色,即你说的行为特征,而Eric Evans的DDD理论中的Repository是针对Aggregate的;之前你说过,行为特征相当于DDD中的Aggregate,所以,是否意味着BorrowedBook应该从一个名叫BorrowedBookRespository的仓储去取呢?因为据我了解Repository都是针对Aggregate的,而据你所说,Aggregate相当于行为特征;按照这样理解的话,是不是意味着单独的Entity,即你所说的模型就无法被持久化或重建了呢?有这个疑问的原因是你并没有提到关于如何持久化/重建 模型或行为特征。我相信有很多情况模型是没有参与任何业务场景(即不需要扮演任何角色,也就是你所说的凝聚行为特征)就会被持久化或重建的;
2)问题二:
我无法理解并且感觉很别扭的一点是,为什么模型Book会知道自己还有多少本库存?即Book为什么会具有一个BookCounter?我觉得你一味的强调如何建模,而忽略了建模最重要的思想,那就是一切建模结果要能体现业务,任何属性或职责的分配要完全根据业务需要来。在我看来,Book就是Book,它怎么知道自己现在还有多少本在书架上,只有图书馆在清楚某本书目前还有多少本库存。试想一下,如果某本Book被借走了,但是Borrower却能通过这本Book知道目前图书馆还有多少本这个书的库存,那是不是有点可笑?现实生活中,如果要查询某本书在图书馆还有多少本可存,必须要通过图书馆才能查询得到;
3)问题三:
我觉得你对一件事情不太重视,那就是属性的只读问题,如果真正地在对业务进行建模,那应该深刻了解业务需求,比如被借的书(BorrowedBook)的借书人和借书时间这两个信息是随着BorrowedBook的被创建而诞生的,并且最重要的是这两个信息也从此不可能被修改,但你却给这两个信息提供了set,这意味着我可以随便随时修改这两个信息,这就会导致领域模型的业务逻辑不安全,不可控;真正的领域模型不仅能表达业务实体,业务规则,以及业务实体之间的交互,从而帮你做事情;更重要的一点是,它一定是业务安全的,即你无法利用它来做任何违反业务规定的事情,否则这样的领域模型即便设计的再好也是非常危险的;所以,我觉得你在设计模型或角色时,对于构造时初始化属性还是提供Set来初始化属性方面还需要注意,不能太随便;
4)问题四:
记得之前你最早的版本中,是有图书卡的,即Card,而现在的模型中没有了Card,取而代之的是Account,即帐号,这两者是同一个意思吗?如果是,那么Account和用户之间的关系是什么样的?是不是多对多的关系,即一个用户理论上可以使用多个Account登录,然后做借书或还书的事情;同一个Account理论上也可以被不同的用户使用,只要那些用户知道该帐号的使用密码权限;也就是说用户和Account是使用者与被使用者的关系,而这个关系正式用户和Card之间的关系;用户是系统使用者,是行为驱动者,Account是行为拥有者;我是不是可以理解为你正是由于理解了这一点才把原来的Card替换为了Account呢?
5)问题五:
记得之前你谈到过,Account即是模型,也是角色;并且你说过只有角色才可能有交互行为的,模型拥有的是非交互的行为;在你这里最新版本的图书借阅的例子中,Account拥有了借书和还书的行为,这两个是交互行为;但是你说Account是模型,而非角色,即你所说的行为特征,那是不是有点问题呢?是不是应该分开,即搞一个Account模型,它没有借书和还书的交互行为;再搞一个Borrower角色,它有借书和还书的行为;这样是不是更严谨,更符合你所提到的建模理论呢?
6)问题六:
如果真的要分行为特征或角色的话,那为什么“被借的书”(BorrowedBook)的还书时间也属于这个“行为特征”或角色呢?按照我的理解,我会觉得很奇怪,因为被借的书不应该也不需要存储还书时间这个信息,在还书场景中,没有“被借的书”这一行为特征,而只有“被还的书”这一行为特征,并且“被还的书”才应该具有还书时间这个信息,这样才对称,才准确地不多不少地符合角色所表达的含义。你是不是觉得这样会导致角色泛滥而直接把还书时间也放在BorrowedBook这个“行为特征”上呢?如果是这个原因,你能说一下何时该创建角色,创建角色的度在哪里吗?
暂时只想到这些问题了,我说话的态度可能不是太客气,请不要见怪,我没有任何针对您的意思,呵呵。
[该贴被tangxuehua于2011-09-05 22:57修改过]
[该贴被tangxuehua于2011-09-05 23:00修改过]