Ja falei outras vezes sobre padroes e processos. E um assuntoate meio cansativo, mas esses dias tive uma conversa na nossa Fabrica deSoftware que representa bem a importancia do tema no mundo de TI. Acho ate que num curso sobre melhorespraticas que ministrei ha algum tempo tratamos desse assuntoespecifico.O assunto era a chamada de sub-rotinasdentro de um programa Cobol. Hipoteticamente, temos um programa XXXP0001 quechama a sub-rotina XXXS999. Quando chegava um programador novo,geralmente passava-se a seguinte orientacao:- Olha, para chamar o subprograma vocedeve codificar:Na WorkingStorage:XXXS9999 PIC X(8) VALUE XXXS9999.E na ProcedureDivision: CALL XXXS9999 USING Variaveis.- Uai (geralmente os programadores novoseram mineiros)! Disseram-me que era pra chamar direto, entre aspas (CALL XXXS9999 USING Variaveis)! Efuncionou!Ou ainda:- Bah (alguns eram gauchos)! Eu tenhoque chamar varios programas! Porque preciso declarar a variavel XXXS9999? Emelhor criar uma variavel generica, tipo GDA- SUBROTINA! Funciona, fica maisclaro e eu posso reusar a guarda!Nesse caso, o codigo na ProcedureDivision ficaria assim:MOVE XXXS9999TO GDA-SUBROTINA.CALL GDA-SUBROTINA USING Variaveis.MOVE XXXS8888TO GDA-SUBROTINA.CALL GDA-SUBROTINA USING Variaveis.A resposta, nos dois casos,geralmente dada por quem nao tinha ido atras dos porques, era sempre a mesma:- Olha, esse e o padrao do pessoal da Governanca de TI.Esses caras de processo vivem inventando moda! E melhor fazer como eles querem eficar quieto.Assim, as coisas funcionavam, oscaras da MDS (metodologia de desenvolvimento de sistemas) eram os chatos e avida seguia.Mas nao era bem assim. O padraoestava certo. Alias, perfeito. A unica falha dos chatos da MDS era nao tercomunicado adequadamente qual o motivo do bendito padrao. Vamos tentar clarear um pouco:No caso do mineirim, ao dar o CALL nasub-rotina entre aspas, estamos passando ao processo de compilacao (na realidade,de linkedicao) a informacao de que a chamada e estatica, e nao dinamica. Portanto, o executavel resultante doprocesso de compilacao e linkedicao do programa XXXP0001 teria incorporadotambem o XXXS999. Funciona? Sim, funciona, inclusive ate mais rapido. No entanto, no momento em queversionassemos a sub-rotina XXXS9999, apareceria um dos seguintes problemas:Se a XXXS9999 tivesse instrucoes SQL,o programa XXXP0001 abendaria com o famoso SQLCODE -805 (acho que ja faleisobre isso no post Desmistificando o Bind), no momento de acessar o banco dedados DB2, por divergencia no timestamp do Cobol X999 com o do package de mesmo nome;Se fosse uma sub-rotina em Cobol puro(sem SQL), o problema seria ainda maior. O P0001 continuaria rodando, mas chamandoa versao anterior da S9999, embutida no seu executavel.Portanto, ao declarar a variavel, oCALL passa a ser dinamico, com o P0001 chamando a X9999 em tempo de execucao,sempre em sua versao mais recente.Bem, ja o caso do gaucho e um poucomais sutil, e mesmo programalistas experientes nao sabem bem o porque dopadrao ser o nome da variavel com o mesmo da sub-rotina.A palavra-chave aqui erastreabilidade. Existem ferramentas (na minha empresa temos o X-REF, dentre outras) que buscam a cadeia de chamadas dos modulos.Isso e bastante util para sabermos qual o impacto de uma alteracao em umprograma chamado por varios outros. Essas ferramentas sao beminteressantes, mas algumas delas (na realidade quase todas) trabalham porvarredura no codigo-fonte, e nao seriam capazes de detectar que o programaP0001 chama o S9999 no CALL