首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构化编程中是否存在函数约束?

结构化编程中是否存在函数约束?
EN

Software Engineering用户
提问于 2015-05-10 11:02:46
回答 2查看 144关注 0票数 1

我只是和一位教授C(编程基础课程)的同事(大学讲师)交谈。他说如果他在函数中使用I/O (scanfprintfcin count),或者如果他写了一个做两件事的函数(例如,为了返回数组的最大值,他不应该对数组进行排序并返回第一个元素),他就不会给学生打分,但是他可以使用两个函数,一个用于排序,另一个用于返回第一个元素.

我认为这些都与他的教学方法有关,但他声称这是结构化编程中的函数原则。

函数真的有这样的约束和定义吗?那些是什么?如果是的话,他们讨论的主题是什么?是否应该在C或C++教学课程中讨论这些问题?

EN

回答 2

Software Engineering用户

发布于 2015-05-10 11:39:17

scanfprintf使用stdinstdout,这意味着以下几点:

  • 它们有副作用。这意味着它们不适合于函数式编程和并行计算。想象一下读取stdin的两个线程。并行运行这些线程可能带来什么后果?调试那些只会出现并且很难重现的问题会有多容易呢?
  • 它们创建依赖关系。如果库依赖于stdinstdout,那么在用户期望通过GUI而不是控制台显示数据的桌面应用程序中,使用起来简单吗?那网络应用呢?为了解决这个问题,可以使用依赖注入,确定库是如何与外部世界交互的,而不是依赖于stdinstdout
  • 如果程序在无人值守的情况下运行(外部交互命令提示符)怎么办?这通常是Linux命令行脚本中的一个问题,这些脚本假设总是有一个用户可以输入Y或N来回答特定的问题。它适用于非常基本的场景,当有人需要以自动化的方式使用它们时,它就会不幸地失败(在技术上仍然是可能的,只是不必要的复杂)。
  • 它们使得单元测试比应该进行的更加困难。
  • 他们假设输入和输出表单应该并且永远不会被配置。例如,一个方法可以printf有关其执行的信息以便被监视,这可能是基本场景所需要的。现在,如果应用程序增长了,并且应该将相同的信息发送到syslog,怎么办?如果需要过滤呢?

至于做两件事的功能,这显然是错误的。函数应该做一件和一件事,就像类只对功能的单个部分(SRP)负有责任一样。

让这个方法做多件事情会产生几种效果:

  • 很难为函数找到一个简洁、清晰的名称。CreateProductAndRefreshCache是个丑陋的名字。
  • 它通常会导致长期的方法。将这种方法分成两个较短的方法,往往可以获得更好的可读性和可维护性。
  • 单元测试并不简单。
票数 3
EN

Software Engineering用户

发布于 2015-05-10 11:37:08

他可能指的有两件事:副作用和可镇定性。

scanfprintf做IO,这是一个副作用。副作用(输入、输出和变量的变异)并不完全符合函数的数学定义,而且会使程序更难推理,因此有一种叫做“函数”的编程范式,它尽可能地避免这种情况。然而,C++并不是一种真正的函数式语言,所以如果他对它严格的话,那可能就没有什么意义了。

如果一个函数做了两件事,那么它就可以被分解成两个函数,分别做分开的事情,然后组合起来。这有以下几个原因:每个单独的函数都比较小(使推理更容易),可以单独理解,最重要的是,可以更容易地与其他函数组合来完成新的任务。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/283432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档