其实你不懂老板的心——解释器模式

其实你不懂老板的心——解释器模式

其实你不懂老板的心

时间:7月12日20点  地点:小菜、大鸟住所的客厅  人物:小菜、大鸟

"大鸟,今天我们大老板找我谈话。"小菜对大鸟说道。

"哦,大老板找员工谈话,多少有些事情要发生。"大鸟猜测道。

“不知道呀,反正以前我从来没有直接和他面对面说过话,突然他让秘书叫我去他的办公室。我开始多少有些紧张的。”

“他对你说什么了?”

“他问我最近的工作进展情况如何,有没有什么困难,同事相处如何,等等。其实也就是简单地调查民情吧。”

“哦,就这么简单?”

"对了,他夸我来着,说’小蔡,你在公司表现格外出色,要继续好好努力。'"小菜面有得意。

"哈,你原来是想告诉我你们老板夸奖你呀。"大鸟笑道,“你可别太得意了,这句话可以简单地理解为夸奖,也可能有更深层次的含义哦。”

“那还能怎么理解?”

“老板私下对某员工大加夸奖时,多半是’最近有更多的任务需要你去完成’的意思。”

“啊,不会吧,已经加班够多的了,难道还要加任务?”

“谁叫你平时表现积极呢,年轻人,多做点也没什么关系,积累经验比什么都强,老板赏识你是好事情呀。他还说什么了吗?”

"他还问我另一个叫梅星的同事的情况。我说他工作也很努力。老板最后评价了句’梅星是个普通员工。'"小菜说。

"有这样的说法?哦,这个梅星情况不妙了。"大鸟一脸深沉。

“咦,为什么?老板也没说他不好呀,只是说他是普通员工。”

“通常老板说某个员工是普通员工,其实他的意思是说,这个员工不够聪明,工作能力不足。”

“啊,有这种事,我可真是听不懂了。难道老板所说的话,都是有潜台词的?”

“当然,当然。在职场上混,这些都不懂如何干得出名堂!职场菜鸟与老手的一大区别就在于,是否能察言观色,见风使舵,是否听得懂别人尤其是老板上司的弦外之音。”

“大鸟不但在编程技术上有所造诣,连这等为人处世之道也深有研究?”

“略知一二吧,其实自己用点心,这也不算什么难事的。”

“要是有一个翻译机,或解释器就好了,省得每次讲话还需要多动脑筋,多烦呀。”

"小子,你真是块做软件的料,什么问题都想着靠编程解决呀?这种东西要靠感悟的,时间长了,你就会慢慢学会分析的。"大鸟提醒道,“不过,你说到了解释器,我的确是想跟你讲讲解释器模式,它其实就是用来翻译文法句子的。”

“是吗,说来听听。”

解释器模式

解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。[DP]

"解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题[DP]

比如,我们常常会在字符串中搜索匹配的字符或判断一个字符串是否符合我们规定的格式,此时一般会用什么技术?"

“是不是正则表达式?”

“对,非常好,因为这个匹配字符的需求在软件的很多地方都会使用,而且行为之间都非常类似,过去的做法是针对特定的需求,编写特定的函数,比如判断E-mail、匹配电话号码等,与其为每一个特定需求都写一个算法函数,不如使用一种通用的搜索算法来解释执行一个正则表达式,该正则表达式定义了待匹配字符串的集合[DP]。而所谓的解释器模式,正则表达式就是它的一种应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。”

“我的理解,是不是像IE、Firefox这些浏览器,其实也是在解释HTML文法,将下载到客户端的HTML标记文本转换成网页格式显示到用户?”

“哈,是可以这么说,不过编写一个浏览器的程序,当然要复杂得多。”

“下面我们来看看解释器模式实现的结构图和基本代码。”

解释器模式(interpreter)结构图:

在这里插入图片描述

AbstractExpression(抽象表达式),声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。

在这里插入图片描述

TerminalExpression(终结符表达式),实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个interpret()方法。文法中每一个终结符都有一个具体终结表达式与之相对应。

在这里插入图片描述

NonterminalExpression(非终结符表达式),为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2、…、Rn都需要一个具体的非终结符表达式类。通过实现抽象表达式的interpret()方法实现解释操作。解释操作以递归方式调用上面所提到的代表R1、R2、…、Rn中各个符号的实例变量。

在这里插入图片描述

结果显示:

在这里插入图片描述

解释器模式的好处

“看起来好像不难,但其实真正做起来应该还是很难的吧。”

“是的,你想,用解释器模式,就如同你开发了一个编程语言或脚本给自己或别人用。这当然是难了。”

“我的理解是,解释器模式就是用’迷你语言’来表现程序要解决的问题,以迷你语言写成’迷你程序’来表现具体的问题。”

“嗯,迷你这个词用得很好,就是这样的意思。通常当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式[DP]。”

“解释器模式有什么好处呢?”

“用了解释器模式,就意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写[DP]。”

“除了像正则表达式、浏览器等应用,解释器模式还能用在什么地方呢?”

“只要是可以用语言来描述的,都可以是应用呀。比如针对机器人,如果为了让它走段路还需要去电脑面前调用向前走、左转、右转的方法,那也就太傻了吧。当然应该直接是对它说,‘哥们儿,向前走10步,然后左转90度,再向前走5步。’”

“哈,机器人听得懂’哥们儿’是什么意思吗?”

“这就看你写的解释器够不够用了,如果你增加这个’哥们儿’的文法,它就听得懂呀。说白了,解释器模式就是将这样的一句话,转变成实际的命令程序执行而已。而不用解释器模式本来也可以分析,但通过继承抽象表达式的方式,由于依赖倒转原则,使得对文法的扩展和维护都带来了方便。”

“哈,难道说,Java、C#这些高级语言都是用解释器模式的方式开发的?”

“当然不是那么简单了,解释器模式也有不足的,解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处[DP]”。

“哦,原来还有语法分析器、编译器生成器这样的东西。”

音乐解释器

“好了,要真正掌握,还需要练习,我们来做个小型的解释器程序。”

“好呀,程序需求是什么?”

“你以前有没有用过QBASIC?”

“没有,听说那是在VB以前,DOS状态下的编程语言。”

"是的,大鸟我以前就是整天用它来学习写程序的,QBASIC就是早期的BASIC,它当中提供了专门的演奏音乐的语句PLAY,不过由于那会儿多媒体并不像如今这般流行,所以所谓的音乐也仅仅相当于手机中的单音铃声。"大鸟说道。

"你一说这个我知道了,我以前的手机里就有编辑铃声的功能,通过输入一些简单的字母数字,就可以让手机发出音乐。我还试着找了些歌谱编了几首流行歌进去呢。"小菜接话道。

“哈,那就好,你想呀,那就是典型的解释器模式的应用,你用QB或者手机说明书中定义的规则去编写音乐程序,不就是一段文法让QB或手机去翻译成具体的指令来执行吗!”

“我明白了,这就是解释器的应用呀。”

“现在我定义一套规则,和QB的有点类似,但为了简便起见,我做了改动,你就按我定义的规则来编程。我的规则是O表示音阶’O 1’表示低音阶,'O 2’表示中音阶,'O 3’表示高音阶;'P’表示休止符,‘C D E F G A B’表示’Do-Re-Mi-Fa-So-La-Ti’;音符长度1表示一拍,2表示二拍,0.5表示半拍,0.25表示四分之一拍,以此类推。注意:所有的字母和数字都要用半角空格分开。例如上海滩的歌曲第一句,‘浪奔’,可以写成’O 2 E 0.5 G 0.5 A 3’表示中音开始,演奏的是mi so la。”

在这里插入图片描述

“好的,我试试编编看。”

“为了只关注设计模式编程,而不是具体的播放实现,你只需要用控制台根据事先编写的语句解释成简谱就成了。”

“OK!”

音乐解释器实现

一个小时后,小菜通过了几番改良,给出了答案。

在这里插入图片描述

演奏内容类(context):

在这里插入图片描述

音符类(TerminalExpression):

在这里插入图片描述

客户端代码:

在这里插入图片描述

结果显示:

在这里插入图片描述

“写得非常不错,现在我需要增加一个文法,就是演奏速度,要求是T代表速度,以毫秒为单位,'T 1000’表示每节拍一秒,'T 500’表示每节拍半秒。你如何做?”

“学了设计模式这么久,这点感觉难道还没有,首先加一个表达式的子类叫音速。然后再在客户端的分支判断中增加一个case分支就可以了。”

音速类:

在这里插入图片描述

客户端代码(局部):

在这里插入图片描述

"但是小菜,在增加一个文法时,你除了扩展一个类外,还是改动了客户端。"大鸟质疑道。

“哈,这不就是实例化的问题吗,只要在客户端的switch那里应用简单工厂加反射就可做到不改动客户端了。”

"说得好,看来你的确是学明白了,在这里是讲解释器模式,也就不那么追究了,只要知道可以这样重构程序就行。其实这个例子是不能代表解释器模式的全貌的,因为它只有终结符表达式,而没有非终结符表达式的子类,因为如果想真正理解解释器模式,还需要去研究其他的例子。

料事如神

时间:7月16日20点  地点:小菜大鸟住所的客厅  人物:小菜、大鸟

小菜:“大鸟,你真是料事如神呀,尽管都不是什么好消息,但两件事都让你猜对了。”

“哦,哪两件事?”

“第一,梅星离职了,说是他辞职,可听说实际上是公司叫他走人的。”

“唉,所以说呀,好好学习,加强自己的市场竞争力还是非常重要的。”

“第二,就是梅星的工作全部转给我做了,这样我的工作量大大提高,一个人干了两个人的活。”

“哈哈,你不是被老板夸得很开心的吗?现在还开心吗?”

“反正就像你说的,趁着年轻,多做点吧。”

“是的,多做点没坏处的。小菜,你在公司表现格外出色,要继续好好努力哦。”

“我怎么现在听着这话那么别扭,大鸟,你少来,我可不是职场菜鸟了,这种虚情假意的夸奖我可不再上当了。”

"真诚地夸奖你,你反而不信了。真是好心被当作了驴肝肺哦。唉,做好人难,做好男人更难,做真心的好男人更是难上加难呀。"大鸟深情感慨地说道。

"真心好男人?呕!呕!呕!"小菜大作呕吐状。

两人的脸都笑开了花。

如果对你有帮助,就一键三连呗(关注+点赞+收藏),我会持续更新更多干货~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿陌名!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值