WEB开发网
开发学院软件开发C语言 适合C# Actor的消息执行方式(2):C# Actor的尴尬... 阅读

适合C# Actor的消息执行方式(2):C# Actor的尴尬

 2010-09-30 20:50:29 来源:WEB开发网   
核心提示: 例如在pong对象的实现中,我们使用模式匹配,适合C# Actor的消息执行方式(2):C# Actor的尴尬(7),减少了不必要的类型转换和赋值,让代码变得简洁易读,与C#相比,唯一的优势可能就是F#中相对灵活的类型系统吧,还有一点值得顺带一提,我们在F#中可以灵活的定义一个操作符的作用

例如在pong对象的实现中,我们使用模式匹配,减少了不必要的类型转换和赋值,让代码变得简洁易读。还有一点值得顺带一提,我们在F#中可以灵活的定义一个操作符的作用,在这里我们便把“<<”定义为“发送”操作,避免Post方法的显式调用。这种做法往往可以简化代码,从语义上增强了代码的可读性。例如,我们可以这样启动乒乓测试:

ping << Pong(pong)

至于结果则与C#的例子一模一样,就不再重复了。

F#中的弱类型消息

可是,F#的世界就真的如此美好吗?试想,我们该如何实现一个需要接受多种不同消息的Actor对象呢?我们只能这样做:

let another = 
  { new obj Actor() with 
    override self.Receive(message) = 
      match message with 
       
      | :? PingMsg as pingMsg -> 
        // sub matching 
        match pingMsg with 
        | Ping(pong) -> null |> ignore 
        | Finished -> null |> ignore 
         
      | :? PongMsg as pongMsg -> 
        // sub matching 
        match pongMsg with 
        | Pong(ping) -> null |> ignore 
         
      | :? (string * int) as m -> 
        // sub binding 
        let (s, i) = m 
        null |> ignore 
         
      | _ -> failwith "Unrecognized message" }

由于我们必须使用object作为Actor接受到的消息类型,因此我们在对它作模式匹配时,只能进行参数判断。如果您要更进一步地“挖掘”其中的数据,则很可能需要进行再一次的模式匹配(如PingMsg或PongMsg)或赋值(如string * int元组)。一旦出现这种情况,在我看来也变得不是那么理想了,我们既没有节省代码,也没有让代码变得更为易读。与C#相比,唯一的优势可能就是F#中相对灵活的类型系统吧。

C#不好用,F#也不行……那么我们又该怎么办?

出处:http://www.cnblogs.com/JeffreyZhao/archive/2009/07/13/message-execution-model-for-c-sharp-actor-2-embarrassing-c-sharp-actor.html

上一页  2 3 4 5 6 7 

Tags:适合 Actor 消息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接