ホームページ >バックエンド開発 >PHPチュートリアル >PHP 設計パターンのインタープリター パターンの詳細な分析_PHP チュートリアル

PHP 設計パターンのインタープリター パターンの詳細な分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:07:12815ブラウズ

インタープリタ モードは、複合クラスの階層構造を持つ文法表現で構成され、文法に続く式は、複合モードのインスタンス オブジェクトを除いて、抽象構文ツリーに変換できます。写真、他には何もありません。

ツリーは抽象名詞です。実際、ほとんどの場合、それは式の抽象表現であり、文字列やデータ構造の具体的な式が存在する可能性を無視します (たとえば、PHP では、「A」)。と "x41" は、同じ抽象リテラル値の異なる具体的な表現です)、論理ルールを通じて結果を分離することで、解釈プロセスが大幅に簡素化されます。

インタープリターはあまり一般的なパターンではありませんが、単純な文法の場合、ルールを追加するのはクラスを追加するのと同じくらい簡単ですが、他のサービスによって行われる具体的な表現から抽象構文ツリーへの変換は解決されません。

インタープリター パターンは、単純な抽象式メソッド (インタープリター操作) に複合階層構造を活用するように設計されており、インタープリター操作のパラメーターは通常、特定のメソッドに対して集合的にコンテキストと呼ばれます。代わりに使用されるか、一部の操作では存在しない可能性があります。

また、インタプリタが含まれる場合、複合パターンのリーフとコンテナの参加者名は異なり、これらの名前は、それらが果たす役割 (終端式または非終端式) を反映します。

参加者:
◆クライアント: Explain 操作を使用します。
◆抽象表現: 表現ツリーに基づいた抽象表現。
◆Non TerminalExpression: 他の抽象式 (AbstractExpression インスタンス) を再帰的に含む式。
◆終端表現:これ以上簡略化できない表現。


書籍「デザイン パターン」では、このパターンの拡張例が提供されています。ブール式を数式に置き換えて改造しました。この例では、数式の表示を解決し、その Evaluate() が別の式に分離されています。 ConcreteExpression クラス。

コードをコピーします コードは次のとおりです:

/** 
* 抽象表現。このインターフェース
* のすべての実装は ConcreteExpressions です。 
 */
interface MathExpression
{
/** 
* 式が仮定する値を計算します。 
* $values はすべての式に渡されますが、
* は変数でのみ使用されることに注意してください。これは、ツリー構造を抽象化するために必要です
* 。 
    */
public function Evaluate(array $values); 
}

/** 
* リテラル値である終端式。 
 */
class Literal は MathExpression を実装します
{
private $_value; 

public function __construct($value)
{
$this->_value = $value; 
}

public function Evaluate(array $values)
{
return $this->_value; 
}
}

/** 
* 変数を表す終端式。 
 */
class 変数は MathExpression を実装します
{
private $_letter; 

public function __construct($letter)
{
$this->_letter = $letter; 
}

public function Evaluate(array $values)
{
return $values[$this->_letter]; 
}
}

/** 
* 非終端式。 
 */
クラス Sum は MathExpression を実装します
{
private $_a; 
プライベート $_b; 

public function __construct(MathExpression $a, MathExpression $b)
{
$this->_a = $a; 
$this->_b = $b; 
}

public function Evaluate(array $values)
{
return $this->_a->evaluate($values) + $this->_b->evaluate($values); 
}
}

/** 
* 非終端式。 
 */
class Product は MathExpression を実装します
{
private $_a; 
プライベート $_b; 

public function __construct(MathExpression $a, MathExpression $b)
{
$this->_a = $a; 
$this->_b = $b; 
}

public function Evaluate(array $values)
{
return $this->a->evaluate($values) * $this->b->evaluate($values); 
}
}

// 10(a + 3)
$expression = new Product(new Literal(10), new Sum(new Variable('a'), new Literal(3))); 
echo $expression->evaluate(array('a' => 4)), "n"; 
// 文法に新しいルールを追加するのは簡単です:
// 例:べき乗、減算...
// Composite のおかげで、操作はさらに簡単になります:
// replace($letter, MathExpression $expr) を追加できます
// インターフェースに...

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327555.html技術記事解読者(インタープリター)モードには、複合クラス分層構造を備えた文法テーブルが含まれており、ビューはクラスに表示され、文法の後ろにある表形式は 1 つの抽象に変換できます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。