ホームページ  >  記事  >  バックエンド開発  >  PHP 設計パターンのインタープリター パターンの詳細な分析

PHP 設計パターンのインタープリター パターンの詳細な分析

怪我咯
怪我咯オリジナル
2017-07-09 09:34:391445ブラウズ

この記事は、PHPデザインパターンインタープリターパターンの詳細な分析と紹介です。必要な場合は、複合クラス階層構造の文法を含む

インタープリター(インタープリター)パターンを参照してください。ルールはクラスにマップされ、文法に従うは、複合パターンのインスタンス オブジェクト グラフ以外のものを使用しない抽象構文ツリーに変換できます。

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

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

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

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

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


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

コードは次のとおりです:

/**  
 * AbstractExpression. All implementations of this interface  
 * are ConcreteExpressions.  
 */ 
interface MathExpression  
{  
    /**  
     * Calculates the value assumed by the expression.  
     * Note that $values is passed to all expression but it  
     * is used by Variable only. This is required to abstract  
     * away the tree structure.  
     */ 
    public function evaluate(array $values);  
}  

/**  
 * A terminal expression which is a literal value.  
 */ 
class Literal implements MathExpression  
{  
    private $_value;  

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

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

/**  
 * A terminal expression which represents a variable.  
 */ 
class Variable implements MathExpression  
{  
    private $_letter;  

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

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

/**  
 * Nonterminal expression.  
 */ 
class Sum implements MathExpression  
{  
    private $_a;  
    private $_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);  
    }  
}  

/**  
 * Nonterminal expression.  
 */ 
class Product implements MathExpression  
{  
    private $_a;  
    private $_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";  
// adding new rules to the grammar is easy:  
// e.g. Power, Subtraction...  
// thanks to the Composite, manipulation is even simpler:  
// we could add substitute($letter, MathExpression $expr)  
// to the interface...

以上がPHP 設計パターンのインタープリター パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。