浏览 2433 次
锁定老帖子 主题:模式匹配的实现和使用
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-27
下面是一个常规的Fib编码: public int fib(int n) { if (n < 2) return 1; return fib(n - 2) + fib(n - 1); } // 伪代码 public int fib(int n) { PUSH_VARB n PUSH_INT 2 CALC < JMPF 0006: POP PUSH_INT 1 RETURN [1] 0006:PUSH_FUNC main::fib PUSH_VARB n PUSH_INT 2 CALC - CALL [2] PUSH_FUNC main::fib PUSH_VARB n PUSH_INT 1 CALC - CALL [2] CALC + RETURN [1] RETURN } 再看一下模式匹配的写法: public int fib(int n ? n < 2) // 要求: n < 2 { return 1; } public int fib(int n) { return fib(n - 2) + fib(n - 1); } // 伪代码 public int fib(int n) { PUSH_VARB n PUSH_INT 2 CALC < JMPF 0007: POP PUSH_INT 1 RETURN [1] RETURN 0007:PUSH_FUNC main::fib PUSH_VARB n PUSH_INT 2 CALC - CALL [2] PUSH_FUNC main::fib PUSH_VARB n PUSH_INT 1 CALC - CALL [2] CALC + RETURN [1] RETURN } 对比两种编码的伪代码可以看出编译器对模式匹配函数自动添加了检测执行代码并进行了函数合并。一切就是这么简单。 模式匹配通常用于替代函数功能级的复杂分支语句,比如嵌套的if语句或switch语句。它的优点是在语法上实现了代码分离,有新的编码要求时只需增加新匹配模式或者删改已有的匹配模式即可,程序员无须维护一个复杂的分支函数。 下面举一个使用模式匹配的简单例子: <html> <head> <title>查看</title> </head> <body> <% ==> begin CGI public void display(string table id_field content_field click_field ID) { // 显示内容 = sys::db().selectStr(@"SELECT %(content_field) FROM %(table) WHERE %(id_field)='%(ID)'").html(); // 增加点击量 sys::db().execSQL(@"UPDATE %(table) SET %(click_field)=%(click_field)+1 WHERE %(id_field)='%(ID)'"); } // 建立模式匹配 public void view(string cate ID ? cate == "news") // 新闻 { display("news", "news_ID", "news_content", "news_clicks", ID); } public void view(string cate ID ? cate == "file") // 文章 { display("files", "file_ID", "file_content", "file_view_count", ID); } public void view(string cate ID ? cate == "msg") // 消息 { display("msgs", "msg_ID", "msg_content", "msg_clicks", ID); } // 执行模式匹配 view(${request.cate}, ${request.ID}); ==> END CGI %> </body> </html> 是否使用模式匹配是个习惯问题,也是个经验问题,有时只是老板个人的问题。 从技术上讲,条件越复杂,模式匹配就越有用,这点是可以肯定的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |