Você realmente cria softwares no paradigma POO?

Em cursos de Computação, desde as primeiras aulas envolvendo disciplinas que contemplam o ensino do paradigma POO (Programação Orientada a Objetos), os alunos absorvem os conceitos básicos relacionados a este: classes, objetos, herança, associação, polimorfismo, encapsulamento, abstração, entre outros. Contudo, ainda é notável a quantidade de projetos escritos em linguagens POO (Java, C#, vb.net, C++, Object Pascal …) que não utilizam os conceitos mencionados, ou melhor, utilizam o mínimo necessário para que o código fonte atenda aos requisitos desejados pelo cliente. Ao se deparar com este tipo de código fonte, existe uma grande possibilidade de encontrar algo que chamamos de “Programação Procedural em POO”, ou seja, ao invés de utilizar os recursos do paradigma, o raciocínio empregado na resolução do problema está totalmente voltado a outro paradigma, chamado de Programação Estruturada, Procedural, ou Imperativa, encontrada em linguagens como C, Pascal, Fortran, entre outras.

Segundo o Wikipedia, Paradigma é a representação de um padrão a ser seguido. Desta forma, se estão sendo abordados dois paradigmas distintos (POO e Procedural), então são dois padrões diferentes a serem seguidos, ou melhor, duas linhas de raciocínio diferentes a serem aplicadas. Então, por que existe tanto código fonte procedural em linguagens POO? Embora não se tenha conhecimento prévio de uma explicação científica, ao analisar o mercado e o mundo acadêmico, é possível encontrar pelo menos três respostas, que serão detalhadas abaixo:

1) Normalmente, o primeiro contato dos estudantes com programação acontece em linguagens procedurais como C, o que pode dificultar a mudança de paradigma. É óbvio que, no decorrer de qualquer curso envolvendo Computação, o aluno absorve novos paradigmas em disciplinas específicas, seja POO, lógico ou funcional, mas o raciocínio adotado para a resolução dos problemas dificilmente estará totalmente desvinculado do aprendizado original, onde foram utilizados raciocínios procedurais. É necessário muito exercício para assimilar um novo paradigma, e nem todos os profissionais estão dispostos;

2) Embora os dois paradigmas sejam distintos, existem muitas semelhanças, especialmente na sintaxe. Como seres humanos, temos mais facilidade em associar sintaxe do que semântica, consequentemente, ao ver duas linguagens com comandos parecidos (if/else, for, while, main, etc..), mesmo que envolvam paradigmas distintos, existe uma tendência de se associar ambos na mesma linha de raciocínio para resolver os problemas;

3) Existe pouca divulgação a respeito de boas práticas, também chamada “princípios de projetos”, para melhor empregabilidade do paradigma POO. Estes princípios possuem vital importância na aplicação profissional do paradigma POO, e infelizmente não é muito divulgado, tanto em disciplinas POO, quanto entre profissionais que utilizam este paradigma para criar Softwares. Em consequência disso, os alunos aprendem os conceitos básicos de POO, mas não o sabem utilizar na prática, facilitando a adoção de códigos procedurais em linguagens POO.

Para ilustrar melhor o problema, segue abaixo um código procedural na linguagem Java.

public void processaArquivo(File arquivo) throws ArquivoException {
    if (arquivo.getName().contains(“cliente”)) {
        //lógica para processar arquivo de cliente…
    } else if (arquivo.getName().contains(“conta”)) {
       //lógica para processar arquivo de conta…
    } else {
       throw new ArquivoException(“não foi encontrado processamento para o arquivo ”+arquivo.getName());
}

O código acima é chamado de procedural, porque o raciocínio utilizado é estruturado, ou seja, uma codificação de um fluxograma para resolver o problema. E o problema não se restringe a isso, este código está altamente acoplado e inflexível, pois a possibilidade de aparecer um novo arquivo a ser processado é alta, consequentemente necessitando de diversas manutenções em diversos ifs/elses espalhados pelo Software, elevando custos de manutenção e aumentando verticalmente a possibilidade de erros.
Uma melhor abordagem para resolver este problema seria:

public void processaArquivo(File arq) throws ArquivoException {
    Processavel processavel = ProcessaFactory.getProcessavel(arq);
    processavel.processa(arq);
}
public interface Processavel {
    public void processa(File arquivo);
}
public class ProcessaCliente implements Processavel {
    public void processa(File arquivo) {
       //lógica para processar arquivo de cliente…
    }
}
public class ProcessaConta implements Processavel {
    public void processa(File arquivo) {
       //lógica para processar arquivo de conta…
    }
}

A evolução da qualidade no código fonte é notória[1]: o método processaArquivo() ficou genérico e polimórfico. Isso foi possível porque foi aplicado o princípio “Encapsule o que varia”, que retirou toda a lógica que varia no método processaArquivo() e a encapsulou na interface Processavel, invocando a implementação por polimorfismo. Além disso, para futuras manutenções neste projeto, como por exemplo, o acréscimo de um novo tipo de arquivo, não será necessário alterar a lógica de processaArquivo() ou de nenhum outro método de negócio: apenas será necessário incluir uma nova classe implementando Processavel, adicionando o seu comportamento no corpo desta. Com isso, mais um princípio foi aplicado, que se chama “aberto-fechado (OCP)”, onde este alega que lógicas de negócio contidas nas classes devem ser abertas para extensão, contudo fechadas para modificação, ou seja, a lógica para processar arquivo não pode ser modificada, mas novas formas de processar arquivos podem ser estendidas, com novas classes implementando a interface Processavel. Também não se pode deixar de observar a aplicação do princípio “Programe para interface, e não para implementação”, pois ao definir estaticamente os tipos mais genéricos possíveis, o uso de polimorfismo é facilitado, dificultando a quebra do código escrito[2]. Outros princípios também poderiam ser mencionados na resolução deste problema, como Responsabilidade Única (SRP) e Componha comportamentos.

Existem diversos outros princípios, que serão abordados da maneira mais prática possível em futuros artigos neste site, contudo, é possível observar que, entendendo corretamente os conceitos de POO, com o auxílio de boas práticas, é possível deixar o código fonte mais próximo do ideal, elevando a qualidade, evitando retrabalhos em manutenções, diminuindo possibilidade de erros em ambientes de produção.

[1] – o tratamento para ArquivoException estará incluído na classe ProcessaFactory;

[2] – quebrar código significa alterar a assinatura de métodos e tipos, para contemplar novas possibilidades não previstas anteriormente. A consequência disto é que, qualquer componente que invoque esta assinatura, seja desta aplicação ou de outra, precisará ser alterado.

About CarlosEduardoXP

Especialista em desenvolvimento de Sistemas Distribuídos, sempre aplicando boas práticas e padrões difundidos na comunidade. Auto didata, fanático por refatoração e performance, sempre buscando reutilização e testes automatizados cada vez mais eficazes.
This entry was posted in Software Development. Bookmark the permalink.

One Response to Você realmente cria softwares no paradigma POO?

  1. Amândio says:

    Achei a abordagem interessante pois esta pergunta faço eu várias vezes. Programo ha 12 anos usando o paradigma procedimental e neste momento estou tentando dar o salto para o paradigma OO. É muito complicado. De facto o deficiente ou pouca profundidade do ensino da POO nas escolas é uma realidade. Sou moçambicano e vejo isto todos os dias.
    Gostaria de obter mais subsídios vossos sobre:
    -Como desenvolver uma aplicação desktop usando o paradigma OO em VB.Net e servidor MySQL.
    -Quais as melhores práticas a observar em POO.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s