返回信息流@caicai617 @cocoyimasa @whw0928
tldr:应该如何决定一个函数返回值是什么?
---
写过不少代码,但一直对这个问题有疑问,如果各位有推荐的参考书籍或需要补上的知识请不吝赐教!感觉是一个方法论的问题。
写C程序的时候,调用许多标准库函数或系统函数时返回值常为状态值或errno或有特定含义的数值等等,如strncpy、fopen以至于main函数;当然自己也因为这种惯性思维吃过亏;
写Python的时候因为动态语言变量随取随用的特点,有时贪图方便就把经过函数处理完、想要接着用的值包在一个tuple或list里返回;
写MATLAB有时还会根据参数的不同返回不同个数的值。
按我自己的理解,“功能性”的函数应该返回状态值,而“操作数据”的函数则应该返回对应的数据。比如
bool isEmpty(object a);
data getData();
void setData(Data a);
T max(T a, T b);
但很多时候,自己也分不清到底该返回不返回,返回什么。
有一段时间严格遵守“能不返回就不返回”的写法,返回值一律写成 void 或 int,甚至把结果都用指针和引用传来传去,但自觉无厘头。后来遵循“想返回什么就返回什么”的写法,虽然很自然,但重看重构代码有时觉得以前的设计不好,也很纠结。
特来请教!
这是一条镜像帖。来源:北邮人论坛 / cpp / #98859同步于 2019/4/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【问题】关于函数返回值的菜鸟问题
yo1995
2019/4/21镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这不是函数返回值的问题,是可变与不可变的问题。两种风格有各自的考虑和优缺点,所以有各自适用和不适用的场景。比如可以类比一下js里Array的map和splice。相关话题:函数式编程,immutability等等
C语言中函数设计更多关注点在于内存的传递和维护上,当你对数据粒度和内存管理的需求较高时,对于
Data getData();
void setData(Data a);
这一类方法要格外注意:
1. Data的内存结构是什么;
2. getData返回值的内存由谁来分配,谁来释放;
3. setData传递的a参数由谁来分配,谁来释放。
当然,智能指针一定程度上能在代码编写上简化这类问题,但内存管理的基本理念还是要清楚。
有道理!之前没有从这方面考虑过这个问题。
【 在 lsdsjy 的大作中提到: 】
: 这不是函数返回值的问题,是可变与不可变的问题。两种风格有各自的考虑和优缺点,所以有各自适用和不适用的场景。比如可以类比一下js里Array的map和splice。相关话题:函数式编程,immutability等等
对对!自己对这个问题一直都有疑惑。[em2]比较现代的语言很多时候简化了内存管理的过程。
但之前写cpp的时候有时就搞不清。比如Data getData(); 这种函数,很多时候为了不给自己找麻烦,我宁可写成int getData(Data &d); 这样的形式,然后统一在更高层或是main函数中声明变量、初始化对象等等。
但总觉得这样写有时候不够清晰,包括上面楼层提到的可变不可变的问题,不知道这样是不是一个好的方法。
另外就是异常处理,如果在较低层函数中操作内存,总怕自己没法做好异常后内存的清理、抛出异常等等,因此很抵触这么做;但传值返回又怕效率低下,所以最后就变成了上述的类似于在main中把所有用到的变量全声明好的写法,感觉很不合理。
不知道有没有更合理的方法推荐!谢谢!
【 在 tonyjansan 的大作中提到: 】
: C语言中函数设计更多关注点在于内存的传递和维护上,当你对数据粒度和内存管理的需求较高时,对于
: [code=c]
: Data getData();
: ...................