現在、プロシージャコードから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データベースに格納されます。
質問:
- がどのように私は私のフラグメント・オブジェクトにビルダーオブジェクトを使うことができますか?
- オブジェクトの一部がデータベースに格納されるため、新しいオブジェクトの内部で参照変数を使用すると、これらの参照も格納されます。
私は、オブジェクトをそのままの形でデータベースに格納しないようにしています。 'public function storeInDatabase()'や 'public function RetrieveFromDatabase()'のようなメソッドを与えます。このメソッドは、オブジェクトの必須データのみを格納します。好ましくはプロパティをデータベースの列フィールドにマッピングします。 PHPオブジェクトはPHPのままでなければなりません。データベースには、PHPがなくても操作できる適切なデータが含まれている必要があります。 –
コメントありがとうございます、私はそれを考慮に入れます。これは私の質問には答えませんが、あなたは提案がありますか? – Abayob
これは質問2の答えです。生のオブジェクトをデータベースに保存しないでください。オブジェクト間にリンクがある場合は、それらを明示的にする必要があります。一意の識別子を使用し、それらをデータベースに格納します。私はあなたの最初の質問をよく理解していない、フレームワークを使用していますか?多分誰かがそれに答えることができますか? –