zycpp
V2EX  ›  C

函数参数检查,是调用的函数做,还是被调函数做?(假设都是同一个人写的)有什么原则吗,或者看心情。。。

  •  
  •   zycpp · Mar 29, 2019 · 4447 views
    This topic created in 2783 days ago, the information mentioned may be changed or developed.

    比如检查参数是否是空指针

    void foo(int* a){
     // check if a is null ?
    }
    
    int* get_a(void){
     return NULL;
    }
    
    int main(){
     int* a= get_a();
     // check if a is null ?
     foo(a);
     return 0;
    }
    

    或者类似的检查参数是满足某种条件

    void foo(const int& a){
     // check if a >0 ?
    }
    
    int get_a(void){
     return -1;
    }
    
    int main(){
     int a = get_a();
     // check if a >0 ?
     foo(a);
     return 0;
    }
    
    18 replies  •  2019-03-29 17:08:48 +08:00
    lihongjie0209
    lihongjie0209
    Mar 29, 2019
    1
    看你怎么定义这个函数了 前置条件和后置条件了解一下
    mooncakejs
    mooncakejs
    Mar 29, 2019 via iPhone
    2
    被调函数做。 高频或者 内部函数不用做。
    jmc891205
    jmc891205
    Mar 29, 2019
    3
    如果现在以及将来都是只有同一个人调用 那谁做都可以
    如果会有其他人来调用 那被调的要做
    wutiantong
    wutiantong
    Mar 29, 2019
    4
    为了解决这个问题现代语言引入了 optional 类型,
    即使 C 语言里没有 optional 类型,你也应该效仿其思想,
    关键点是要事先约定好参数是否允许为 null。
    wutiantong
    wutiantong
    Mar 29, 2019
    5
    应该尽可能的把 约束条件封装成类型,而不是使用裸的基本类型(指针,int, double )然后再写 check code
    wutiantong
    wutiantong
    Mar 29, 2019
    6
    甚至通过最简单的 typedef 也能取得有意义的改进(通过类型名产生一种文档约定的效果)
    darknoll
    darknoll
    Mar 29, 2019
    7
    是个好问题
    Yourshell
    Yourshell
    Mar 29, 2019
    8
    如何使用这个函数不应该由这个函数定义吗?
    Ahaochan
    Ahaochan
    Mar 29, 2019
    9
    被调函数做,你不能保证调用你代码的人是怎样的一个人(
    hx1997
    hx1997
    Mar 29, 2019 via Android
    10
    统一约定好就行了吧,如果内部不检查,就要在文档或注释写清楚。
    geelaw
    geelaw
    Mar 29, 2019 via iPhone
    11
    需要考虑的问题是:

    - 谁应该消费这个函数?
    - 潜在消费者和提供者之间有边界吗?
    - 怎样效率高?
    miaoxia
    miaoxia
    Mar 29, 2019 via iPhone
    12
    函数内部已代码的方式做判断,外部已文档的方式通知。调用方基于文档安规则传值,如果没按规则,就会得到文档中提到的异常情况。
    TreStone
    TreStone
    Mar 29, 2019 via Android
    13
    模块内部接口调用调用者保证,对外接口被调者保证
    MeteorCat
    MeteorCat
    Mar 29, 2019 via Android
    14
    被调用参数做
    owenliang
    owenliang
    Mar 29, 2019 via Android
    15
    对外提供一定要检查。
    Joyboo
    Joyboo
    Mar 29, 2019
    16
    如果一万个地方调用呢?难道做一万次检查
    bp0
    bp0
    Mar 29, 2019
    17
    @Joyboo 如果是一个外部函数,就算是一百万个地方调用,也要检查一百万次。因为你无法保证调用者按照约定去使用这个外部函数。

    另外,内部函数不是不检查,而是用断言机制检查。
    ian511
    ian511
    Mar 29, 2019
    18
    脱离不了从上下游实际 use case 考虑
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2380 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 00:32 · PVG 08:32 · LAX 16:32 · JFK 19:32
    ♥ Do have faith in what you're doing.