“如果有效,请不要碰它”......我明白了。也就是说,我正在扩展的代码镶嵌着这样的块:
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?
答案 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
上的条件。以下是将WHEN
与IF
上的调整条件进行比较的点数:
WHEN(s)
,我们可以根据需要提供尽可能多的PARAs
。IF
条件在使用OR
或AND
参数时容易出错WHEN
清楚地说明了在分析IF
(s)时我们可能需要调整眼镜的情况。 [当我们有复杂的循环时可能会发生这种情况,但作为一个有效的程序员,我们应该预测这种情况] IFs
的数量会很少。但是在你目前的情况下,我感觉不太清晰,以及EVALUATE
和IF
之间的区别。所以,选择让你开心的那个:)
答案 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
会降低其可读性,而且实际上没有必要。