Módulos

      João Paulo Schwarz Schüler

      Um módulo é um conjunto de dados e instruções com algum grau de independência. Para efeitos de Pascal, é considerado módulo todo procedimento, função, unidade ou objeto.

      Acoplamento

      O acoplamento entre dois módulos é o grau de dependência entre os mesmos. Quanto maior for o grau de dependência entre dois módulos, menos reaproveitáveis e modificáveis eles serão. Supondo dois módulos A e B que façam uso da mesma variável X global; sempre que quisermos modificar ou reaproveitar o módulo A, será necessário verificar qual será o impacto sobre o módulo B.

      Ainda assim, existem casos em que não é possível abrir mão da variável X. Assim sendo, devemos procurar uma abordagem em que a variável X seja global exclusivamente aos módulos A e B. Existem duas possibilidades para o caso proposto: criar uma unidade ou um objeto ( ou classe ) de nome C que incorpore a variável X e os procedimentos A e B. Observadamente, quando o objetivo é o reaproveitamento, a criação de uma classe (tipo de objeto) é a solução necessária.

      Solução em unidade:

      
      unit UniC;
      
      interface
      
      procedure A;
      procedure B;
      function Get:extended;
      procedure Seta(P:extended);
      
      implementation
      
      var X:extended; { variavel X e' local a unidade }
      
      procedure A;
      begin
      X:=X+1; {apenas um exemplo}
      end;
      
      procedure B;
      begin
      X:=X-1; {apenas um exemplo}
      end;
      
      function Get:extended;
      begin
      Get:=X;
      end;
      
      procedure Seta(P:extended);
      begin
      X:=P;
      end;
      
      end. { of unit }
      

       

      Solução em classe:

      
      
      type TipoC = object {definicao da classe TipoC}
                     private
                     X:extended;
      
                     public
                     procedure A;
                     procedure B;
                     function Get:extended;
                     procedure Seta(P:extended);
                   end;
      
      procedure TipoC.A;
      begin
      X:=X+1; {apenas um exemplo}
      end;
      
      procedure TipoC.B;
      begin
      X:=X-1; {apenas um exemplo}
      end;
      
      function TipoC.Get:extended;
      begin
      Get:=X;
      end;
      
      procedure TipoC.Seta(P:extended);
      begin
      X:=P;
      end;
      
      var C:TipoC;  { decalracao do objeto C do tipo (classe) TipoC }
      

       

      Vale observar que foram criados dois métodos ( toda função ou procedimento pertencente a um objeto é chamado de método) chamados Get e Seta. Considerando que a variável X é agora local, se desejarmos saber ou alterar seu estado serão necessários métodos.

      Existe ainda uma terceira solução: aninhamento de procedimentos.

      Solução em aninhamento de procedimentos:

      
      procedure C;
      var X:extended;
        procedure A;
        begin
        X:=X+1; { apenas um exemplo }
        end;
      
        procedure B;
        begin
        X:=X-1; { apenas um exemplo }
        end;
      { outras variaveis locais }
      begin { of procedure C }
      { comandos do procedimento C }
      end; { of procedure C }
      

       

      Para concluir, é importante ter em mente que o objetivo das três técnicas apresentadas é evitar variáveis globais. Quanto menos variáveis globais você implementar, menor será seu acoplamento e melhor será seu software.