对函数、类方法进行参数校验的原则是什么(尤其是弱类型语言)

实现一个方法的时候,总是担心传来的参数不合法,但又不想去写校验,因为很冗余。
一个简单的功能,几行的事,写上一堆校验,方法就变老长了。而且一排方法,每个开头都有一堆验证的if else,看上去画风也很丑是不是?
更别提方法嵌套调用了,A调用B,B调用C,C调用D,如果这4个方法每个内部都写参数校验,那岂不是校验了4遍,多浪费资源?
所以这里面必然要有取舍,或者说规范、原则。
有请大佬们来谈谈这方面都有哪些原则,万分感谢。

阅读 4.4k
5 个回答

业务方法信任传入参数,入口方法严格校验参数。

入口方法一般是指得到用户输入的方法,不能信任任何外部输入。

因为业务方法拿到的参数一般情况下不会是入口方法一路直传下来的原始参数,而是经过一系列过滤、转换、判空等校验后的有效值才会走到业务方法,那么只要开发中能界定好业务/入口方法,就可以很大程度减轻参数检验的需要。

当然业务方法可以对部分关键参数进行校验,保证不会出现空指针之类的资源异常即可,在业务流程中发现问题及时终止/回滚也是原则。

谁调用谁校验,这就是原则

  1. 看来源是否可信,譬如是由用户输入的,那就肯定需要校验
  2. 看函数/方法的具体职责,在写校验之前,问一下自己到底应该是调用方对参数负责,还是被调用方对参数负责

在Python3.5中已经提供了type hints功能

In [1]: def greeting(name: str) -> str:
   ...:     return 'Hello ' + name
   ...:
   ...:

In [2]: greeting(name=1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-a94802c816eb> in <module>()
----> 1 greeting(name=1)

<ipython-input-1-311aff60a9bd> in greeting(name)
      1 def greeting(name: str) -> str:
----> 2     return 'Hello ' + name

TypeError: must be str, not int

小心驶得万年船。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题