对象是否应始终封装其方法所依据的数据?

时间:2015-02-11 04:46:44

标签: php oop design-patterns immutability

我正在开发一个PHP类RequestSanitize,它将处理一些原始用户输入。我能做到的一种方法是:

class DataSanitizer implements DataSanitizerInterface {
    protected $_schema;

    public function __construct($schema){
        $this->_schema = $schema;
        // Blah blah blah
    }

    public function sanitize($data) {
        $sanitizedData = [];

        // Blah blah blah populate $sanitizedData

         ...
        return $sanitizedData;
    }
}

因此,基本上该类只用于在调用sanitize时提供模式。因此,它会像这样使用:

$ds = new DataSanitizer("/path/to/schema");
$sanitizedData = $ds->sanitize($_GET);

在这种情况下,我甚至可以使sanitize成为静态成员。

另一种选择是:

class DataSanitizer implements DataSanitizerInterface {
    protected $_schema;
    protected $_sanitizedData = [];

    public function __construct($schema){
        $this->_schema = $schema;
        // Blah blah blah
    }

    public function sanitize($data) {
        // Blah blah blah

        $this->_sanitizedData = ...
        return $this;
    }

    public function data(){
        return $this->_sanitizedData;
    }
}

将会像这样使用:

$ds = new DataSanitizer("/path/to/schema");
$ds->sanitize($_GET);
$sanitizedData = $ds->data();

在即时设计和未来可扩展性方面,一种设计模式比另一种更有意义吗?或者,我应该使用第三种可能更好的设计模式吗?

2 个答案:

答案 0 :(得分:1)

我更喜欢选项#1。它更清洁,更容易使用IMO,而选项#2在1日内没有提供任何好处或功能。

在更高层次上考虑它,封装用于隐藏数据和用于完成类中定义的任务的实现细节。在选项#2中,你并没有真正隐藏实现细节,你基本上要求课程为你存储一些不必要的东西,并以“封装”为幌子。

如果您处于多线程环境中,选项#1还可以更轻松地跨线程重用对象。这对于你实际用于卫生的东西的重入性质做了很多假设,但#2基本上让你为每个线程创建卫生对象,再次存储对于函数不必要或核心的数据该课程。

答案 1 :(得分:0)

从我的角度来看, 如果使用接口类,则可以在接口上定义属性和函数。因为接口可以从多个类实现。 如果是这样的话,方法1应该更方便。

如果您只使用类而不使用其他接口,那么使用方法2会更好。