0

我有以下对象:L1User, L2User, L3User(都继承自User)和Document.
每个用户都可以创建文档,但根据用户类型,文档将具有不同的状态。因此,如果是L1User,将创建带有L1状态等的文档:

在此处输入图像描述

解决方案1
​​请注意,文档创建后会保存在数据库中,所以对象中自然有一个create_document(User user)方法Document。在方法主体中,我可以检查用户的类型并手动设置适当的状态。这种方法对我来说似乎不是面向对象的。

解决方案 2
好的,所以下一个方法是让所有用户实现一个通用方法(比如create_document(Document doc)),该方法将设置与用户关联的状态并将文档保存在数据库中。我的疑问是文档应该保存在它自己的类中,而不是用户。

解决方案3
所以最后的方法与上面类似,除了用户将修改后的文档对象返回给它的create_document(User user)方法并在那里执行保存。该方法的定义如下:

create_document(User user)
{
   this = user.create_document(this);
   this->save();
}  

这对我来说似乎也不合适......

任何人都可以提出更好的方法吗?

4

1 回答 1

1

我认为从 OO 的角度来看,解决方案 2 和 3 都可以,因为您正确地将状态分配委派给用户对象(与解决方案 1 相反,您基本上是在根据用户类型进行切换)。选择2还是3更多的是个人喜好问题。

但是,我有一个疑问:为什么要将文档传递给create_document()方法?我会选择一个最能描述其功能的消息名称。例如,在解决方案 3(我最喜欢的解决方案)中,我会选择:

Document>>create_document(User user)
{
   this = user.create_document();
   this->save();
}  

进而

L1User>>create_document()
{
return new Document('L1');
}

或者

Document>>create_document(User user)
{
   this = new Document()
   this = user.set_document_type(this);
   this->save();
}  

进而

L1User>>set_document_type(document)
{
document.setType('L1');
}

编辑:我一直在思考这个问题,实际上还有第四个解决方案。但是,以下方法仅适用于文档的状态在其生命周期内不发生变化的情况,并且您可以使用 getter 而不是属性映射 DB 字段。由于文档已经知道用户并且状态取决于用户,因此您可以委托:

Document>>getStatus()
{
   return this.user.getDocumentStatus();
}  

高温高压

于 2012-11-15T12:13:09.993 回答