Translate

quinta-feira, 21 de outubro de 2021

SECTION e PARAGRAPH no COBOL sem Mistérios

 

Bellacosa Mainframe e a section e paragraph no cobol

☕ Um Café no Bellacosa Mainframe

SECTION e PARAGRAPH no COBOL sem Mistérios

Como um Programador COBOL Padawan Aprende a Organizar seu Código como um Oficial da Frota Estelar

"A diferença entre um programa que apenas funciona e um programa que sobrevive por décadas está na sua organização."


Introdução — A Primeira Missão do Padawan COBOL

Imagine que você acaba de chegar à USS Enterprise.

O Capitão pede para localizar um problema em um sistema de navegação criado há 35 anos.

Você abre o código.

São 18.000 linhas de COBOL.

Não existe um comentário.

Não existe uma SECTION.

Não existe um PERFORM.

Apenas um gigantesco fluxo de GO TO.

Você pensa:

"Quem escreveu isso?"

A resposta normalmente é:

"Alguém extremamente inteligente...
...
...
em 1984."

Bem-vindo ao mundo real do Mainframe.

Uma das primeiras lições que um programador COBOL aprende é que escrever código é relativamente fácil.

O difícil é escrever código que outra pessoa consiga entender vinte anos depois.

É exatamente aí que entram os conceitos de PARAGRAPH e SECTION.

Eles existem desde os primórdios da linguagem e continuam presentes até hoje, mesmo em programas escritos para IBM z17, COBOL 6.5 e aplicações modernas integradas com APIs REST.

E curiosamente, muita gente usa os dois sem realmente entender por que eles existem.

Hoje vamos viajar até a origem desse conceito.


A origem histórica

Para entender SECTION precisamos voltar aos anos 60.

Naquela época:

  • memória custava uma fortuna;

  • CPU era extremamente cara;

  • cartões perfurados eram comuns;

  • manutenção era muito mais importante que desenvolvimento.

A equipe que criou o COBOL queria que programas fossem parecidos com documentos administrativos.

Por isso surgiram divisões naturais:

IDENTIFICATION DIVISION

ENVIRONMENT DIVISION

DATA DIVISION

PROCEDURE DIVISION

Mas logo perceberam um problema.

A PROCEDURE DIVISION podia crescer para milhares de linhas.

Era necessário organizá-la.

Assim nasceram:

  • Paragraphs

  • Sections

Inspirados em capítulos e subtítulos de documentos.

Ou seja:

Documento

Capítulo

Subcapítulo

Parágrafo

Exatamente como um livro.


O que é um Paragraph?

Um paragraph é simplesmente um bloco de instruções identificado por um nome.

Exemplo:

CALCULA-TOTAL.

    ADD VALOR TO TOTAL.

    COMPUTE IMPOSTO = TOTAL * 0.15.

    EXIT.

O nome termina com ponto.

Depois vêm os comandos.


Pode ser chamado assim:

PERFORM CALCULA-TOTAL

Muito simples.


O que é uma SECTION?

Uma SECTION é um agrupador de paragraphs.

Exemplo

CALCULO SECTION.

CALCULA-TOTAL.

...

CALCULA-IMPOSTO.

...

VALIDACOES SECTION.

VALIDA-CPF.

...

VALIDA-DATA.

...

Ou seja

Section

Paragraph

Comandos


É uma organização hierárquica.


Visualizando

PROCEDURE DIVISION

MAIN SECTION

   INICIO

   PROCESSA

   FINALIZA

LEITURA SECTION

   LE-DADOS

   LE-CLIENTE

CALCULOS SECTION

   SOMA

   DESCONTO

GRAVACAO SECTION

   ESCREVE

É praticamente uma árvore.


Por que isso foi criado?

Porque programas COBOL começaram a ficar enormes.

Muito antes da orientação a objetos.

Muito antes de módulos.

Muito antes de classes.

A SECTION funcionava como um "módulo lógico".


Como funciona internamente?

Quando fazemos

PERFORM CALCULA-TOTAL

O runtime:

guarda o endereço atual

salta

executa

volta

Semelhante a uma chamada de função.


Quando fazemos

PERFORM CALCULO

e CALCULO é uma SECTION...

Ele executa TODOS os paragraphs daquela section.

Exemplo

CALCULO SECTION.

SOMA.

...

IMPOSTO.

...

DESCONTO.

Resultado

SOMA

↓

IMPOSTO

↓

DESCONTO

Tudo automaticamente.


Este detalhe pega muitos iniciantes

Imagine

VALIDACAO SECTION.

VALIDA-A.

...

VALIDA-B.

...

VALIDA-C.

...

Se fizer

PERFORM VALIDACAO

Executará

A

B

C

Mesmo que você só queira A.


Então por que existem paragraphs?

Porque podemos chamar apenas um deles.

PERFORM VALIDA-B

Executa somente aquele.


O famoso EXIT

Quase todo mundo vê isso

EXIT.

e pensa

"isso encerra o paragraph."

Na verdade...

Não exatamente.

EXIT é praticamente um "não faça nada".

Uma instrução nula.

Ela existe para marcar explicitamente um ponto de saída.


Exemplo

CALCULA.

   ADD 1 TO TOTAL.

   EXIT.

O runtime simplesmente passa por ela.


Então por que usar?

Porque melhora a legibilidade.

Especialmente quando existem PERFORM THRU.


EXIT SECTION

Existe também

EXIT SECTION

Muito mais moderno.

Ele encerra imediatamente a section.


EXIT PARAGRAPH

Também existe.

EXIT PARAGRAPH

Ele retorna imediatamente daquele paragraph.

Muito mais claro.


Antigamente

Antes dessas instruções modernas era comum encontrar

GO TO FIM-ROTINA.

Hoje isso é considerado má prática.


GO TO versus PERFORM

Imagine

A

↓

GO TO C

↓

B

↓

GO TO D

↓

C

↓

GO TO A

Parece um prato de espaguete.

Daí surgiu o termo

Spaghetti Code.


PERFORM resolveu boa parte desse problema.


Curiosidade

Nos anos 70 havia programas COBOL com mais de:

300 paragraphs

100 sections

40 mil linhas

E muitos ainda funcionam hoje.


Performance

Uma pergunta muito comum.

"Section é mais lenta?"

Resposta:

Praticamente não.

O compilador moderno otimiza quase tudo.

A diferença costuma ser insignificante.


Onde realmente existe custo?

PERFORM

retorno

pilha

controle

Mas isso é extremamente pequeno.


Na prática

Legibilidade vale infinitamente mais.


PERFORM THRU

Exemplo

PERFORM A THRU C

Executa

A

B

C

Muito usado antigamente.

Hoje muitos times evitam.


Por quê?

Porque se alguém inserir

B2

no meio...

O comportamento muda.

Sem ninguém perceber.


Truque interessante

Sections permitem criar fases.

INICIALIZACAO

PROCESSAMENTO

RELATORIOS

FINALIZACAO

Cada uma possui seus próprios paragraphs.

Muito organizado.


Outro truque

Usar prefixos.

1000-INICIO

1100-LE-DADOS

1200-PROCESSA

1300-GRAVA

9000-FIM

Muito comum em bancos.


Por quê?

Porque facilita localizar no editor.


Outro padrão clássico

A000

A100

A200

B000

B100

Também extremamente comum.


Cuidados

Nunca misture assuntos.

Ruim

CLIENTE

↓

GRAVA ARQUIVO

↓

FAZ SQL

↓

ENVIA MQ

↓

CALCULA IMPOSTO

Bom

CLIENTE SECTION

↓

DB2 SECTION

↓

MQ SECTION

↓

CALCULO SECTION

Outro cuidado

Não faça Sections gigantes.

Ruim

PROCESSA SECTION

3500 linhas

Bom

LEITURA

VALIDACAO

NEGOCIO

DB2

LOG

MQ

FINAL

Quantos paragraphs?

Não existe regra.

Mas normalmente:

5

10

20

é confortável.


Deve existir apenas uma MAIN?

Quase sempre sim.

Exemplo

MAIN.

PERFORM INICIALIZA

PERFORM PROCESSA

PERFORM FINALIZA

STOP RUN

A leitura fica excelente.


Curiosidade histórica

Muitos compiladores antigos geravam código praticamente na mesma ordem dos paragraphs.

Hoje isso mudou completamente.

O compilador reorganiza diversas instruções.


O compilador pode ignorar Sections?

Em muitos casos sim.

Principalmente quando faz otimizações.

Ele pode inline routines.

Eliminar saltos.

Fundir blocos.


O que IBM recomenda?

Hoje a IBM incentiva:

✔ PERFORM

✔ EXIT PARAGRAPH

✔ EXIT SECTION

✔ evitar GO TO

✔ evitar ALTER

✔ modularização

✔ nomes claros


Um exemplo elegante

PROCEDURE DIVISION.

MAIN.

    PERFORM INICIALIZA

    PERFORM PROCESSA-PEDIDOS

    PERFORM GERA-RELATORIO

    PERFORM FINALIZA

    GOBACK.

Depois

PROCESSA-PEDIDOS SECTION.

LE-DADOS.

VALIDA-DADOS.

ATUALIZA-DB2.

ENVIA-MQ.

EXIT.

A leitura fica praticamente uma documentação.


Quando NÃO usar Sections?

Existem equipes modernas que preferem apenas paragraphs.

Por quê?

Porque:

PERFORM paragraph

é suficiente.

Especialmente em programas pequenos.


Quando usar Sections?

Em sistemas grandes.

Com dezenas de módulos lógicos.

Principalmente:

  • Bancos

  • Seguradoras

  • Governo

  • Telecom

  • ERP


Easter Egg Mainframe ☕

Existe uma brincadeira antiga entre programadores veteranos.

Se um programa possui:

  • GO TO para todos os lados

  • ALTER

  • PERFORM THRU cruzando o programa inteiro

  • sem SECTION

  • sem comentários

ele recebe um apelido carinhoso:

"Programa Teletransporte."

Você nunca sabe exatamente onde está.

Assim como um oficial preso em um teletransporte defeituoso da Frota Estelar.


Analogia com a USS Enterprise

Imagine a Enterprise.

Ela possui setores.

Engenharia

Ponte

Enfermaria

Hangar

Laboratórios

Cada setor possui equipes.

Na Engenharia:

Reator

Motores

Dilithium

Warp

Isso é exatamente uma SECTION contendo diversos PARAGRAPHS.

Ninguém colocaria o controle do motor Warp dentro da enfermaria.

Da mesma forma, um programa COBOL bem projetado separa responsabilidades em áreas distintas, facilitando a manutenção e reduzindo o risco de alterações acidentais.


Boas práticas para o Padawan COBOL

Ao longo de décadas de evolução do COBOL, algumas práticas se mostraram consistentes em equipes de alta maturidade:

  • Mantenha uma MAIN pequena, que apenas orquestre o fluxo principal.

  • Agrupe rotinas relacionadas em SECTIONs com responsabilidade única.

  • Dê nomes descritivos aos PARAGRAPHs, usando verbos que indiquem claramente sua função, como VALIDA-CLIENTE, CALCULA-TOTAL ou GRAVA-HISTORICO.

  • Prefira PERFORM a GO TO para manter o fluxo previsível.

  • Utilize EXIT PARAGRAPH e EXIT SECTION quando desejar uma saída explícita e fácil de entender.

  • Evite PERFORM THRU em novos desenvolvimentos, pois pequenas alterações podem modificar o comportamento sem chamar atenção.

  • Procure manter cada paragraph relativamente curto. Se ele começa a fazer muitas coisas diferentes, provavelmente merece ser dividido.

  • Separe regras de negócio, acesso a banco, manipulação de arquivos e integração com outros sistemas em blocos distintos.

  • Comente o motivo das decisões mais complexas, e não apenas o que o código faz.


Pontos para Fixar

Paragraph é uma rotina identificada por um nome.

Section é um agrupamento de paragraphs relacionados.

PERFORM paragraph executa apenas aquele bloco.

PERFORM section executa todos os paragraphs pertencentes àquela section, em sequência.

EXIT. é uma instrução nula usada tradicionalmente como marcador de fim.

EXIT PARAGRAPH e EXIT SECTION tornam o fluxo de saída mais explícito e legível.

✔ O ganho de organização quase sempre supera qualquer preocupação com desempenho.

✔ O compilador Enterprise COBOL moderno realiza diversas otimizações, tornando diferenças de performance entre uma boa organização em sections e paragraphs praticamente irrelevantes na maioria das aplicações.

✔ Código legível reduz tempo de manutenção, facilita revisões e diminui a probabilidade de defeitos em sistemas que frequentemente permanecem em produção por décadas.


Conclusão — Organizando a Ponte de Comando

No universo de Jornada nas Estrelas, a USS Enterprise não funciona porque possui apenas motores potentes. Ela funciona porque cada setor conhece sua responsabilidade, cada oficial sabe quando agir e a cadeia de comando é clara.

Um programa COBOL de qualidade segue exatamente essa filosofia.

As SECTIONs representam os grandes departamentos da nave. Os PARAGRAPHs são as equipes especializadas que executam cada missão. O PERFORM atua como a ordem do capitão, chamando apenas a rotina necessária no momento certo. Já o EXIT PARAGRAPH e o EXIT SECTION funcionam como um retorno organizado ao posto de comando, sem desvios inesperados.

Muitos sistemas críticos escritos há mais de quarenta anos continuam processando milhões de transações diárias justamente porque foram estruturados com disciplina. A tecnologia evoluiu, o compilador ficou mais inteligente, surgiram otimizações, integração com APIs, DevOps e inteligência artificial, mas um princípio permaneceu praticamente inalterado desde o nascimento do COBOL: um código bem organizado é um código que atravessa gerações.

Como diria o Sr. Spock, adaptando sua lógica ao mundo do IBM Z:

"A elegância de um programa não está na quantidade de instruções, mas na clareza com que cada uma cumpre seu propósito."

E esse talvez seja o maior aprendizado para todo Programador COBOL Padawan: escrever para o computador é fácil; escrever para os próximos cinquenta anos de manutenção é a verdadeira arte do Mainframe.

Sem comentários:

Enviar um comentário