免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: __BlueGuy__
打印 上一主题 下一主题

[C] Lua 造成的代码冗余太严重了, 这个现状怎么改善? [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
121 [报告]
发表于 2012-12-04 00:39 |只看该作者
starwing83 发表于 2012-11-21 01:19
3. if protect(function()
   -- code 1
end)(...) then
   -- code 2
end
等价:
try {
  -- code 1
} finially {
  -- code 2
}

finally可是无论是否发生异常都会执行。 你前面的代码是这样吗?


starwing83 发表于 2012-11-21 01:19
1. newtry(function()
    -- code1
end)(function()
   -- code2
end)
等价
try {
  -- code2
} catch(...) {
  -- code1
}


  1. try {
  2.       // code2
  3. } catch (X ) {
  4.       // code1
  5. } catch (Y ) {
  6.       // code3
  7. }
复制代码



这都不是重点。 重点是: 异常的优势不是用try/catch去代替status code。 那样没有任何优势, 反而让代码更难写。
异常的优势在于: 对不需要或者无法处理错误的地方就不去检测。
下面均假设一个代码片段无法处理错误。

  1. R1 r1 = acquire_r1(...);
  2. at_scope_exit(release_r1, r1);
  3. // code 1
  4. R2 r2 = acquire_r2(...);
  5. at_scope_exit(release_r2, r2);
  6. // code 2
  7. R3 r3 = acquire_r3(...);
  8. at_scope_exit(release_r3, r3);
  9. // code 3
复制代码
如果有错误发生了, 无论发生在哪个地方, 会继续往上报告。 并且动作总会被正确回滚。

Python有with, C#有using。 只有java那货才必须用try+finally(不过java8也加入了using了)。

对,它们都有一些隐性的约定。 比如close什么的。 这是无法否认的。
那么再降一级,只要支持first class function, 实现

  1. with_file("filename", "mode", function(file)
  2.   -- do somthing with file
  3.   with_connection(..., function(connection)
  4.     -- do someting with file and connection
  5.     end)
  6.   end)
复制代码
并不是难事, 而且非常简单吧?
哪怕这个与传统社区里理解的异常处理不同, 但这同样可以只关注逻辑, 让能处理错误的地方去处理错误。 (当然, 和Python的with, C#/Java的using一样难免嵌套, 不像C++那样可以平级的写)。

这种pattern,Haskell做了(不过Haskell还有其他异常处理方式, 很多, 我很晕)。
甚至连scheme都做了: http://www.schemers.org/Document ... tml#%_toc_%_sec_6.6
Lua必然有这个潜力, 问题是Lua做了没有?


因为这些种种原因, 我猜测Lua社区里依然以local ok_or_result, other_result, more_result ... = f(...) 为主。
如果猜错了, 我认错, 我再也不说"Lua不支持异常了"。
如果猜对了, 哪怕说服我"Lua支持异常", 那又怎样? 就为了骗骗小朋友?
至于这个猜测准不准, 还得靠你的统计数据了, 如果你有这个闲心的话。

论坛徽章:
0
122 [报告]
发表于 2012-12-04 10:12 来自手机 |只看该作者
我认为,链接和基于文件名的多态可以解决问题

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
123 [报告]
发表于 2012-12-06 14:33 |只看该作者
回复 121# OwnWaterloo


    网吧,我简单回一下。

是的,都支持。

newtry/protect机制的初衷,就是为了不用在每个调用上判断错误,因为这是在socket编程上非常普遍的事情。

这么说你明白了?

我想我知道你的误会在哪儿了。我可以明确的告诉你:Lua社区目前对于错误处理,的确依然还是local err, ... = f(...)这种。

那么我为什么说Lua本身已经支持异常了呢?我告诉你重点在哪儿,重点在:不是每个调用的地方,你都必须得这么写

明白了没?只有在你需要处理错误的时候,你才需要这么写,这就是Lua版本的catch。

如果你暂时不知道如何处理错误,或者不喜欢处理错误,直接写这个函数调用即可,不用传递返回值

你明白了吗?

顺带说一句,newtry/protect完全支持finially的语意。可以支持一段代码,无论如何都能被执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP