两种编程风格

两种不同和编程风格。

EAFP: easier to ask for forgiveness than permision.

LBYL: look before you leap.


这是两种相对应的编程风格,

熟悉C的同志大多使用LBYL风格,其原则是“在做一件事之前先要判断能不能这样做”, 表现在代码里就是一堆的if。举一个例子,一个C函数的输入参数是一个指针,

那函数里的第一步往往是“if(input == NULL) return;”。 这就是LBYL的风格。

而EAFP风格是这样的,管你让不让我这样做,我先这样做,如果做错了,我再纠正。表现在代码 里是try...except对。


EAFP与LBYL并不局限在某种语言,但在实际中,由于语言设计的问题,易用性上是不同的。用C++/C与python做比较,python对EAFP有相当好的支持,但C++却没有。

也就是如果发生任何错误,C++不能完全依赖于抛出异常(尽管它有异常)。比如一个指针是NULL,对它的使用会是产生一个segment fault,而非引发异常。


个人觉的EAFP逻辑上更加合理,编程上更加结构化,运行上更加高效(在错误发生的概率远远低于正常运行的情况下)。

使用python官网文档中的一个例子。在一个多线程的环境中,LBYL面临着一个风险,即条件判断与紧接着的代码执行的竞争。比如 “if key in mapping: return mapping[key]”,

在线程1判断为真要向下执行的时候,线程2可能已将mapping中的这个key给删除了。如何解决这个问题,一种方式是加线程锁,这就是LBYL的风格,在做想做的事之前,先判断能不能做,每次都要判断(烦不烦);另一种方式就是采用EAFP的风格,管你让不让做,我就直接return mapping[key], 连”if key in mapping也省了“。错了呢?我加try...except,在except中处理,此分支也正是说明当前key不在这个mapping中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值