如何最好地将一个巨大的类分解成几个子类PHP / OOP


How to best deconstruct huge class into several sub classes PHP / OOP

首先,我想让代码做的一切,它都做到了。这个问题是关于代码结构,面向对象和相应的设计模式。

好的,我有一个javascript前端和一个PHP后端。我在一个巨大的事件类中访问几个函数,使用几个AJAX php文件。

它们中的一个像这样访问事件类中的功能:

$event = new Event();
$event->storeFormValues($_POST);
$event->newEvent();

在我开始考虑如何更好地构建代码之前,事件类有600多行代码和函数,为我提供有关事件的数据库信息。

现在我把事件类分成两个部分,一个事件类基本上看起来像这样(它已经扩展了一个小的连接类,它处理mysql连接):

class Event extends Connection {
    public $eventHead = null; // event title
    public $eventBody = null;
    public $eventID = null;
    ...
    public function __construct($data = array()) {
        if (isset($data['eventHead'])) {
        $this->eventHead = stripslashes(strip_tags($data['eventHead']));
        }
    ...
    }
    public function storeFormValues($params) {
    //store the parameters
    $this->__construct($params);
    }
}

和一个NewEvent类,它具有在数据库中添加新事件所需的所有功能。(仍然大约500行代码)。

我为所有返回事件信息的函数创建了一个单独的类:

class EventInformation extends Event {
    public function getEvent() {  
    }
    public function getParts() { 
    }
}

对我来说,这很清楚,EventInformation类继承了Event类的功能,所以我可以首先通过storeFormValues函数存储eventID,然后像这样在我的ajax文件中访问该函数:

$information = new EventInformation();
$information->storeFormValues($_POST);
$data = $information->getEvent();

但是现在我被困在如何进一步解构我的NewEvent类,它有我需要添加一个新的事件的所有功能,就像我之前所说的。现在(在我将事件类分成两部分之后)看起来像这样:

$event = new NewEvent();
$event->storeFormValues($_POST);
$event->newEvent();

newEvent类中的newEvent函数是这样的:

public function newEvent() {
    try {
        parent::mySQL_connect();
        $this->connection->beginTransaction();
        $this->setOldEventPosition();
        $this->setNewEventPosition();
        $this->findEmptyEventSpot();
        $this->updateOldEvents();
        $this->insertEventData();
        $this->insertPartData();
        $this->establishNewEventConnection();
        $this->establishEventPath();
        $this->connection->commit();
        return true;
    } catch (PDOException $e) {
        $this->connection->rollback();
        return $e->getMessage();
    }
}

好吧…所有这些函数本身都很长,可以是几个类。但我怎么做才是正确的呢?

我想为我的newEvent函数的每个函数创建一个类(因为它们都做不同的事情)。但是所有的函数都依赖于其他函数所设置的变量。

我特别注意到我的newEvent函数有一个问题…因为我如何让它从我创建的所有类中扩展?

它需要看起来像这样(这是不可能的):

EventActions extends setOldEventPosition extends setNewEventPosition, etc...

如果你知道我在说什么…

或者我不应该为newEvent函数创建一个单独的类,只是在我的ajax文件中添加一个新的Event,像这样:

$event = new NewEvent();
$event->storeFormValues($_POST);
$event->mySQL_connect();
$oldEventPosition = new OldEventPosition();
$oldEventPosition->getOldEventPosition();
$oldEventPosition->setOldEventPosition();
$newEventPosition = new EventPosition();
...

但是我真的想把我的newEvent函数放在一个单独的类中。我该怎么做呢?

如果我让所有与创建新事件相关的类扩展"previous"类,如下所示:

class OldEventPosition extends NewEvent {
}
class NewEventPosition extends OldEventPosition {
}
...

我的类(newEvent函数所在的地方)需要扩展这个链中的最后一个类…这在我看来是不对的,不是吗?

类是用来逻辑地封装和分组功能的。

例如,您的SQL连接器应该是一个独立的类,在将该对象传递给Event的实例之前进行初始化并建立连接。

为特定的函数编写类没有多大意义。NewEventEventPositionOldEventPosition之间真正的逻辑区别是什么?也许一个带有额外帮助函数的数据库实用程序类对您有用。