OOP - 何时使用属性与何时使用返回值

时间:2014-06-02 15:13:57

标签: oop design-patterns

我正在设计一个应该每天在工作中运行的流程,并且我已经编写了一个类来完成工作。它看起来像这样:

class LeadReport {

    public $posts               = array();
    public $fields              = array();

    protected _getPost() {
        // get posts of a certain type
        // set them to the property $this->posts
    }

    protected _getFields() {
        // use $this->posts to get fields
        // set $this->fields
    }

    protected _writeCsv() {
       // use the properties to write a csv
    }

    protected _sendMail() {
       // attach a csv and send it
    }
    public function main() {
        $this->out('Lead Report');
        $this->out("Getting Yesterday's Posts...");
        $this->_getPosts();
        $this->out("Done.");
        $this->out("Next, Parsing the Fields...");
        $this->_getFields();
        $this->out("Done.");
        $this->out("Next, Writing the CSVs...");
        $this->_writeCsv();
        $this->out("Done.");
        $this->out("Finally, Sending Mail");
        $this->_sendMail();
        $this->out('Bye!');
    }
}

在向我的一位同事展示此代码之后,他评论说_get()方法应该有返回值,并且_write()和_sendMail()方法应该使用这些值作为参数。

所以,有两个问题: 1)在这种情况下哪个是“正确的”(属性或返回值)? 2)是否存在一般规则或原则来控制何时使用属性而不是何时在面向对象编程中使用返回值?

1 个答案:

答案 0 :(得分:1)

我想也许你问题的根源可能来自于你并不完全相信使用属性比拥有公共字段更好。例如,此处的常见做法是不应将postsfields视为公开。您应该使用getField方法或Field受保护的属性来管理对这些字段的访问。拥有受保护的getField和公众fields并不是真的有意义。

在这种情况下,你的同事可能会指出两件事。事实上,您需要使用属性而不是公共字段,以及事实上最好将帖子传递给方法,如果可以的话,不要让方法访问属性。这样您就不必在调用方法之前设置属性。可以将其视为记录方法操作所需内容的一种方式。通过这种方式,另一个开发人员不需要知道需要为该方法设置哪些属性。应该传递方法所需的一切。

关于为什么我们首先需要房产?为什么你不应该使用公共领域。不方便吗?确实是。我们使用属性而不是公共字段的原因是,就像OOP中的大多数其他概念一样,您希望对象隐藏其外部世界的详细信息,并只是为其状态定义良好定义的接口。为什么?最终隐藏实现细节并保持内部更改以消除(封装)。此外,访问属性还具有调试的额外好处。您可以在属性中设置断点,以查看变量何时更改,或者只是检查变量是否具有特定值。而不是乱扔乱码你的代码到处都是。还有更多的好东西,返回只读值,访问控制等。

总而言之,字段虽然是内部状态。属性(实际的get / set方法)虽然是与内部状态交互的方法。让外部对象与界面交互是笑脸。让外部阶级直接与内部状态互动是皱眉头。