我有一个很大的类(1500行,但很快就会好几倍),我想分割它以便它更适合SRP(并且每个文件都更小,更易于管理.)
该类包含50-100个属性,并具有针对它执行的几种不同类型的操作 – 其中一种是更新,而后者又执行多个步骤,例如更新数据库和发送电子邮件.
所以我想我想要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();
或者我应该以某种方式使用继承或特征?
解决方法:
我想发送电子邮件是一回事,代表你的数据是另一个,对数据库的读写操作将是第三个.
所以类Foo,类FooPersistence,类FooMailer.
无论谁调用FooPersistence :: update($foo),也应该调用FooMailer :: sendUpdateNotification($foo).