2016-06-26 6 views
3

В настоящее время я реорганизую огромный коммутатор, который анализирует страницу с процедурного кода на ООП.Рефакторинг процедурного кода в ООП, трудности с областью определения

У меня есть несколько классов-разработчиков, которые нуждаются в нескольких зависимостях, имеющих проблемы с определением области охвата на данный момент.

Это фрагмент кода перед:

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.

Вопросы:

  1. Как я могу использовать строитель-объект в мой осколочных-объекты?
  2. Некоторые объекты сохраняются в базе данных, поэтому, когда я использую ссылочные переменные внутри новых объектов, эти ссылки также будут сохранены?
+0

Я всегда старался избегать хранения объектов в их исходной форме в базе данных. Дайте им метод, подобный 'public function storeInDatabase()' и 'public function RetrieveFromDatabase()', который хранит только основные данные объекта, предпочтительно сопоставляя свойства с полями столбца базы данных. Объекты PHP должны оставаться на PHP, а база данных должна содержать достойные данные, с которыми вы можете работать, даже без PHP. –

+0

Спасибо за ваш комментарий, я это рассмотрю. Однако это не отвечает на мой вопрос, есть ли у вас предложение? – Abayob

+0

Это был ответ на вопрос 2: Не храните необработанные объекты в базе данных. Если есть связи между объектами, вы должны сделать их явными, с уникальными идентификаторами и хранить их в базе данных. Я не совсем понимаю ваш первый вопрос, вы используете какие-то рамки? Возможно, кто-то другой может ответить на него? –

ответ

1

Образец инъекции зависимостей действительно поможет решить проблемы с определением области видимости. Вот хорошая статья об использовании шаблона инъекции зависимостей в PHP: http://fabien.potencier.org/what-is-dependency-injection.html

+0

Спасибо за ваш ответ :) Я как-то понял это на себе, но это то, что я использовал так, для меня это правильный ответ – Abayob

Смежные вопросы