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)已经来临。 ...
《地球——我们的家园》是部编版六年级下册道德与法治课程中的第四课,旨在教育学生认识地球作为人类生存环境的重要性,理解人与自然之间的相互依存关系,以及环境问题的严重性,培养学生的环保意识和责任意识。...
《地球——我们的家园》是教育学生认识地球独特性和环保重要性的关键课程。这一课时的教学设计旨在通过多种教学策略,使学生对地球的唯一性有深入理解,提高他们对环境保护的认识,培养珍视地球家园的情感。 教学...
然而,以android和iphone手机为代表的智能移动设备的发明却敲响了pc时代的丧钟!移动互联网时代(3g时代)已经来临,谁会成为这些移动设备上的主宰?毫无疑问,它就是android——pc时代的windows! 移动互联网还是...
《医疗废物管理的法律问题探析——以湖南某湖流域为例》 医疗废物管理是公共卫生领域中的重要环节,它涉及到环境保护、公众健康和社会稳定等多个层面。这篇研究主要以湖南某湖流域为背景,深入探讨了我国医疗废物...
"地球——我们的家园 教案(教学设计)" 本教案旨在帮助六年级学生初步养成珍惜地球资源、保护地球环境的行为与习惯,了解地球是目前已知的惟一有生命存在的、适宜人类生存和发展的星球。通过教学,学生能初步归纳...
1. 教育资源:文档是一个针对六年级下册道德与法治课程的教学设计,具体为第4课“地球——我们的家园”。这表明教育资源正在关注环境教育,旨在培养学生的环保意识。 2. 知识目标:教学设计中包含了三个层次的目标...
划线句采用了排比的修辞手法,强调了战争对家庭的破坏,并提出“一起一致”行动,维护和平,阻止战争,为21世纪敲响和平的丧钟。这表达了作者对和平的深切期盼,以及希望全世界共同反对战争的愿望。 四、表达和平...
2. **环境问题敲响了警钟** - 教师可以通过播放视频,展示环境污染、人口增长和资源消耗等问题,引发学生对地球承受压力的关注。 - 学生在活动中会思考科学家寻找第二家园的原因,认识到环境问题的紧迫性,例如...
今年,集团内部连续发生的重大安全事故为全体人员敲响了警钟,强调了安全发展的必要性。全国第五个“安全生产年”和第12个“安全生产月”的到来,进一步凸显了当前阶段对安全工作的紧迫性和重要性。 “安全第一,...
勒索病毒敲响网络安全警钟.pdf
标题和描述中提到的核心知识点主要围绕电动汽车的发展对石油公司的影响展开。随着电动汽车技术的进步和市场需求的增长,石油...石油公司必须调整战略,适应这个由电动汽车引领的新时代,同时也为应对气候变化做出贡献。
【标题】:“教育培训行业点评:韦博英语倒闭带来的思考——政策与资本夹击下,关注教培行业现金流风险” 在当今社会,教育培训行业扮演着重要的角色,为个人提供提升技能和知识的平台,也为社会发展输送人才。然而...