Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 模式匹配驱动的逻辑在实际应用中是什么样子的?_Oop_Pattern Matching - Fatal编程技术网

Oop 模式匹配驱动的逻辑在实际应用中是什么样子的?

Oop 模式匹配驱动的逻辑在实际应用中是什么样子的?,oop,pattern-matching,Oop,Pattern Matching,我在阅读时无意中发现了下面的一段话(但这个问题不是针对具体语言的)。我的 特别是,通常需要以对象类的创建者没有预料到的方式处理对象。在每个对象中嵌入满足该对象的每个可能用户需求的方法并不总是最佳解决方案。此外,还有许多功能强大的分派原理,它们与经典的OOP要求(行为被严格封装在对象中)形成了直接对比,例如规则或模式匹配驱动的逻辑 我熟悉OOP:围绕对象构建的代码,这些对象镜像概念或真实世界的实体,封装状态,并且可以通过方法进行操作 规则或模式匹配驱动逻辑是如何工作的?它看起来像什么 非常感谢现实

我在阅读时无意中发现了下面的一段话(但这个问题不是针对具体语言的)。我的

特别是,通常需要以对象类的创建者没有预料到的方式处理对象。在每个对象中嵌入满足该对象的每个可能用户需求的方法并不总是最佳解决方案。此外,还有许多功能强大的分派原理,它们与经典的OOP要求(行为被严格封装在对象中)形成了直接对比,例如规则或模式匹配驱动的逻辑

我熟悉OOP:围绕对象构建的代码,这些对象镜像概念或真实世界的实体,封装状态,并且可以通过方法进行操作

规则或模式匹配驱动逻辑是如何工作的?它看起来像什么

非常感谢现实世界的例子(可能在web应用程序后端领域?)。OOP中的一个对应示例。

我相信本文描述了一个解决方案。他们描述的解决方案是

为了理解抽象基类,首先阐明抽象实体和具体实体之间的区别是很有用的。抽象实体没有实现。具体实体有一个实现。面向对象编程中的实体通常是属性或方法

面向对象编程语言中的实体是一组具体的实体。一些面向对象编程语言还具有抽象实体组。抽象基类是实体的混合包。默认情况下,它的所有实体都是抽象的,但是可以通过给它们一个默认的实现使它们具体化,如果需要的话,可以重写它

Java中抽象基类的示例(如果我错了,请更正):

抽象类等于{
公共布尔等于(T x){
return!notEquals(x);
}
公共布尔notEquals(tx){
返回!等于(x);
}
}
阶级平等{
公众名字;
公众姓氏;
公众人物(字符串名、字符串名){
this.firstname=firstname;
this.lastname=lastname;
}
公共布尔等于(人x){
返回x.firstname==firstname&&
x、 lastname==lastname;
}
}
不管怎样,继续讨论表达式问题。关于这件事,有以下几点要说:

表达式问题是旧问题的新名称。目标是按案例定义数据类型,在这种情况下,可以向数据类型添加新案例,并在数据类型上添加新函数,而无需重新编译现有代码,同时保留静态类型安全性(例如,无强制转换)

表达式问题是所有的数据类型都被分割成可管理的部分,同时仍然允许数据类型被任意扩展。数据类型可以可视化为案例和函数的二维矩阵。例如,考虑<代码>文档< /代码>数据类型:

            Text       Drawing   Spreadsheet
        +-----------+-----------+-----------+
draw()  |           |           |           |
        +-----------+-----------+-----------+
load()  |           |           |           |
        +-----------+-----------+-----------+
save()  |           |           |           |
        +-----------+-----------+-----------+
文档
数据类型有三种情况(
文本
绘图
电子表格
)和三种功能(
绘图
加载
保存
)。因此,它被分为九个部分,可以用面向对象的语言(如Java)实现,如下所示:

公共接口文档{
无效抽取();
空荷载();
作废保存();
}
公共类TextDocument实现文档{
public void draw(){/*draw text doc…*/}
public void load(){/*加载文本文档…*/}
public void save(){/*保存文本文档…*/}
}
公共类DrawingDocument实现文档{
public void draw(){/*draw draw…*/}
public void load(){/*加载图形…*/}
public void save(){/*保存图形…*/}
}
公共类SpreadsheetDocument实现文档{
public void draw(){/*绘制电子表格…*/}
public void load(){/*加载电子表格…*/}
public void save(){/*保存电子表格…*/}
}
因此,我们将
文档
数据类型分为九个可管理的部分。然而,我们选择了先将数据类型切片为函数,然后按大小写。因此,添加新案例很容易(我们所做的就是创建一个实现
文档
接口的新类)。但是,我们不能向接口添加新函数。因此,我们的数据类型不是完全可扩展的

然而,面向对象的方法并不是分割数据类型的唯一方法。正如您强调的文本所述,还有另一种方式:

特别是,通常需要以对象类的创建者没有预料到的方式处理对象。在每个对象中构建满足该对象的每个可能用户需求的方法并不总是最佳解决方案。此外,还有许多功能强大的分派原理,它们与经典的OOP要求(行为被严格封装在对象中)形成了直接对比,例如规则或模式匹配驱动的逻辑

以面向对象的方式,behavoir被严格地封装在一个对象中(即,每个类实现一组方法,在上面的示例中,实现同一组方法)。另一种选择是规则或模式匹配驱动逻辑,其中数据类型首先按大小写切片,然后分为多个函数。例如,在OCaml中:

类型文档
=文本
|绘图
|电子表格
有趣的绘图(文本)=(*绘图文本文档…*)
|图纸(图纸)=(*图纸图纸文件…*)
|绘制(电子表格)=(*绘制电子表格…*)
趣味加载(文本)=(*加载文本文档…*)
|加载(图纸)=(*加载图纸文件…*)
|加载(电子表格)=(*加载电子表格