拆分大型PHP类

时间:2016-05-18 16:38:41

标签: php class oop design-patterns single-responsibility-principle

我有一个很大的班级(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);

或者我应该以某种方式使用继承或特征?

2 个答案:

答案 0 :(得分:2)

我想发送电子邮件是一回事,代表您的数据是另一个,对数据库的读写操作将是第三个。

所以class Fooclass FooPersistenceclass FooMailer 任何致电 FooPersistence::update($foo)的人也应该致电FooMailer::sendUpdateNotification($foo)

作为旁注:
如果你有类似事件的设置,我会在持久化类中触发“更新事件”,并为其发送一个发送电子邮件的监听器。

答案 1 :(得分:2)

正如@SparK所说,

  • 你的对象(Foo)
  • 处理数据库通信的类(FooRepository)
  • 发送邮件的类(Mailer)
  • 一个包装它的类(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)。