我有一个很大的班级(1500行,但很快会很多次),我想分开,以便它更适合SRP(并且每个文件都更小,更多管理。)
该类包含50-100个属性,并且针对它执行了几种不同类型的操作 - 其中一种是status()
,而后者又执行了几个步骤,例如更新数据库和发送电子邮件
所以我想我想要4节课。
我应该如何构建类?
这是我现在所拥有的简化版本:
update
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);
或者我应该以某种方式使用继承或特征?
答案 0 :(得分:2)
我想发送电子邮件是一回事,代表您的数据是另一个,对数据库的读写操作将是第三个。
所以class Foo
,class FooPersistence
,class FooMailer
任何致电 FooPersistence::update($foo)
的人也应该致电FooMailer::sendUpdateNotification($foo)
。
作为旁注:
如果你有类似事件的设置,我会在持久化类中触发“更新事件”,并为其发送一个发送电子邮件的监听器。
答案 1 :(得分:2)
正如@SparK所说,
一个包装它的类(FooManager)
$foo = new Foo($params);
$fooManager = new FooManager(FooRepository, Mailer);
$fooManager->update($foo);
$fooManager->notify($foo); //this could be inside the update or an event.
这样你也可以分解你的类(即:分离一个处理数据库连接并将其注入FooRepository的类等)。但我不认为有代表行动的课程是要走的路吗?
类是可以执行操作的对象(除其他外),而不是操作(由于您在示例中使用的名称,这只是注释:p)。