首先,我想让代码做的一切,它都做到了。这个问题是关于代码结构,面向对象和相应的设计模式。
好的,我有一个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
的实例之前进行初始化并建立连接。
为特定的函数编写类没有多大意义。NewEvent
、EventPosition
和OldEventPosition
之间真正的逻辑区别是什么?也许一个带有额外帮助函数的数据库实用程序类对您有用。