与内部对象连接

时间:2010-11-11 07:28:38

标签: php oop design-patterns

我正在研究案例记录系统。每个案例都可以附加注释,因此我将创建一个Case类和一个Comment类,并在Case类中嵌入一个Comment对象。

我正在考虑如何为嵌入的Comment对象提供接口。我可以让它成为一个公共成员并让程序员直接访问它($case -> comment -> addComment()),或者将其设为私有,并将方法放在Case类中,以通过Comment对象提供对注释的访问(p {{1} })。

考虑到这一点,后一种风格意味着Case对象变得依赖于Comment对象。但是,在前一种情况下,程序员可能能够做一些事情,比如使Case对象的comments属性引用不属于case的注释,甚至是不是注释对象的项目!

这两种方法中哪一种被认为是最佳实践?

2 个答案:

答案 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,考虑多对多的关系。我假设一个案例可以有多个评论。

祝你好运!