V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zycpp
V2EX  ›  C

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

  •  
  •   zycpp · 2019-03-29 10:39:29 +08:00 · 3233 次点击
    这是一个创建于 2069 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    另外,内部函数不是不检查,而是用断言机制检查。
    ian511
        18
    ian511  
       2019-03-29 17:08:48 +08:00
    脱离不了从上下游实际 use case 考虑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1483 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:20 · PVG 01:20 · LAX 09:20 · JFK 12:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.