我正在开发一个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();
在即时设计和未来可扩展性方面,一种设计模式比另一种更有意义吗?或者,我应该使用第三种可能更好的设计模式吗?
答案 0 :(得分:1)
我更喜欢选项#1。它更清洁,更容易使用IMO,而选项#2在1日内没有提供任何好处或功能。
在更高层次上考虑它,封装用于隐藏数据和用于完成类中定义的任务的实现细节。在选项#2中,你并没有真正隐藏实现细节,你基本上要求课程为你存储一些不必要的东西,并以“封装”为幌子。
如果您处于多线程环境中,选项#1还可以更轻松地跨线程重用对象。这对于你实际用于卫生的东西的重入性质做了很多假设,但#2基本上让你为每个线程创建卫生对象,再次存储对于函数不必要或核心的数据该课程。
答案 1 :(得分:0)
从我的角度来看, 如果使用接口类,则可以在接口上定义属性和函数。因为接口可以从多个类实现。 如果是这样的话,方法1应该更方便。
如果您只使用类而不使用其他接口,那么使用方法2会更好。