我只是和一位教授C(编程基础课程)的同事(大学讲师)交谈。他说如果他在函数中使用I/O (scanf、printf或cin count),或者如果他写了一个做两件事的函数(例如,为了返回数组的最大值,他不应该对数组进行排序并返回第一个元素),他就不会给学生打分,但是他可以使用两个函数,一个用于排序,另一个用于返回第一个元素.
我认为这些都与他的教学方法有关,但他声称这是结构化编程中的函数原则。
函数真的有这样的约束和定义吗?那些是什么?如果是的话,他们讨论的主题是什么?是否应该在C或C++教学课程中讨论这些问题?
发布于 2015-05-10 11:39:17
scanf和printf使用stdin和stdout,这意味着以下几点:
stdin的两个线程。并行运行这些线程可能带来什么后果?调试那些只会出现并且很难重现的问题会有多容易呢?stdin和stdout,那么在用户期望通过GUI而不是控制台显示数据的桌面应用程序中,使用起来简单吗?那网络应用呢?为了解决这个问题,可以使用依赖注入,确定库是如何与外部世界交互的,而不是依赖于stdin和stdout。printf有关其执行的信息以便被监视,这可能是基本场景所需要的。现在,如果应用程序增长了,并且应该将相同的信息发送到syslog,怎么办?如果需要过滤呢?至于做两件事的功能,这显然是错误的。函数应该做一件和一件事,就像类只对功能的单个部分(SRP)负有责任一样。
让这个方法做多件事情会产生几种效果:
CreateProductAndRefreshCache是个丑陋的名字。发布于 2015-05-10 11:37:08
他可能指的有两件事:副作用和可镇定性。
scanf和printf做IO,这是一个副作用。副作用(输入、输出和变量的变异)并不完全符合函数的数学定义,而且会使程序更难推理,因此有一种叫做“函数”的编程范式,它尽可能地避免这种情况。然而,C++并不是一种真正的函数式语言,所以如果他对它严格的话,那可能就没有什么意义了。
如果一个函数做了两件事,那么它就可以被分解成两个函数,分别做分开的事情,然后组合起来。这有以下几个原因:每个单独的函数都比较小(使推理更容易),可以单独理解,最重要的是,可以更容易地与其他函数组合来完成新的任务。
https://softwareengineering.stackexchange.com/questions/283432
复制相似问题