В настоящее время я реорганизую огромный коммутатор, который анализирует страницу с процедурного кода на ООП.Рефакторинг процедурного кода в ООП, трудности с областью определения
У меня есть несколько классов-разработчиков, которые нуждаются в нескольких зависимостях, имеющих проблемы с определением области охвата на данный момент.
Это фрагмент кода перед:
function parsePage($sLanguageCode) {
$oTranslator = new translator($sLanguageCode);
$aTranslations = $oTranslator->translations('page');
$oBuilderClass = new builder($aTranslations);
//... queries to get data and set pagedata and get the template file
$oPageData = $oPage->getData();
$aTemplateTags = $oTemplate->getTags();
foreach($aTemplateTags as $sTag) {
switch($sTag) {
case 'php':
if(is_object($oPageData->getPhp())) {
include $oPageData->getPhp()->getData();
} elseif(is_array($oPageData->getPhp())) {
foreach($oPageData->getPhp() as $oElement) {
include $oElement->getData();
}
}
break;
case 'element':
if(is_object($oPageData->getElements())) {
$oBuilderClass->buildElement($oPageData->getElements()->getData());
} elseif(is_array($oPageData->getElements())) {
foreach($oPageData->getElements() as $oElement) {
$oBuilderClass->buildElement($oElement);
}
}
break;
//... A lot more cases here, like 20
}
}
//....
}
Как вы можете видеть выше, есть много повторяющегося кода присутствует, и мне нужно извлечь данные в большем количестве функций, таким образом, я хотел, чтобы инкапсулировать логика внутри объектов для предотвращения дублирования кода. Это отрезала кода в ООП:
function parsePage($sLanguageCode) {
$oTranslator = new translator($sLanguageCode);
$aTranslations = $oTranslator->translations('page');
$oBuilderClass = new builder($aTranslations);
//... queries to get data and set pagedata and get the template file
$oPageData = $oPage->getData();
$aTemplateTags = $oTemplate->getTags();
foreach($aTemplateTags as $sTag) {
$oPageData->outputData($sTag);
//....
}
Класс pageData, содержащий все данные-объекты, выглядит примерно так:
class pageData {
protected $aPhpFragments;
protected $aElementFragments;
public function outputData($sTag) {
switch($sTag) {
case 'php':
foreach($this->aPhpFragments as $oPhpFragment) {
$oPhpFragment->render();
}
break;
case 'element':
foreach($this->aElementFragments as $oElementFragment) {
$oElementFragment->render();
}
break;
}
}
}
Некоторые из классов данных выглядит следующим образом:
class phpFragment {
private $sData;
function render() {
return include $oElement->sData;
}
}
class elementFragment {
private $sData;
function render() {
echo $oBuilderClass->buildElement($this->sData);
}
}
Большинство этих объектов данных могут отображать их содержимое без каких-либо зависимостей, но некоторым требуется несколько объектов-построителей/данных. Как и класс elementFragment, для этого требуется $ oBuilderClass с набором переводов. Я только хочу создать эти объекты dependecy один раз, потому что некоторые из них довольно большие и, например, содержащий много переводов. Объекты данных становятся сериализованными и хранятся в базе данных MySQL.
Вопросы:
- Как я могу использовать строитель-объект в мой осколочных-объекты?
- Некоторые объекты сохраняются в базе данных, поэтому, когда я использую ссылочные переменные внутри новых объектов, эти ссылки также будут сохранены?
Я всегда старался избегать хранения объектов в их исходной форме в базе данных. Дайте им метод, подобный 'public function storeInDatabase()' и 'public function RetrieveFromDatabase()', который хранит только основные данные объекта, предпочтительно сопоставляя свойства с полями столбца базы данных. Объекты PHP должны оставаться на PHP, а база данных должна содержать достойные данные, с которыми вы можете работать, даже без PHP. –
Спасибо за ваш комментарий, я это рассмотрю. Однако это не отвечает на мой вопрос, есть ли у вас предложение? – Abayob
Это был ответ на вопрос 2: Не храните необработанные объекты в базе данных. Если есть связи между объектами, вы должны сделать их явными, с уникальными идентификаторами и хранить их в базе данных. Я не совсем понимаю ваш первый вопрос, вы используете какие-то рамки? Возможно, кто-то другой может ответить на него? –