对于2个条件的并集,在COBOL中使用IF还是EVALUATE?

时间:2011-11-30 23:38:28

标签: cobol

“如果有效,请不要碰它”......我明白了。也就是说,我正在扩展的代码镶嵌着这样的块:

 EVALUATE TRUE ALSO TRUE
  WHEN FOO-YES ALSO BAR-YES
   PERFORM ACTION
  WHEN OTHER
   SET ERROR TO TRUE
 END-EVALUATE

对于我没有经验的眼睛,IF似乎更清楚:

 IF FOO-YES AND BAR-YES
   PERFORM ACTION
 ELSE
   SET ERROR TO TRUE
 ENDIF

在编写新功能时,是否有理由更喜欢EVALUATE而不是IF?

4 个答案:

答案 0 :(得分:2)

你读得正确。 "真的是真的"编码是一件非常奇怪的事情。

通常你会看到"评估真实",在这种情况下,何时条件都像IF语句一样完全正常。使用ALSO引入了一些可能的奇怪之处,因为它不像所有其他语言的CASE语句。

更好的方法是:

Evaluate true
  when FOO-YES and BAR-YES
    perform action
  when other 
    set error to true
End-Evaluate

当然,TRUE也是正确的很容易理解,但是你也可以拥有真正的WS-BLAH-BLAH,它可能会让人感到困惑。 Cobol Evaluate动词非常强大,有时很容易用脚射击自己。也就是说,它非常强大,会让你做很多事。

通常情况下,那些不干净地嵌套的错综复杂的IF可以通过精心编写的评估来很好地修复。

答案 1 :(得分:2)

没有理由更喜欢EVALUATE而不是IF。我这样做,但我没有充分的理由。我尝试编写代码,以便维护者很容易理解,但是会出现逻辑复杂的情况,最终会出现像...这样的结构。

EVALUATE TRUE ALSO TRUE ALSO TRUE
  WHEN INITIAL-STATE ALSO ANY ALSO ANY 
       PERFORM 0100-INITIALIZE
       PERFORM 1000-DISPLAY-MENU
  WHEN MENU-DISPLAYED ALSO DFHRESP(NORMAL) ALSO UPDATE-REQUESTED
       PERFORM 2000-DO-THE-UPDATE
       EXEC CICS RETURN END-EXEC
  [...and so forth...]
END-EVALUATE

Somewhere有关于事情应该尽可能简单的引用,但并不简单。当然,有许多方法可以编写相同的逻辑。不同的人发现不同的结构更容易理解。由于这些差异,会出现很多争论。

答案 2 :(得分:0)

我可以说在某些情况下让生活变得轻松。比如说,我们将根据我们可能需要PERFORM不同的代码块来添加另一个条件;在这种情况下,添加另一个WHEN会很容易,而不是调整IF上的条件。以下是将WHENIF上的调整条件进行比较的点数:

  • 根据要执行的WHEN(s),我们可以根据需要提供尽可能多的PARAs
  • IF条件在使用ORAND参数时容易出错
  • 此外,WHEN清楚地说明了在分析IF(s)时我们可能需要调整眼镜的情况。 [当我们有复杂的循环时可能会发生这种情况,但作为一个有效的程序员,我们应该预测这种情况]
  • 最后但并非最不重要的是,将代码改装回以前的状态很容易,IFs的数量会很少。

但是在你目前的情况下,我感觉不太清晰,以及EVALUATEIF之间的区别。所以,选择让你开心的那个:)

答案 3 :(得分:0)

对我来说,这一切都归结为可读性(因此,以后更简单的维护)。

当我查看您问题中的2个代码段时,我发现IF块更具可读性。

在22年的Cobol编程中,我从未在ALSO中使用EVALUATE。 使用EVALUATE块进行简单的二进制真/假测试对我来说似乎有些迟钝。

但是不要误会我的意思,如果使用得当,我会爱EVALUATE。当我6年前开始用Java编程时,EVALUATE是我最想念的东西。当然,Java有switch,但不能像EVALUATE一样灵活使用。

考虑以下代码段:

IF ACTION = "START"
   PERFORM START
ELSE IF ACTION = "STOP"
   PERFORM STOP
ELSE IF ACTION = "PROCESS" AND FILE-NAME = "A"
   PERFORM PROCESS-A-FILE
ELSE IF ACTION = "PROCESS" AND FILE-NAME = "B"
   PERFORM PROCESS-B-FILE
ELSE IF ACTION = "RESET"
   PERFORM RESET
ELSE
   PERFORM INVALID-ACTION-ERROR.

这个IF语句集合存在一些实际问题。如果不在其末尾添加5 END-IF,则必须使用句号结束​​块。但是,如果代码位于PERFORM UNTIL ... END-PERFORM块内,那么你就无法做到这一点。虽然这个例子相当简单,但是在一个更复杂(更长)的例子中,找出哪个ELSE与哪个IF相关会很棘手。

这迫切需要放在EVALUATE TRUE块中,因此:

EVALUATE TRUE
   WHEN ACTION = "START"
      PERFORM START
   WHEN ACTION = "STOP"
      PERFORM STOP
   WHEN ACTION = "PROCESS" AND FILE-NAME = "A"
      PERFORM PROCESS-A-FILE
   WHEN ACTION = "PROCESS" AND FILE-NAME = "B"
      PERFORM PROCESS-B-FILE
   WHEN ACTION = "RESET"
      PERFORM RESET
   WHEN OTHER
      PERFORM INVALID-ACTION-ERROR
END-EVALUATE

将此EVALUATE更改为TRUE ALSO TRUE会降低其可读性,而且实际上没有必要。