zycpp
V2EX  ›  C

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

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

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

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