Nível 88 não define variáveis booleanas

A rigor, o nível 88 serve para definir “nomes de condição”, ou condition names. Por serem usadas no programa de maneira semelhante às variáveis booleanas de outras linguagens, muita gente confunde os dois conceitos.

Variáveis booleanas podem assumir dois valores – verdadeiro ou falso – e são usadas em comandos condicionais. Elas existem em muitas linguagens de programação, mas não no COBOL.

Para entender a diferença, vamos começar observando como as variáveis booleanas funcionam. O código abaixo mostra como uma variável desse tipo pode ser usada no Java:

import java.io.*;

public class Nivel88 {
  
public static void main(String[] args) throws Exception {

    boolean flag = true;
    if (flag) {
        System.out.println("Flag=True");
    } else {
        System.out.println("Flag=False");
    }
    System.exit(0);
}
}

Repare que a variável booleana flag é usada aqui para simplificar o comando if, pois não foi necessário escrever “if (flag == true) {“.

Já o nível 88 do COBOL oferece mais opções. Ele dá nome a determinadas condições mas não apenas para verificar se o valor de uma variável é true ou false.

Observe o exemplo abaixo. Definimos uma variável chamada estado-civil, e embaixo dela, quatro nomes condicionais: solteiro, casado, divorciado e viúvo. Condition names sempre são definidos abaixo de um item elementar.

03 estado-civil      pic x(001) value spaces.
    88 solteiro      value "S".
    88 casado        value "C".
    88 divorciado    value "D".
    88 viuvo         value "V".

Agora, ao invés de comparar a variável estado-civil com um dos valores do seu domínio, podemos codificar o programa fazendo referência direta ao nome da condição.

Ou seja, ao invés de escrever…

if estado-civil = "C"
    perform solicita-certidao-casamento
else
    if estado-civil = "D"
        perform solicita-averbacao-divorcio
    else
        if estado-civil = "V"
            perform solicita-atestado-obito
        end-if
    end-if
end-if

…podemos escrever…

if casado
    perform solicita-certidao-casamento
else
    if divorciado
        perform solicita-averbacao-divorcio
    else
        if viuvo
            perform solicita-atestado-obito
        end-if
    end-if
end-if

Diferentemente do que fizemos no Java, aqui não estamos verificando se o valor da variável estado-civil é verdadeiro ou falso. Nós demos nomes às condições para simplificar a codificação do programa e aumentar a clareza do código.

Condition names podem ser definidos também com uma lista ou um range de valores, o que na prática dá nomes a condições compostas. No exemplo abaixo, demos nomes a diversas condições envolvendo a variável wt-cd-rubrica:

01 wt-cd-rubrica pic x(003).
    88 rendimentos-tributaveis value
        "005" "019" "021" "022" "023" "024" "051" "053" 
        "055" "056" "061" "062" "063" "064" "077" "078" 
        "079" "709" "710" "711" "712" "713" "718" "719". 
    88 rendimento-bruto value
        "005" "019" "021" "022" "023" "024" "051" "053" 
        "055" "056" "061" "062" "063" "064" "077" "078".
    88 assistencia-medica value
        "095" "097" "098" "470" "510" "512" "516" "534" 
        "738" "114" "722" "050" "085" "092" "462" "463".
    88 abono-anual value
       "052" "730" "754" "912" "923" "928" "939" "940".
    88 pensao-alimenticia value
       "483" "484" "485" "486" "535" "538" "549" "634" 
       "911" "420" "421" "423" "400" thru "417".
    88 abono-pensao-alimenticia value
       "418" "430" "431" "438" "460" "461" "468" "469" 
       "478" "479" "480" "481" "482" "931" "961" "487" 
       "424" "459".

Com isso, podemos simplificar bastante a codificação do programa substituindo um longo if ou evaluate por um único nome autoexplicativo:

Ao invés de…

if wt-cd-rubrica = "052" or "730" or "754" or "912"or
                   "923" or "928" or "939" or "940"
    perform calcula-abono-anual
end-if 

…escrevemos simplesmente…

if abono-anual
    perform calcula-abono-anual
end-if

Repare ainda na declaração da variável que além de listar os valores de cada condição, podemos também definir um range de valores, como em “400” thru “417”.


Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *