`
inshua
  • 浏览: 8448 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

將輸入視為消息還是閉包

阅读更多
法一

如果當作閉包理解,接收函數效果大致如下:

function recv(msg){
    actionQueue.push(function(state, msg){ return function(){
            //TODO howto handle this message;
     }}(this, msg))
}


這個做法可以取到串行的效果,且接收消息時立即提交處理過程到隊列,看起來較為乾淨。

但如果 this 為值類型數據,當遇到幷發時,前一處理過程和後一過程將在同一個狀態上加工,會發生覆寫。

法二

如將該處理器設計為反哺的方式:

function recv(msg){
    actionQueue.push(function(state){
            //TODO howto handle this message
            return new_state;
     })
}


如上,處理隊列存儲的處理器接受一個參數 state,msg 因閉包帶進了處理器。在外部,需要一個推進 actionQuue 的調用:

var s1 = actionQueue.pop()(s0);
s1 = actionQueue.pop()(s1);
s1 = actionQueue.pop()(s1);
// so on



法三
消息隊列的使用方式大致如下:

var msg = actionQueue.pop();
var state = getState();
var state2 = handle(msg, state);
saveState(sate2);

var msg = actionQueue.pop();
var state = getState();
var state2 = handle(msg, state);
saveState(sate2);

// so on



這種方式使用相同的 handle 函數,因此它需要在一個 handle 中編寫所有處理邏輯。在函數處理語言中,會採用匹配方式使代碼看起來漂亮一些,當然,也會分出幾個子過程。如果是 java,還可能分出好些個類來。

法四
erlang 採用的方式是在等待消息前,先將處理過程、狀態壓棧,在收到消息後,將處理過程、狀態取出,讓處理過程處理狀態和消息。採用上面的寫法,大致如下:


// at first
process.hang(pid, {handle : someHandle, state : state})


function recv(pid, msg){
     var p = process.get(pid);
     p.handle(p.state, msg);
}

// if handler want loop
functiion someHandle(state, msg){
    // TODO handle and handle ...

    process.hang(pid, {handle : nextHandle, state : newState}
}



結論

考慮到函數的閉包特性,法二和法四具備相當的效果。但值得注意的是,法二屬於通常性質上的延後處理,法四貌似收到即處理,但在接收和處理之間,同樣有個投遞的過程。對於不具備切換和管理進程的平臺,法二是一個不錯的選擇,另外,法二還不需要設計信箱機制。

消息隊列的做法本身完全可行,做進程遷移更顯輕鬆,但它容易導致比較分散的代碼,容易演變為狀態機。

綜上,在 Java 平臺,使用法二是一個不錯的選擇。
分享到:
评论
1 楼 sp42 2012-11-12  
引用
Object is just poor man's closure.

相关推荐

    IOS swift3.0 下闭包语法整理

    你可以将闭包视为一种数据类型,与整型(Int)、浮点型(Float)等基本类型相似,可以作为参数在函数间传递。 二、基本语法 1. 闭包的声明 闭包的声明通常包括参数列表和返回值类型,用`(参数类型) -> 返回值类型`...

    Swift3.0 闭包整理 - CocoaChina_让移动开发更简单1

    - **全局函数和局部函数**:虽然不是真正意义上的闭包,但全局函数和局部函数都可以视为没有捕获环境的闭包。 在实际编程中,闭包通常与GCD(Grand Central Dispatch)、回调、Promise/Future模式以及Swift的`async...

    NFA,DFA->GFA->RE(自动机转正则表达式)

    这样,每个子集可以视为DFA中的一个新状态。NFA到DFA的转换保证了等价性,即新构造的DFA能够识别原NFA所能识别的所有字符串。 有了DFA之后,我们可以进一步将其转换为通用有限状态自动机(GFA)。GFA是一种扩展的...

    Groovy入门]第二讲.完成文本界面的程序框架

    闭包可以被视为一种匿名函数,可以作为参数传递给其他方法。在文本界面程序中,闭包可以用来封装特定的行为,比如验证用户输入或执行复杂计算。 ```groovy def validateInput(input) { return input.isNumeric() /...

    Javascript中的函数.pdf

    函数式编程是一种编程范式,它将计算视为数学上的函数计算。JavaScript是一门多范式语言,支持函数式编程。函数式编程强调使用不可变数据和纯函数,它关注于计算过程的结果而非过程本身。函数式编程的优点包括代码更...

    JavaScript函数式编程.pdf

    函数式编程(Functional Programming)是一种编程范式,它将计算视为数学函数的评估,并且避免改变状态和可变数据。在JavaScript中,函数是一等公民,这意味着函数可以被赋值给变量、作为参数传递给其他函数以及...

    Functional Programming with JavaScript_javascript_

    功能编程是一种编程范式,它强调将计算视为函数的组合,而非改变状态或执行控制流程。JavaScript,虽然最初设计为面向对象的语言,但其语法特性使其非常适合功能编程。以下是一些关键的功能编程概念,它们将在书中...

    傻瓜函数式编程.docx

    FP的核心理念是将程序视为一系列相互独立的数学函数组合,这些函数没有副作用,即它们不会对外部环境产生影响,仅依赖于输入参数来计算输出。 【函数式编程的特点】 1. **纯函数**:函数式编程中的函数是纯函数,...

    FP简单练习

    FP,全称Functional Programming(函数式编程),是一种编程范式,它强调将计算视为数学函数的求值,并避免改变状态和可变数据。在FP中,程序被看作一系列相互独立的函数组合,而非指令集。这样的编程方式有助于提高...

    JavaScript中的代码示例函数式编程,Manning2016___下载.zip

    JavaScript中的函数式编程是一种编程范式,它将计算视为对数据的函数应用,而不是通过改变状态或跳转控制流程来实现。在这个主题中,我们主要关注如何利用JavaScript的特性进行函数式编程,以及如何通过Manning2016...

    编译原理-词法分析.docx

    当识别到标识符时,会与关键字表进行匹配,如果匹配成功则视为关键词,否则视为普通标识符。 在实现词法分析器时,需要定义相关变量和数据结构。例如,可以定义一个联合体(union)来存放不同类型的单词内容,如...

    JavaScript Functional Programming for JavaScript Developers by A

    函数式编程的核心理念是将计算视为数据的转换过程,而不是通过改变状态或副作用来实现。在JavaScript中,函数式编程强调以下关键概念: 1. **纯函数**:纯函数的输出仅依赖于其输入,且不产生任何副作用。这意味着...

    swift-函数式编程思想

    在Swift编程语言中,函数式编程思想是一种强大的编程范式,它强调将程序设计视为计算的数学函数,而不是状态变化或指令序列。这种思想源于数学中的λ演算,旨在提高代码的可读性、可维护性和可测试性。在本篇文章中...

    lr语法分析源码

    2. 动态规划:LR分析器的构建过程中,闭包计算和状态转移表生成可以视为动态规划问题。 3. 状态机模型:LR分析器的本质是一个有限状态自动机,理解状态之间的转换至关重要。 4. 错误处理:当解析过程中遇到语法错误...

    JavaScript函数式编程pdf

    JavaScript函数式编程是一种编程范式,它将计算视为数据处理,并强调使用无副作用的纯函数。在JavaScript中,函数式编程允许我们写出更简洁、可读性更强的代码,同时提高了代码的复用性和测试性。《JavaScript函数式...

    JavaScript的函数式编程基础指南

    函数式编程在JavaScript中的核心在于将函数视为一等公民,即函数可以被赋值给变量、作为参数传递和作为其他函数的返回值。 首先,我们要理解函数是“第一等公民”的含义。在JavaScript中,函数可以像其他数据类型...

    一本关于JavaScript中函数式编程的书

    JavaScript中的函数式编程是一种强大的编程范式,它源自数学中的函数理论,强调将计算视为函数的求值,而不是状态的变化或指令的序列。在JavaScript中,函数式编程可以帮助我们写出更简洁、可读性强且易于测试的代码...

    Compiler_closure_design.zip

    等价类划分将无法区分的DFA状态归为一类,而状态合并则是将同一类中的所有状态视为一个DFA状态。 在"Compiler_closure_design"中,最简化可能通过以下步骤进行: 1. 确定等价状态:找出所有在语言接受方面无法区分...

    java版c++词法分析编译器

    状态转换图可以区分各种运算符,如加法、乘法、赋值等,并能识别括号、逗号、点号等其他符号,同时,无法识别的符号被视为非法。 在系统设计部分,词法分析器通常是一个Java控制台程序,它读取名为A.txt的文本文件...

Global site tag (gtag.js) - Google Analytics