ajoo的
面向组合子的程序设计方法已经连载了八篇了,说实话,我一直在找他这方法中的漏洞,而且觉得有那么点意思,大概可以写点什么了。然后呢,我就想这么个问题,假设用DJ来实现一个logging的需求,该如何做呢?
想来想去,特别是在我仔仔细细的看过ajoo的CO代码之后,我突然顿悟了!我差点错过了一个极好的例子。当初ajoo发现,logging是一个说明CO程序设计方法的不可多得的好例子。而我发现,这个需求用DJ实现起来,甚至整个CO编程用DJ实现起来,都是易如反掌,如此好例子,我要是错过,岂不是太可惜了。因此,我在这里要郑重其事的向ajoo表示感谢,感谢他提供了这么好的例子,并且已经做了大量的工作,来解说这个例子。废话不多说了,下面开始我的代码。
contract Logger{
public void println(LogEvent e);
public void printException(Exception e);
}
这其中的LogEvent和Exception分别是DJ中的用户自定义类事件与异常类事件。与ajoo的代码有所差别。而这个差别,正是DJ更加方便之处。
datatype LogEvent as UserEvent{
String msg;
}
在LogEvent的基础上,我们还可以定义更加具有说明性的Log,比如:
datatype LevelLogEvent as LogEvent{
int level;
}
OK!我们接下来定义一个NopLogger:
channel NopLogger:Logger{
public void println(LogEvent e){}
public void printException(Exception e){}
}
再来一个WriterLogger:
channel WriterLogger<PrintWriter writer>:Logger{
public void println(LogEvent e){
writer.println(e.msg);
}
public void printException(Exception e){
writer.println(e.stackTrace);
}
}
再来一个SequenceLogger:
channel SequenceLogger<contract Logger[] loggers>:Logger{
public void (LogEvent e){
foreach(l: loggers){
l.println(e);
}
}
public void printException(Exception e){
foreach(l:loggers){
l.printException(e);
}
}
}
再来一个FilteredLogger:
channel FilteredLogger<contract Logger logger1,contract Logger logger2>:Logger{
public void println(LevelLogEvent e){
if(e.level==ERROR)logger1.println(e);
else logger2.println(e);
}
public void printException(LevelException e){
if(e.level==ERROR) logger1.printException(e);
else logger2.printException(e);
}
}
再来一个IgnoringLogger:
channel IgnoringLogger<contract Logger logger1,contract Logger logger2>:Logger{
public void println(LevelLogEvent e){
if(e.level>=ERROR)logger1.println(e);
else logger2.println(e);
}
public void printException(LevelException e){
if(e.level>=ERROR) logger1.printException(e);
else logger2.printException(e);
}
}
我不打算再抄ajoo的代码了,似乎是“有点无赖”了。再说,为了说明我的DJ能够很好的描述组合子,这些channel定义也就够了。接着说怎么装配。
DJ中的channel,并不是独立存在,而是要和DynamicObject协同工作的。在一个DynamicObject中,既包含数据区,也包含Channel组。所有插入一个动态对象的channel,都可以定义事件处理部分,以接收可能发生的事件。而需要记录log的事件,可以由任何一个channel中的任何一段代码,以如下代码方式抛出:
throw new UserEvent("Logging Message ......");
至于这个事件,将被如何处理,抛出事件的代码是无需关心的。至于接收log事件的channel,可以如下定义:
channel LoggerChannel<datatype <T> data,contract Logger log>{
event:
onEvent(LogEvent e){
log.println(e);
}
onEvent(Exception e){
log.printException(e);
}
}
各位,有没有体会到DJ这个语言的威力呢?我们可以将Log与Exception分开处理,比如:
channel LoggerChannel<datatype <T> data,contract Logger log>{
event:
onEvent(LogEvent e){
log.println(e);
}
}
channel ExceptionChannel<datatype <T> data,contract Logger log>{
event:
onEvent(Exception e){
log.printException(e);
}
}
然后,这两个Channel我可以以不同的方式组装,完全没有相互的干扰......
今天的代码已经写得太多了,大家先体会体会吧。
明天再接着写DJ能够做到,而CO很困难的其他Loggin需求。
(未完待续)
分享到:
相关推荐
20210509-信达证券-化工行业:敲响轮胎消费时代的钟声!.pdf
【标题解析】:“图片购物搜索淘淘搜:敲响美丽说们的丧钟?”指的是新兴的电商搜索工具“淘淘搜”通过创新的图片购物搜索功能,对以美丽说、蘑菇街为代表的图片购物网站构成潜在的竞争威胁。 【描述概要】:文章...
随着新学期的钟声渐渐敲响,我们站在了新的起点,准备迎接新的挑战与机遇。在这个充满希望的时刻,班会的主题定为“新学期、新气象、新打算”,不仅预示着新的开始,更是一次心灵的触动和目标的重启。此次班会的策划...
化工行业:敲响轮胎消费时代的钟声!.pdf
化工行业:敲响轮胎消费时代的钟声!(30页).pdf
化工行业:敲响轮胎消费时代的钟声!(2021)(30页).pdf
提到的“丧钟为谁而鸣”,这句话源自约翰·多恩的诗句,意味着每个人的死亡都是所有人的损失,每个人都在为自己的死亡敲响丧钟。在这里,读者被提醒珍惜当下,因为生命无常,每一刻都可能是最后的时刻。同时,这也...
随着新学期的钟声渐渐敲响,校园里洋溢着新气象,我们迎接了一批怀揣梦想、对未来充满憧憬的新生。为了帮助孩子们更好地适应新环境,同时也为了让他们的开学第一课变得难忘而富有意义,精心制作了这份“欢迎新同学...
在当今这个快速发展的时代,环境问题已经成为了全球关注的焦点,而地球的未来,更需要我们每一个人的关心与参与。在小学六年级的道德与法治课堂上,“地球——我们的家园”这一主题旨在让学生们深入理解环境问题的...
在当前数字化时代,浏览器已成为人们日常生活中不可或缺的一部分。从简单的网页浏览到复杂的在线交易,浏览器承担着数据传输、应用运行和信息交互的重要任务。然而,随着网络攻击手段的日益翻新,浏览器安全问题也日...
Window操作系统的诞生成就了微软帝国,同时也造就了PC时代的繁荣,然而如今,以Android和iPhone手机为代表的智能移动设备的发明与互联网云技术的兴起却敲响了PC时代的丧钟!这也预示着移动互联网时代(3G)已经来临。 ...
回顾往昔,2012年武汉“9·13”施工电梯事故的惨痛教训至今让人记忆犹新,该事件中操作不当导致的人员伤亡给整个建筑行业敲响了警钟。事故的背后暴露出一个共同的问题:非专属司机的操作隐患。在正常施工过程中,...
《传统文化的继承与弘扬——社会实践活动调查报告》深入探讨了这一主题,并对如何在新时代背景下保持和发扬传统文化提出了见解。 报告指出,当前全球化趋势下,中国传统文化面临种种挑战。西方节日文化的流行和渗透...
在当下的信息时代,科技的迅猛发展为我们的生活带来了前所未有的变革。然而,当我们享受着科技带来的便利时,也面临着一系列社会和道德问题。《丧钟为谁而鸣.docx》这篇文档,虽然没有直接涉及IT技术的细节,但却...
疫情改变了人们的日常生活习惯,出门必戴口罩成为了一种新的社交礼仪,街道上行人稀少,商业活动也受到了极大的限制。学生们的学校生活转变为网络授课,与老师和同学的面对面交流被电子屏幕所取代。这种变化不仅仅是...
在这个特殊的时刻,我们设计了一份特别的语言学习教案——《大班语言新年礼物学习教案》,目的是利用新年的喜庆氛围,激发孩子们对语言学习的兴趣,同时提升他们的语言表达、故事理解及情感交流技巧。 教案以新年这...
随着新年的钟声敲响,我们迎来了一年之初的开门红,这不仅是一个时间节点的象征,更是一个充满希望与机遇的开始。在这样的背景下,2013年,我们公司选择以一场盛大的年会来庆祝这一历史性的时刻,而“2013开门红——...
新时代的钟声已然敲响,它不仅代表着时间的流转,更是历史发展的一个崭新起点。我们生活在一个充满变革与机遇的时代,而“奋进新时代,争做追梦人”不仅仅是一句口号,它更是一种行动的指南,一种精神的宣言。在这篇...
《地球——我们的家园》是部编版六年级下册道德与法治课程中的第四课,旨在教育学生认识地球作为人类生存环境的重要性,理解人与自然之间的相互依存关系,以及环境问题的严重性,培养学生的环保意识和责任意识。...