我正在研究案例记录系统。每个案例都可以附加注释,因此我将创建一个Case类和一个Comment类,并在Case类中嵌入一个Comment对象。
我正在考虑如何为嵌入的Comment对象提供接口。我可以让它成为一个公共成员并让程序员直接访问它($case -> comment -> addComment()
),或者将其设为私有,并将方法放在Case类中,以通过Comment对象提供对注释的访问(p {{1} })。
考虑到这一点,后一种风格意味着Case对象变得依赖于Comment对象。但是,在前一种情况下,程序员可能能够做一些事情,比如使Case对象的comments属性引用不属于case的注释,甚至是不是注释对象的项目!
这两种方法中哪一种被认为是最佳实践?
答案 0 :(得分:1)
Case类应该有自己的方法来添加/删除注释。这使您可以更改将来实施注释的方式。您可以让这些方法现在简单地将调用包装到您的Comment类中,但将来会完全更改它。
答案 1 :(得分:1)
我不完全明白你的意思,但是......
我认为你需要这样的东西:
class Case {
private $comment;
public function getComment() {
// Add some checks if necessary
...
return $this->comment;
}
public function addComment(Comment $comment) {
// Add some checks if necessary
...
$this->comment = $comment;
}
}
您还可以选择让您的$ comment受到保护。如果要扩展对象,这尤其有用。
始终大量使用封装,这是OOP的最大优势之一。使类属性受保护或私有是明智的。没有它,您在设置属性时无法强制检查它。请记住,如果您公开财产,每个班级都可以访问和修改它,而无需任何检查。考虑一下可能产生的后果!
$ comment不是基本类型,它是对comment clas实例的引用
祝你好运!@Gordon:没关系。即使它是评论的一个实例并且您将其公之于众,您仍然可以这样做:
// $Case is a Case object, doh ;)...
$Case->comment = "Just a string value";
突然你的评论是一种原始类型,而你期望一个Comment类的实例...这会给你带来几个错误。如果你把它变成一个受保护的或私有的属性,那么代码行就不可能在类之外了。然后你被迫使用一个setter就像:
public function setComment(Comment $comment) {
...
}
您的函数需要一个Comment,如果给出其他内容,则会抛出错误。这将确保您的对象一致。
@Gordon:这不是您在Case类中构建的Comment类方法。只有Case类才需要上述方法。他们唯一做的是获取属于Case类的Comment对象,设置属于Case类的Comment对象。使用getter成功检索Comment对象后,可以触发Comment类中定义的所有公共方法。所以它对Comment对象本身没有任何作用。
您的评论仍然完全独立。这些对象之间的关系(很可能)保存在Case对象的表中。你的Case类是唯一知道这种关系的类。因此,您仍可以将评论类重新用于其他目的。
你的Case类需要以某种方式知道你的Comment类,这是要走的路!
BTW,考虑多对多的关系。我假设一个案例可以有多个评论。 祝你好运!