使用Scala Actor时最差(或最好的)编程习惯?

【】前日,在stackoverflow上有一则关于Scala Actor的问题,很有代表性。该问题的答案对于学习Scala Actor的开发者会有一些帮助。这个问题是:

在使用Scala Actors的时候有哪些最差的使用习惯?

(如果还没有执行最好编程习惯的自信,那么先注重回避最差的习惯倒不失为一个很好的想法。不过事实上下面这些答案中已经在建议一些优良的使用习惯了。)

编辑推荐:Scala编程语言专题

下面是一份不错的答案(译文):

◆任何地方都不要使用!?,否则会造成系统锁定。

◆总是从actor类子系统线程发送消息。如果这意味着要通过actor.actor方法创造一个暂时的actor类,那么代码如下:

 
 
 
  1. case ButtonClicked(src) => Actor.actor { controller ! SaveTrade(trdFld.text) }   

◆给你的actor的反应(reactions)加一个“其它消息”处理程序。否则就不可能判断你是否在给一个错误的actor类发送消息:

 
 
 
  1. case other => log.warning(this + " has received unexpected message " + other  

◆对于你的原始actor类,不要使用actor.actor方法,而是用actor类的子类(subclass)。这么做的原因是只有通过子类你才能提供一个敏感toString方法。还有,如果你的日志中到处都有像下面的声明的话,调试actor类将非常的困难:

 
 
 
  1. 12:03 [INFO] Sending RequestTrades(2009-10-12) to scala.actors.Actor$anonfun$1  

◆把你系统中的actor类整理成文档,并明确注明它们接受什么消息,以及它们怎么精确的计算响应。使用actor类会导致标准程序(一般是用一个方法压缩)通过多个actor类之间的响应变成一个复杂的逻辑网络。没有好的文档管理很容易搞混。

◆保证你可以跟你的actor类在响应循环之外进行通信,从而确定它的状态。举个例子,我总是声明一个方法,使用一个和下面的编码类似的MBean调用。否则,很难看出你的actor类是在运行,还是已经关掉,是否有一大长串消息等等。

 
 
 
  1. def reportState = {   
  2.   val _this = this   
  3.   synchronized {   
  4.     val msg = "%s Received request to report state with %d items in mailbox".format(   
  5.                    _this, mailboxSize)    
  6.     log.info(msg)   
  7.   }   
  8.   Actor.actor { _this ! ReportState }   
  9. }   

◆把你的actors连在一起并把trapExit设置成true,否则它们会悄无声息的失败,这意味着你的程序不会按你所设计的执行,并且当消息留在actor的邮箱里时程序会溢出存储器。

对于以上这些Scala Actors的使用建议,你有什么看法么?

【编辑推荐】

  1. 从Java走进Scala:一步步教你使用Scala Actor
  2. Scala Actor:多线程的基础学习
  3. 十二步学会Scala(1):从下载安装到定义方法
  4. Scala讲座:面向对象和函数式的特点总结
  5. 万物皆对象:介绍Scala对象
THE END