41

この部分を正しく理解できないようです。たくさんの名前が入った入力ファイルが与えられましたが、そのうちのいくつかはスキップする必要があり、それぞれに追加情報が含まれています。ANDとORを使用して、不要な名前をスキップしようとしていたので、これを思いつきました。

IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr' AND
GRAD-STAT-IN = ' ' OR 'X'

1人を除いてすべてが削除されましたが、別のANDとORのセットを追加しようとすると、プログラムは規定のように動作し始めました。

コンパイラにとって複雑すぎましたか?物事をスキップする簡単な方法はありますか?

4

4 に答える 4

142

物事を論理的にグループ化するためにいくつかの括弧を追加してみてください。

IF (DL-CLASS-STANDING = 'First Yr' OR 'Second Yr') AND (GRAD-STAT-IN = ' ' OR 'X')

于 2010-12-03T03:41:38.190 に答える
31

句がたくさんある場合、展開はあなたが思うものではないかもしれないので、その省略された式を完全に展開することを検討したいかもしれません-明示的である方がはるかに良いことがよくあります


ただし、レベル変数を使用してこれ88読みやすくします。これらは、コードで明示的な条件を使用するのではなく、データ分割で条件を直接指定できるようにする特別なレベルでした。

つまり、データ部門に次のようなものを配置します。

03  DL-CLASS-STANDING  PIC X(20).
    88 FIRST-YEAR          VALUE 'First Yr'.
    88 SECOND-YEAR         VALUE 'Second Yr'.
03  GRAD-STAT-IN       PIC X.
    88 GS-UNKNOWN          VALUE ' '.
    88 GS-NO               VALUE 'X'.

88次に、式でレベル変数を使用できます。

IF (FIRST-YEAR OR SECOND-YEAR) AND (GS-UNKNOWN OR GS-NO) ...

私の意見では、これはより読みやすく、COBOL結局のところ、全体のポイントは読みやすい英語のように見えることでした。

于 2010-12-03T03:37:59.060 に答える
9

最初に注意すべきことは、表示されているコードは機能していたコードであり、目的の結果が得られなかった修正されたコードは表示されなかったことです。補遺として、なぜ一人だけが残っているのなら、もっと多くの選択が必要になるのでしょうか?要約すると、実際の質問は、「COBOLでORを使用する方法がわかりません。COBOLでANDを使用する方法がわかりません」と言う以外に不明確です。

それを超えて、2つの実際の質問がありました:

  1. コンパイラにとって複雑すぎましたか?

  2. 物事をスキップする簡単な方法はありますか[条件を書くためのより明確な方法はありますか]?

第一に、答えは「いいえ」です。コンパイラにとってそれは難しいことではありません。コンパイラーは、OR、AND(およびNOT、後で説明します)の任意の組み合わせを処理する方法を正確に知っています。問題は、人間のライター/リーダーが条件を正常にコーディングして、コンパイラーがそのルールに従ってコンパイラーからの結果を与えるのではなく、コンパイラーが必要なものを認識できるようにすることができるかどうかです(これは、行の複数の可能な人間の解釈を考慮していません)コードの)?

したがって、2番目の質問は次のようになります。

コンパイラが作成者としての私の意図と同じ方法で、COBOLの経験を持つコードの読者にとって同じ方法で理解する複雑な条件を作成するにはどうすればよいですか?

まず、質問の(動作中の)コードをすばやく再配置します。

IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr'
AND GRAD-STAT-IN = ' ' OR 'X'

そして、答えの1つで提案されたコードの:

IF (DL-CLASS-STANDING = 'First Yr' OR 'Second Yr')
AND (GRAD-STAT-IN = ' ' OR 'X')

2番目のバージョンはより明確ですが、(またはおよび)最初のバージョンと同じです。それはそのコードを機能させませんでした、それはそのコードが機能し続けることを可能にしました。

答えは、複雑さが増した状態の問題の解決に取り組むことでした:括弧/括弧(複雑さを単純化することは別の可能性ですが、機能しない例がなければ、提案を行うことは困難です)。

元のコードは機能しますが、より複雑にする必要ある場合は、ホイールが脱落し始めます。

提案されたコードは機能します、条件の複雑さを拡張するという問題を(完全に)解決しません。これは、マイナーでは、条件の複雑さを拡張するという問題を括弧内で繰り返すためです。

これはどうですか?

単純な条件:

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を角かっこ内に配置すると、人間の元の問題を再現できます。それはどういう意味ですか、そしてそれはどのように機能しますか?

1つの答えはこれです:

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で拡張したい場合、それは簡単で明確です。コンディションパーツの1つと同じレベルで行われる場合、それはそれにのみアタッチされます。最も外側のレベルで実行すると、両方(すべて)に接続されます。

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を学ぶ人々にとって、物事を単純に保つことは、すべての人にとって長期的な利益です。

于 2013-12-31T00:30:44.713 に答える
2

原則として、可能な限りANDの使用は避けます。ネストされたIFの作業も同様に読みやすく、88レベルを適切に使用することで、それほど深く掘り下げる必要はありません。少なくとも私の経験では、これは非常に読みやすいようです。

05  DL-CLASS-STANDING            PIC X(20) VALUE SPACE.
    88  DL-CLASS-STANDING-VALID  VALUE 'First Yr' 'Second Yr'.
05  GRAD-STAT-IN                 PIC X     VALUE SPACE.
    88  GRAD-STAT-IN-VALID       VALUE SPACE 'N'.

次に、コードは次のように単純です。

IF DL-CLASS-STANDING-VALID
    IF GRAD-STAT-IN-VALID
        ACTION ...  .
于 2017-11-21T15:37:35.950 に答える