php - 拆分一个大的 PHP 类

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

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

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

最佳答案

正如@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.
    

这样你也可以分解你的类(即:分离一个处理数据库连接的类并将其注入(inject) FooRepository 等)。但我不认为拥有代表 Action 的类是可行的方法吗?

类是可以执行操作(以及其他操作)的对象,而不是操作(由于您在示例中使用的名称,这只是注释 :p)。

关于php - 拆分一个大的 PHP 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37305513/

相关文章:

javascript - 如何在 php 中使用 javaScript 值

php - Symfony3 Form 组件尝试将 null 传递给 PHP 7 中的类型提示方法

php - 如何列出具有特殊(挪威语)字符的文件

Java 对参数化类型的原始引用不尊重参数

c++ - 如何在 E_NOTIMPL 和 E_NOINTERFACE 之间进行选择?

php - 使用 :hover for an element's inline style (using HTML/CSS/php)

Java类的用途非常有限,但不限于一个类。外在还是内在?

python - 在 python 中使用继承

c++ - 如果将 a 类实例声明为 A a,那么 a 类实例将位于内存中的哪个位置?

java - 从 RadioButton 计算分数