能向你请教一个问题吗就是我没能给你想要的一个 模式匹配算法的实现与设计的求解过程和代码

超长预警!!全文4万多字墙裂建议收藏!

先来看一下本篇文章的思维导图吧,我会围绕下面这些内容进行讲解内容很干,小伙伴们看完还希望不吝转发

Java 是 Sun Microsystems 于1995 年首次發布的一种编程语言和计算平台。编程语言还比较好理解那么什么是 计算平台 呢?

计算平台是在电脑中运行应用程序(软件)的环境包括硬件环境和软件环境。一般系统平台包括一台电脑的硬件体系结构、操作系统、运行时库

Java 是快速,安全和可靠的从笔记本电脑到數据中心,从游戏机到科学超级计算机从手机到互联网,Java 无处不在!Java 主要分为三个版本

Java 是一门面向对象的编程语言什么是面向对象面姠对象(Object Oriented) 是一种软件开发思想。它是对现实世界的一种抽象面向对象会把相关的数据和方法组织为一个整体来看待。

相对的另外一种开发思想就是面向过程的开发思想什么面向过程?面向过程(Procedure Oriented) 是一种以过程为中心的编程思想举个例子:比如你是个学生,你每天去上学需偠做几件事情

起床、穿衣服、洗脸刷牙,吃饭去学校。一般是顺序性的完成一系列动作

而面向对象可以把学生进行抽象,所以这个唎子就会变为

可以不用严格按照顺序来执行每个动作这是特点一。

Java 摒弃了 C++ 中难以理解的多继承、指针、内存管理等概念;不用手动管理對象的生命周期这是特征二。Java 语言具有功能强大和简单易用两个特征现在企业级开发,快速敏捷开发尤其是各种框架的出现,使 Java 成為越来越火的一门语言这是特点三。Java 是一门静态语言静态语言指的就是在编译期间就能够知道数据类型的语言,在运行前就能够检查類型的正确性一旦类型确定后就不能再更改,比如下面这个例子publicvoidfoo(){int x = 5;boolean b = x;}

相对应的,动态语言没有任何特定的情况需要指定变量的类型在运荇时确定的数据类型。比如有**Lisp, Perl, Python、Ruby、JavaScript **等

从设计的角度上来说,所有的语言都是设计用来把人类可读的代码转换为机器指令动态语言是为叻能够让程序员提高编码效率,因此你可以使用更少的代码来实现功能静态语言设计是用来让硬件执行的更高效,因此需要程序员编写准确无误的代码以此来让你的代码尽快的执行。从这个角度来说静态语言的执行效率要比动态语言高,速度更快这是特点四。

Java 具有岼台独立性和可移植性Java 有一句非常著名的口号:Write once, run anywhere也就是一次编写、到处运行。为什么 Java 能够吹出这种牛批的口号来核心就是 JVM。我们知道计算机应用程序和硬件之间会屏蔽很多细节,它们之间依靠操作系统完成调度和协调大致的体系结构如下

那么加上 Java 应用、JVM 的体系结构會变为如下

Java 是跨平台的,已编译的 Java 程序可以在任何带有 JVM 的平台上运行你可以在 Windows 平台下编写代码,然后拿到 Linux 平台下运行该如何实现呢?

艏先你需要在应用中编写 Java 代码;

然后你的 .jar 文件就能够在 Windows 、Mac OS X、Linux 系统下运行了不同的操作系统有不同的 JVM 实现,切换平台时不需要再次编译伱的 Java 代码了。这是特点五

Java 能够容易实现多线程Java 是一门高级语言,高级语言会对用户屏蔽很多底层实现细节比如 Java 是如何实现多线程的。從操作系统的角度来说实现多线程的方式主要有下面这几种

在用户空间中实现多线程

在内核空间中实现多线程

在用户和内核空间中混合實现线程

而我认为 Java 应该是在 用户空间 实现的多线程,内核是感知不到 Java 存在多线程机制的这是特点六。

Java 具有高性能我们编写的代码经过 javac 編译器编译称为 字节码(bytecode),经过 JVM 内嵌的解释器将字节码转换为机器代码这是解释执行,这种转换过程效率较低但是部分 JVM 的实现比如 Hotspot JVM 都提供了 JIT(Just-In-Time) 编译器,也就是通常所说的动态编译器JIT 能够在运行时将热点代码编译机器码,这种方式运行效率比较高这是编译执行。所以 Java 不仅僅只是一种解释执行的语言这是特点七。

Java 语言具有健壮性Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证这也昰 Java 与 C 语言的重要区别。这是特点八

Java 很容易开发分布式项目Java 语言支持 Internet 应用的开发,Java 中有 net api它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等Java的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。这是特点九

}

模式可以嵌套就像表达式嵌套,你可以定义深层的模式通常一个模式看起来就像一个表达式。它基本上就是同一类事情
它看起来像一个复杂的对象树构造表达式,呮是漏掉了new关键字事实上在scala当你构造一个对象,你不需要new关键字
然后你可以在一些地方用变量做站位符替代对象树上实际的东西

本质仩,当你需要通过外部来构造对象图模式匹配是必要的,因为你不能对这些对象添加方法
有很多场景的例子XML是一个,所有解析过的数據落入不同的分类
举例,一个标准的场合是当你用编译器解析抽象语法树的时候模式匹配是必要的

Bill Venners: 你说模式像表达式,但它更像“逆表达式”不同于插入值并得到结果(构造一个对象的过程),你放入一个值当它匹配,一串值弹出来
Martin Odersky: 是的,它确实是反向构造我可以通过嵌套的构造器来构造对象。我有一个方法一些参数通过这些参数可以构造出负责的对象结构。模式匹配正好相反它从一个复杂的對象结构中抽出原来用于构造这个对象的参数

扩展性的另一个概念是数据结构相对固定,你不想改变它但你没能给你想要的用到的行为操作是开放的。你随时都没能给你想要的添加新的操作
典型的例子是编译器,编译器用语法树表达你的程序只要你没有改变你的语言,语法树就不会变一直都是同一颗树
但编译器没能给你想要的这棵语法树每天改变。明天你或许想到一种新的优化在遍历树的阶段

所鉯,你想采取的办法是操作定义在你的语法树外部否则你要不断的添加新方法

这个工作正确的方向,取决于你想在那个方向扩展如果伱没能给你想要的扩展新的数据,你选择经典的面向对象通过虚方法调用实现如果你想保持数据固定,扩展新的操作模式更适合。
实際上有一个设计模式不要和模式匹配混淆,在面向对象程序中称为“访问者模式”也可以用面向对象的方式表达模式匹配的方式,基於虚方法委派的

但实际中用visitor模式是非常笨重的,不能像模式匹配那样轻松的做很多事你应该终结笨重的vistors,同时在现代虚拟机技术中也證明vistor模式远没有模式匹配有效所有这些原因,我想应该为模式匹配定义一套规则

ps, 前段时间王垠同学在批判设计模式的一篇文章中提到visitor模式就是模式匹配。
可以对比一下scala语言通过case class/extractor方式在语言级别支持模式匹配与通过visitor模式来达到同样的效果时的代码差别。 

}

我要回帖

更多关于 没能给你想要的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信