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

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

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

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

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

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

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

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

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

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

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

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

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

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

def reportState = {   



  val _this = this   




  synchronized {   




    val msg = "%s Received request to report state with %d items in mailbox".format(   



                   _this, mailboxSize)    


    log.info(msg)   


  }   


  Actor.actor { _this ! ReportState }   


}   

相关推荐