2016-06-26 4 views
3

現在、プロシージャコードからOOPにページを解析する巨大なスイッチをリファクタリングしています。プロシージャコードをOOPにリファクタリングする、スコープが難しい

現時点でスコープの問題があるいくつかの依存関係を必要とするビルダークラスがあります。

これは、前のコードの抜粋です:あなたが上見ることができるようにそこに重複したコードの存在がたくさんあると私は、このように私はカプセル化したい、より多くの機能でデータを盗んする必要があり、

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 
     } 
    } 

    //.... 
} 

重複したコードを防ぐためのオブジェクト内のロジック。 これはOOPのコードのスニップです:

:データクラスのいくつかは次のようになり

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; 
     } 
    } 
} 

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); 

    //.... 
} 

InboundのPageDateクラス、すべてのデータ・オブジェクトを含む、ようになります

class phpFragment { 
    private $sData; 

    function render() { 
     return include $oElement->sData; 
    } 
} 

class elementFragment { 
    private $sData; 

    function render() { 
     echo $oBuilderClass->buildElement($this->sData); 
    } 
} 

これらのデータオブジェクトのほとんどは、依存関係なしにコンテンツをレンダリングすることができますが、いくつかのビルダー/データオブジェクトが必要なものがあります。 elementFragmentクラスと同様に、これには変換が設定された$ oBuilderClassが必要です。 私はこれらの依存オブジェクトを一度作成したいだけです。多くの翻訳が含まれています。 データオブジェクトがシリアル化され、MySQLデータベースに格納されます。

質問:

  1. がどのように私は私のフラグメント・オブジェクトにビルダーオブジェクトを使うことができますか?
  2. オブジェクトの一部がデータベースに格納されるため、新しいオブジェクトの内部で参照変数を使用すると、これらの参照も格納されます。
+0

私は、オブジェクトをそのままの形でデータベースに格納しないようにしています。 'public function storeInDatabase()'や 'public function RetrieveFromDatabase()'のようなメソッドを与えます。このメソッドは、オブジェクトの必須データのみを格納します。好ましくはプロパティをデータベースの列フィールドにマッピングします。 PHPオブジェクトはPHPのままでなければなりません。データベースには、PHPがなくても操作できる適切なデータが含まれている必要があります。 –

+0

コメントありがとうございます、私はそれを考慮に入れます。これは私の質問には答えませんが、あなたは提案がありますか? – Abayob

+0

これは質問2の答えです。生のオブジェクトをデータベースに保存しないでください。オブジェクト間にリンクがある場合は、それらを明示的にする必要があります。一意の識別子を使用し、それらをデータベースに格納します。私はあなたの最初の質問をよく理解していない、フレームワークを使用していますか?多分誰かがそれに答えることができますか? –

答えて

1

依存性注入パターンは、実際にスコープの問題に役立ちます。 PHPの依存関係注入パターンの使用に関する良い記事は次のとおりです。

+0

あなたの答えをありがとう:)私はちょっと自分でそれを理解しましたが、これは私が使ったことです、私のために、それは正しい答えです – Abayob

関連する問題