sexta-feira, 6 de fevereiro de 2015

Sobrecarga de métodos - Uma reflexão sobre o assunto

Olá amigos leitores do Preciso Estudar Sempre. O tema de hoje é um tema que, provavelmente muitos se sentirão mais familiarizados. Porém, dessa vez não abordaremos esse tema da mesma forma que geralmente ele é abordado.

Na minha opinião, hoje em dia existe um grande problema que, está nas várias camadas da educação brasileira (fundamental, médio, superior, etc.) ou até mundial. O problema é: ensinam as pessoas como fazer mas, não ensinam o porque fazer.

Quando você está na faculdade e aprende seus primeiros conceitos de orientação à objetos, você é apresentado à sobrecarga de métodos. No início, para alguns, pode até parecer complicado ou estranho mas, no fundo não é. Depois de alguns minutos, o aluno domina o assunto e aprende que a sobrecarga não é nada mais, nada menos que, conseguir criar métodos com os mesmos nomes, só mudando a ordem e os tipos dos parâmetros.

Antes que você me pergunte: "Ainnnn João, você vai me ensinar o que é sobrecarga ?"
Eu respondo: "Não !! Se você quer aprender o que é sobrecarga, corre por fora."

Voltando. É aí que mora o problema citado acima e eu te explico o porque. No momento em que o aluno domina o "como fazer" da sobrecarga, ele pode se perguntar ou perguntar ao professor: "Tá bom mas, para que serve isso?"

Geralmente, os professores respondem: "Com este recurso você consegue criar métodos com o mesmo nome e pronto. Não precisa ficar bolando um nome diferente para o mesmo método. Basta mudar os parâmetros."

O professor não respondeu errado mas, ele apresentou o conceito da sobrecarga pela característica mais fraca, na minha opinião. Ele não está errado em ter respondido aquilo mas, ter nomes de funções iguais não é lá algo muito forte, para que você tenha um conceito de orientação à objetos só para isso.

Se é por uma questão de nome, eu crio um método foo() e sobrecarrego ele criando outro chamado foo2() ou fo(). A grande questão da sobrecarga de métodos, ou seja, o que ela traz de tanto benefício para o desenvolvimento de software é realmente a sobrecarga de uma funcionalidade.

Não entendeu ? Vou explicar melhor.

No conceito geral, o que é uma sobrecarga ? Pelo dicionário Michaelis, uma sobrecarga é uma carga excessiva, ou seja, quando você extrapola o que foi definido como carga máxima. É isso que fazemos com os métodos quando sobrecarregamos eles. Estamos adicionando uma carga extra ao contexto de negócio dele.

Exemplo:

 public void cadastrarCliente(Cliente cliente){  
      //trato o negócio de cadastro de cliente e insiro o registro no banco 
 } 

 public void cadastrarCliente(Cliente cliente, boolean flag){ 
      if(flag){ 
           //trato aqui trecho de negócio adicional 
      } 
      this.cadastrarCliente(cliente); 
 } 

Nó código acima podemos notar que existem dois métodos para cadastrar cliente. O primeiro método somente cadastra o cliente e o segundo tem um determinado tratamento de negócio e no fim cadastra o cliente na base de dados. No nosso exemplo, sobrecarregamos o contexto de negócio de cadastro de cliente. Quais vantagens isso me trouxe ?

Bem, vamos lá ! Você, em primeiro lugar, ganhou componentização. Antes você só tinha um método para cadastro de cliente, agora você tem dois. Uma manutenção realizada no método que somente cadastra cliente, irá ser propagada para todos os outros métodos sobrecarregados que o utilizam.

Isso não é ótimo ?

Segunda vantagem: Você ganhou retrocompatibilidade.

Não entendeu ? Ficou confuso ? Então vamos entender !

Vamos supor que você desenvolve uma das APIs do Java. Algo do tipo API de Collections. Na versão 1.0 da sua API, você criou um método para inserir elementos na lista mas, na versão 2.0 você viu que esse método poderia ser melhorado e otimizado. O que você fará ? Apagará o método da API ? Se você fizer isso, todos os projetos que estavam usando a sua API podem apresentar problemas. Realmente, você vai querer causar isso ?

Como solução, o que você pode fazer é: Deixe o método antigo, intocado, crie o novo sobrecarregando o primeiro e marque como deprecated (sua escolha). Dessa forma você ganhou a retrocompatibilidade, falada acima. Você conseguiu gerar uma nova versão da sua API a qual, é compatível com códigos de legado assim como, com novos projetos.

Agora, você fala: "Ainnnn João, to com medo das desvantagens !!! "

Para você ter alguma desvantagem é necessário que você gere ela porque, se a sobrecarga for aplicada da forma correta e com moderação, você só tem a ganhar.

Como esse post é um post de reflexão, eu espero que dúvidas e contestações sejam geradas. Não fique tímido, deixe sua contribuição nos comentários ou no facebook.

Amigos, espero ter ajudado. Caso você tenha alguma dúvida, sugestão ou crítica, deixe aí embaixo nos comentários ou na nossa página do facebook.

Facebook: https://www.facebook.com/precisoestudarsempre/

Nenhum comentário: