类似Python这种动态语言的一个疑惑

类似Python这种动态语言的一个疑惑

初问

Zhang Jiawei <[email protected]>
发件人当地时间 发送时间 11:33 (GMT+08:00)。发送地当前时间:上午9:56。 ✆
回复      [email protected]
发送至     python-cn <[email protected]>
日期      2010年12月25日 上午11:33
主题      [CPyUG] 类似Python这种动态语言的一个疑惑

codebase 中 merge 了别人的代码以后。即便双方都没有改动同一个文件,也可能出现这种情况:

merge 了两个文件以后, 程序员基本都不会意识到现在出了问题。

原因有两个:

  1. python 程序员基本不用什么IDE, 如果使用 pydev 之类, 大致还能依靠 IDE 在merge 以后看到这个错。
  2. python 没有编译的概念,没有机会看到编译器对这个语法问题的报错。

好了,现在只有等上线以后,通过某个事件触发这个bug了。

请问各位是杂么防范这种问题的?

强答

沈崴 <[email protected]>
日期      2010年12月28日 上午10:58
主题      [CPyUG] Re: 类似Python这种动态语言的一个疑惑

On 12月25日, 上午3时33分, Zhang Jiawei <[email protected]> wrote:

关于这个问题,

所以我想说的是:

   试图使用静态检查,和使用 IDE 进行参数约束的想法,才是真正危险的!

   1 def adduser(**args):
   2    u = args['username']
   3    p = args['password']
   4    #...

如果这样调用 adduser(name='tom', gender='male') 就会出错,这时调用者 可以立即明白,逻辑上有问题了。你的程序就真正减少了一个 bug。

所以,结论完全相反,比起静态语言,像 python 这种动态语言更难产生 "bug"

> 1. python 程序员基本不用什么IDE, 如果使用 pydev 之类, 大致还能依靠 IDE 在merge 以后看到这个错。

许多人都是这样的。

> 2. python 没有编译的概念,没有机会看到编译器对这个语法问题的报错。

> 好了,现在只有等上线以后,通过某个事件触发这个bug了。

我想说的是:

   即便上线了,当有问题时不出错,才是真正可怕的事情。

上线的程序,都需要从静态语言崩溃和动态语言报错中恢复的机制,和错误报告机制。 当然,当程序上线时,traceback 总比 core dump 要可爱得多。 而且动态语言调试又要方便一些,用户很快可以得到更新补丁。

> 请问各位是杂么防范这种问题的? > > unit test ?

所以结论是,不仅不防范,而且还要尽量制造和纵容这种所谓的错误。

继续

On 12月28日, 上午4时59分, Wei guangjing <[email protected]> wrote:

> 在 2010年12月28日 上午10:58,沈崴 <[email protected]>写道:
> > 而在讨论中,大家都在想办法保证参数个数必须一致的问题,我这里随便举个例子:
> >    adduser(username, passwod)
> >    adduser(name, gender)
> > 作为同名接口,都具有两个参数,甚至都是字符串类型的,而且无论在编译还是运行期
> > 都不会报错。
>
> 静态语言是不会有这个问题的,因为不可能定义2个同名并有同样参数个数的方法。

两个同名并有同样参数个数的方法


c++ 可以 python 不行。

的情况 ;)

矫枉过正

Zhang Jiawei <[email protected]>
发件人当地时间 发送时间 20:38 (GMT+08:00)。发送地当前时间:上午10:03。 ✆
回复      [email protected]
发送至     [email protected]
日期      2010年12月28日 下午8:38
主题      Re: [CPyUG] Re: 类似Python这种动态语言的一个疑惑

如果得出这样的结论,我感觉有些矫枉过正了。

  1. 真的是个bug, 因为用户访问到这个语句行的时候,报错了。
  2. 我们不可能要求无论谁在写参数列表的时候都用map。
  3. 我的案例实际上用IDE或者其他的静态检查机制其实就可以解决问题,而且安全省力,没有附加步骤。
  4. 您说的参数语义的内涵发生变化而导致的问题其实开辟了第二个案例。其实静态语言里也存在,用 map也解决不了。因为大家merge代码的时候仍旧没有人意识到这里有问题,只有调用的时候才会发现问题。靠 unit test 应该能检查出来。如果unit test没报错,那么错的也是对的。
  5. IDE 或者 静态检查 的确检查不出您开辟的第二案例,但不等于 IDE 或者静态编译就是危险的,他们在自己力所能及的范围内检测出某些问题即可。比如我的案例。
  6. 我还是觉得不用把事情扯到静态语言的动态链接上,事情很简单,适用范围没有那么大,就说两个py之间 和 两个 .c 之间都有互相调用,如果 .c 是静态编译,通过编译器的报错会比执行到py才报错安全的多。即便是动态链接,楼上的朋友说了,参数个数的变化至少是可以通过编译发现的,因为.h 变了。您的第二案例,无论是动态语言还是静态语言都没办法不通过Unit Test解决。
  7. 我的案例同样是上线了,有问题不出错,和您的案例一样可怕。我和您的案例同样在静悄悄的等待出错的机会。

所以我想说的是:

  1. 试图使用IDE和静态检查机制解决所有问题是危险的,但是进行参数约束还是安全的,起码参数的个数首先没问题,然后再用Unit Test去保证参数语义的准确。

我的结论依旧,动态语言的出错几率会比静态语言大。靠 静态检查 + Unit Test 双保险解决问题。除此以外自己给自己制造问题太折腾。

另:c/python 好说,我想像不出 java 不用 IDE还能用什么写?

Exoweb

[email protected] <[email protected]>
发件人当地时间 发送时间 19:16 (GMT+08:00)。发送地当前时间:下午10:29。 ✆
主题      Re: [CPyUG] 类似Python这种动态语言的一个疑惑

我说说我原来在Exoweb时,我们的项目是怎么处理你这个问题的吧。

以上这几个步骤应该能够防范你所遇到的问题了吧?

Gary Jia <ke(AT)jia.name>
http://www.jiake.org
珍爱生命,远离京东!
http://www.tianya.cn/publicforum/content/free/1/1662804.shtml


反馈

创建 by -- ZoomQuiet [2010-12-29 02:05:43]