拆分大型PHP类

我有一个很大的类(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).

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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...