【发布时间】:2016-09-15 06:55:24
【问题描述】:
我有一个大类(1500 行,但很快会是数倍),我想拆分它,以便它更适合SRP(并且每个文件更小,更易于管理。)
该类包含 50-100 个属性,并有几种不同类型的对其执行的操作 - 其中之一是 update,它依次执行多个步骤,例如更新数据库和发送电子邮件。
所以我想我想要 4 节课。
我应该如何构建这些类?
这是我现在所拥有的简化版本:
class Foo {
public function __construct ($params) {}
public function update () {
$this->updateDatabase();
$this->sendEmails();
}
private function updateDatabase () {}
private function sendEmails () {}
}
$foo = new Foo($params);
$foo->update();
updateDatabase() 和 sendEmails () 都调用了许多其他方法 - 每个都有数百行代码,并且它们有几个同级方法执行其他任务。
使用静态方法的基本重写
class Foo {
public function __construct ($params) {}
}
class FooUpdate {
public static function update ($fooParam) {
FooUpdateDatabase::main($fooParam);
FooSendEmails::main($fooParam);
}
}
class FooUpdateDatabase {
public static function main ($fooParam) {}
}
class FooSendEmails {
public static function main ($fooParam) {}
}
$foo = new Foo($params);
FooUpdate::update($foo);
使用实例化对象的基本重写
class Foo {
public function __construct () {}
}
class FooUpdate {
private $foo;
public function __construct ($fooParam) {
$this->foo = $fooParam;
}
public function main () {
$fooTemp = FooUpdateDatabase($this->fooParam);
$fooTemp->main();
$fooTemp = FooSendEmails($this->fooParam);
$fooTemp->main();
}
}
class FooUpdateDatabase {
private $foo;
public function __construct ($fooParam) {
$this->foo = $fooParam;
}
public function main () {}
}
class FooSendEmails {
private $foo;
public function __construct ($fooParam) {
$this->foo = $fooParam;
}
public function main () {}
}
$foo = new Foo($bar, ...);
$fooTemp = new FooUpdate($foo);
$fooTemp->update();
或者我应该以某种方式使用继承或特征?
【问题讨论】:
-
我想你会在Code Review得到最(适当的)反馈。
-
@Marcus 请注意,Foo/Bar 标识符会使其成为不恰当的代码审查问题。
-
@200_success 好点。话虽如此,我认为这个问题是高度基于意见的。
-
@Redzarf - 我建议不要创建诸如
FooSendEmails{}甚至FooUpdateDatabase{}这样的限制性类考虑创建一个可以容纳各种方法的Email类执行您的各种操作。这将是您使用 Factory 类来实现多态性的好机会,例如,确定要发送哪种电子邮件(例如 HTML、纯文本、附件等),然后创建附加的 email 类型 i> 实现通用接口的类。那么FooInsertDatabase呢?FooSelectDatabase?创建单独的类来执行这些操作? -
@Marcus - 是的,我有单独的类来处理电子邮件的发送和数据库操作。所以
FooSendEmails()做了一些事情,比如构建要插入电子邮件模板的数据的显示版本,并确定电子邮件应该发送给谁——Foo独有的操作。
标签: php class oop design-patterns single-responsibility-principle