计算化学公社

标题: 请问为何“当循环”中只应该有一个exit退出口? [打印本页]

作者
Author:
yjcmwgk    时间: 2018-1-12 17:56
标题: 请问为何“当循环”中只应该有一个exit退出口?
在S. J. Chapman所写,刘瑾等译的《Fortran 95/2003程序设计》第4.4.1节中提到,“保证在当循环中只有一个退出口”,这是一个良好的编程习惯。
也就是说
  1. [name:] do
  2. ...
  3.   if (逻辑表达式) exit [name]
  4. ...
  5. end do [name]
复制代码

在这里,exit出现的次数不要超过一次。这被作者认为是一种好的编程习惯。
这为什么是一种好的编程习惯?
如果一口气写一堆退出循环的条件,我觉得也很方便啊。
谢谢!
作者
Author:
ggdh    时间: 2018-1-12 18:20
本帖最后由 ggdh 于 2018-1-12 18:34 编辑

好好的编程习惯就是假定看你的代码的人智商没有下限。跟代码写起来是否方便以及运行效率是否高没有多大关系。
一个循环出口越多,越难看懂。
另外据说好的代码要尽量避免循环和if,
参考Cyclomatic complexity
P.S. 个人观点:如果是自己编个小脚本自己用用。而不是搞什么大的软件工程,大可不必讲究这些什么好的编程习惯。方便效率就好。

作者
Author:
kyuu    时间: 2018-1-13 15:01
Fortran是一门非常古老的结构化程序设计语言,构成结构化的三个基本结构依次为顺序结构,分支结构和循环结构。普遍来说,Fortran被认为在结构化方面上虽然灵活但不具备结构化完备性;完全结构化程序设计语言要求不允许使用无条件转向语句goto,要求一个模块只有一个入口和一个出口,这样不会破坏结构化也便于结构化管理。
仅此而已。

作者
Author:
yjcmwgk    时间: 2018-1-16 09:43
本帖最后由 yjcmwgk 于 2018-1-16 09:45 编辑
kyuu 发表于 2018-1-13 15:01
Fortran是一门非常古老的结构化程序设计语言,构成结构化的三个基本结构依次为顺序结构,分支结构和循环结 ...

额……平心而论,不让用goto其实并不总是合理的。
最近在写燃料电池电极效率预测方面的一些结合实验的半理论模拟程序
里面大量出现了这东西
  1.         write (*,*) "Now let we calculate the volcano graph."
  2.         write (*,*) "First, please select your task."
  3. 50100   write (*,*) "If you want to input the nessesary data from keyboard,   input 1;"
  4.         write (*,*) "If you want to input the nessesary data from a txt file, input 2."
  5.         write (*,*) "Now input 1 or 2 to select a function:"
  6.         read (*,*) select_function_number
  7.         if ( (select_function_number > 2) .or. (select_function_number < 1) ) then
  8.             write (*,*) "You input a wrong number. Please re-input (1 or 2):"
  9.             goto 50100
  10.         end if
复制代码

我始终认为,“远距离goto”是自找麻烦,但是“近距离goto”还是十分好用的。
我觉得自己肯定不是什么好人……
作者
Author:
kyuu    时间: 2018-1-16 12:18
yjcmwgk 发表于 2018-1-16 09:43
额……平心而论,不让用goto其实并不总是合理的。
最近在写燃料电池电极效率预测方面的一些结合实验的半 ...

https://en.wikipedia.org/wiki/Closure_(mathematics)
没理解也无所谓
作者
Author:
kyuu    时间: 2018-1-16 12:35
本帖最后由 kyuu 于 2018-1-16 13:11 编辑
kyuu 发表于 2018-1-16 12:18
https://en.wikipedia.org/wiki/Closure_(mathematics)
没理解也无所谓

算了,不然又有400开外的人说装逼了,你去看这篇
E. W. Dijkstra, Communications of the ACM, Vol. 11, No. 3, March 1968, pp. 147-148. DOI:10.1145/362929.362947





欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3