你好,开发人员!
在软件开发领域,设计模式在制定高效且可扩展的应用程序中起着关键作用。一种这样的模式,即口译模式,为评估语言语法或特定语言的表达方式提供了独特的方法。本质上,这类似于构建迷你语言处理器。在本文中,我们将深入研究解释器模式的复杂性,并通过创建简单的数学表达式评估器来证明其在PHP 8中的实现。
了解口译员模式
解释器模式旨在用一种语言来解释句子。它涉及将语言语法的表示形式与解释器一起处理以处理该语法。当您需要设计一种解释或编译语言的工具,提供一种结构化方法以将一种形式的数据转换为另一种形式的方法时,此模式特别有用。
在我们深入编码部分之前,让我们了解这种模式中涉及的组件:
- 表达界面:这是我们表达式的蓝图,定义一种可以解释各种表达式的方法。
- 终端表达式:这些是返回值的主要表达式。
- 非末端表达式:这些表达式代表操作并使用终端表达式完成其任务。
有了这种理解,让我们继续构建我们的数学表达评估器。
构建简单的数学表达式评估器
步骤1:表达接口
首先,我们为表达式定义了一个界面,该界面声明了一种解释表达式的方法:
interface Expression
{
public function interpret(array $context): int;
}
步骤2:终端表达式
接下来,我们创建返回值的主要表达式。这些表达式代表我们的数学表达式中的数字:
class Number implements Expression
{
private int $number;
public function __construct(int $number) {
$this->number = $number;
}
public function interpret(array $context): int {
return $this->number;
}
}
步骤3:非末端表达式
现在,我们开发代表操作的表达式,利用终端表达式返回结果:
class Add implements Expression
{
private Expression $leftExpression;
private Expression $rightExpression;
public function __construct(Expression $left, Expression $right) {
$this->leftExpression = $left;
$this->rightExpression = $right;
}
public function interpret(array $context): int {
return $this->leftExpression->interpret($context) + $this->rightExpression->interpret($context);
}
}
class Subtract implements Expression
{
private Expression $leftExpression;
private Expression $rightExpression;
public function __construct(Expression $left, Expression $right) {
$this->leftExpression = $left;
$this->rightExpression = $right;
}
public function interpret(array $context): int {
return $this->leftExpression->interpret($context) - $this->rightExpression->interpret($context);
}
}
步骤4:客户端代码
最后,我们创建了一个客户代码来解释和评估数学表达式:
class Client
{
public static function main() {
$context = [];
// Creating number expressions
$five = new Number(5);
$three = new Number(3);
// Creating and interpreting add expression
$addExpression = new Add($five, $three);
echo "Result of addition: " . $addExpression->interpret($context) . "\n"; // Output: 8
// Creating and interpreting subtract expression
$subtractExpression = new Subtract($five, $three);
echo "Result of subtraction: " . $subtractExpression->interpret($context) . "\n"; // Output: 2
}
}
// Running the client code
Client::main();
在此客户端代码中,我们创建代表数字5和3的Number
对象,然后使用这些数字创建Add
和Subtract
表达式。我们解释这些表达式以获取结果,然后打印出来。
通过本文,我们通过构建一个简单的数学表达式评估符,探索了解释器模式及其在PHP 8中的实际实现。该模式提供了设计语言编译器或口译员的结构化方法,展示了面向对象的编程的功能和灵活性。
当您进一步进入设计模式的世界时,您会发现解释器模式可能是开发人员工具包的宝贵工具,尤其是在处理语言处理任务时。愉快的编码!
参考
- Design Patterns: Elements of Reusable Object-Oriented Software-埃里希·加玛(Erich Gamma),理查德·赫尔姆(Richard Helm),拉尔夫·约翰逊(Ralph Johnson)和约翰·弗里西德(John Vlissids)的书
- PHP 8 Documentation-官方PHP 8文档
P.S。如果您发现这篇文章很有帮助,并且想深入研究PHP和Typescript中的设计模式,我将为您提供一些令人兴奋的消息!我目前正在写一本书,该书广泛涵盖了这些主题。它包含了实用的例子,清晰的解释和现实情况,可以应用这些模式。
本书旨在帮助初学者和经验丰富的开发人员对设计模式以及如何在PHP和打字稿中实施它们。无论您是想掌握知识还是学习新知识,这本书都可以覆盖您。
您可以在Dev.to上订阅我的博客或在LinkedIn上连接,然后一本书准备就绪后,您将立即收到通知。我等不及您阅读它,并将您的编码技巧提升到一个新的水平!
iLya podshivalov
照片