返回值的子程序不应执行i/o

A value returning subprograms should never perform i/o?

本文关键字:执行 子程序 返回值      更新时间:2023-10-16

我在阅读一份良好的编程实践文档时发现:

•值返回子程序将不使用参考参数,也不会执行任何I/O操作。返回值的子程序不会调用其他使用参考参数或执行I/O操作的子程序。

所以,我想你只能在有引用的void子程序中使用I/o?但是,人们真的遵循这个规则吗?或者它不是很重要?

返回值子程序将不使用参考参数

我确实在一些指南中看到了这一点,因为通过引用返回结果会降低程序的可读性。

例如,在下面的示例调用中,如何知道哪个参数是函数的输入,哪个参数是它的输出:

centroid = optimize(data,window);

不过,通过引用返回输出结果通常都是一样的。但是,您必须遵循严格的签名约定,其中输入参数为const,输出参数不是:

double optimize(const Data&   data,   // const ref,     means input
                      Window& window);// non-const ref, means output

有时提出的另一种解决方案是,输出参数应该通过指针而不是引用传递。因此,在上面的示例中,您将使用不同的签名,其中window是通过指针传递的:

double optimize(const Data&   data,   // const ref, means input
                      Window* window);// pointer,   means output

根据这个约定,您可以通过检查函数的调用方式来猜测输入和输出,而无需验证函数的签名:

centroid = optimize(data,&window);

返回值的子程序不会[…]执行任何I/O操作。

我以前从未遇到过这个指南,所以我不知道它的基本原理://实际上,有很多值返回函数可以执行I/O,例如输入函数、用户对话框、解析配置文件等等