首先要注意的是,显示的代码是正在运行的代码,而没有给出预期结果的修改后的代码从未显示过。作为附录,如果只剩下一个人,为什么还需要更多的选择?总而言之,除了说“我不知道如何在 COBOL 中使用 OR。我不知道如何在 COBOL 中使用 AND”之外,实际问题并不清楚。
除此之外,还有两个实际问题:
我是否让它对编译器来说太复杂了?
有没有更简单的方法来跳过事情[有没有更清晰的写条件的方法]?
对于第一个,答案是否。对于编译器来说,这远非难事。编译器确切地知道如何处理 OR、AND(和 NOT,我们稍后会谈到)的任何组合。问题是,人类编写者/阅读者能否成功编写一个条件,以便编译器知道他们想要什么,而不是仅仅按照其规则从编译器给出结果(这不考虑对一行的多种可能的人类解释代码)?
第二个问题因此变成:
我如何编写一个复杂的条件,编译器将以与我作为作者的意图相同的方式以及对于任何具有 COBOL 经验的代码读者的相同方式来理解?
首先,快速重新排列问题中的(工作)代码:
IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr'
AND GRAD-STAT-IN = ' ' OR 'X'
其中一个答案中的建议代码:
IF (DL-CLASS-STANDING = 'First Yr' OR 'Second Yr')
AND (GRAD-STAT-IN = ' ' OR 'X')
第二个版本更清晰,但(或和)它与第一个相同。它没有使该代码工作,它允许该代码继续工作。
答案是解决复杂性增加的条件问题的解决方案:括号/括号(简单地简化复杂性是另一种可能性,但如果没有非工作示例,很难提出建议)。
原始代码可以工作,但是当它需要更复杂时,轮子开始脱落。
建议的代码有效,但它并没有(完全)解决扩展条件复杂性的问题,因为它在小括号内重复了扩展条件的问题条件的复杂性。
这是怎么回事?
一个简单的条件:
IF A EQUAL TO "B"
稍微复杂一点的条件:
IF A EQUAL TO "B" OR "C"
稍微但不完整的简化:
IF (A EQUAL TO "B" OR "C")
如果条件必须变得更复杂,使用 AND,对人类来说可能很简单(编译器不在乎,它不会被愚弄):
IF (A EQUAL TO "B" OR "C")
AND (E EQUAL TO "F")
但这又是什么呢?
IF (A EQUAL TO "B" OR "C" AND E EQUAL TO "F")
将 AND 放在括号内可以复制人类的原始问题。这是什么意思,它是如何工作的?
一个答案是这样的:
IF (A EQUAL TO ("B" OR "C") AND E EQUAL TO "F")
也许更清楚,但不是每个人都清楚,而且最初的问题仍然存在,在未成年人中。
所以:
IF A EQUAL TO "B"
OR A EQUAL TO "C"
简化了,对于第一部分,但仍然是次要问题(只需添加 AND ...),所以:
IF (A EQUAL TO "B")
OR (A EQUAL TO "C")
导致:
IF ((A EQUAL TO "B")
OR (A EQUAL TO "C"))
还有:
IF ((A EQUAL TO "B")
OR (A EQUAL TO C))
现在,如果有人想用 AND 进行扩充,那就简单明了。如果在与条件部分之一相同的级别完成,则它仅附加到该条件部分。如果在最外层完成,它会附加到两者(全部)。
IF (((A EQUAL TO "B")
AND (E EQUAL TO "F"))
OR (A EQUAL TO "C"))
或
IF (((A EQUAL TO "B")
OR (A EQUAL TO "C"))
AND (E EQUAL TO "F"))
如果有人想在括号内插入 AND 怎么办?好吧,因为在括号内它很简单,人们不倾向于这样做。如果括号内的内容已经很复杂,则倾向于添加它。似乎通过独立而简单的事物往往不会变得复杂,而已经复杂的事物(不止一件事,不是独立的)往往会在没有太多进一步思考的情况下变得更复杂。
COBOL 是一种古老的语言。许多用 COBOL 编写的旧程序仍在运行。许多 COBOL 程序必须修改,或者只是阅读才能理解某些东西,而且在它们多年的生命周期中要多次修改。
在更改代码时,通过向条件添加一些内容,最好不要“扰乱”条件的原始部分。如果将复杂性留在括号内,则更有可能需要扰乱代码,这会增加理解(它更复杂)和更改(需要更多小心,需要更多测试,因为代码被扰乱)的时间.
许多旧程序将成为不良做法的示例。除了要小心对待它们之外,没有什么可做的。
没有任何借口可以编写新代码,因为它在未来需要更多的维护和保养,而不是绝对必要的。
现在,上面的例子可能被认为是冗长的。是 COBOL,对吧?打字多吗?但是 COBOL 在数据定义方面提供了极大的灵活性。作为其中的一部分,COBOL 具有级别 88,即条件名称。
以下是上述部分的数据定义:
01 A PIC X.
88 PARCEL-IS-OUTSIZED VALUE "B" "C".
01 F PIC X.
88 POSTAGE-IS-SUFFICIENT VALUE "F".
条件变为:
IF PARCEL-IS-OUTSIZED
AND POSTAGE-IS-SUFFICIENT
现在,所有相关的文字值不再只是文字值,而是有了一个名称,以便编码人员可以指出它们的实际含义,以及带有该含义的实际值。如果要在 PARCEL-IS-OUTSIZED 中添加更多类别,则扩展 88 级别的 VALUE 子句。
如果要组合另一个条件,这样做要简单得多。
这一切都是真的吗?嗯,是。这样看。
COBOL 对编码条件的结果进行操作。
If condition
简单的条件可以通过使用括号来复合,形成一个条件:
If condition = If (condition) = If ((condition1) operator (condition2))...
等等,直到编译器的极限。
为了手头的目的,人类只需要处理他们想要的条件。对于一般逻辑流程,请查看 If 条件。为了验证,请查看最低的细节。对于子集,查看与子集相关的条件部分。
使用简单的条件。通过括号/括号使条件简单。通过组合简单的条件,在需要的地方创建复杂的条件。使用条件名称与文字值进行比较。
到目前为止,OR 和 AND 已被处理。 NOT 通常被视为需要谨慎对待的事情:
IF NOT A EQUAL TO B
IF A NOT EQUAL TO B
IF (NOT (A EQUAL TO B)), remembering that this is just IF condition
所以 NOT 并不可怕,如果它变得简单的话。
自始至终,我一直在编辑空格。因为括号在那里,我喜欢把它们放在你的脸上。我喜欢对条件进行结构化和缩进,以强调我赋予它们的含义。
所以:
IF ( ( ( condition1 )
OR ( condition2 ) )
AND
( ( condition3 )
OR ( condition4 ) ) )
(并且比这更具有雕塑感)。通过结构化,我希望 a) 我少搞砸,b) 当/如果我搞砸了,有人更有机会注意到它。
如果条件不简化,那么理解代码就比较困难。更改代码更加困难。对于学习 COBOL 的人来说,保持简单对所有人都有长远的好处。