Rodrigo Kumpera Weblog

Meus achados sobre tecnologia

Anti-pattern do dia: Abstrair primeiro

August 29th, 2006 · 4 Comments

Esse artigo é acima de tudo uma reclamação, um desabafo. Outro dia peguei uma pérola para dar manutenção que possuia tantas camadas de abstração que acompanhar o fluxo do código simplesmente lendo ele era muito dificil. O problema era bem simples, muita abstração inutil, hierarquias de classe com quatro níveis e uma classe em cada um! Não entendo por que tem gente que adora isso, criar toneladas de código que simplemente obfusca o real objetivo dele. Enfim, corrigir isso é razoavelmente simples, tanto que abaixo vai a receitinha.
Mas vamos lá, esse anti-pattern é bem facil de identificar e corrigir. Primeiro, identificar, quando existem hierarquias muito longas com uma classe em cada nível. Pode-se argumentar que essa estrutura foi adotada pensando em usos futuros, bom, nesse caso o correto e somente no futuro introduzir essas classes; outro argumento é por conta do tamanho da classe, que foi feito isso para evitar criar bloat, só que no final das contas, o resultado é o mesmo e existem formas melhores de decompor uma classe que via herança.

Agora que já sabemos quando nos deparamos com esse problema, resolver é questão de ter boas ferramentas e vontade. Caso o código esteja escrito em uma linguagem com tipagem latente (feito Ruby), basta agrupar o código de todos os tipos da hierarquia e caso alguma das classes base não seja abstrata, troque os clientes delas para instanciar o tipo final. Caso contrario, se código for escrito em uma linguagem com tipagem estática (feito Java), basta usar uma ferramenta de refatoração para remover todas referencias aos tipos a serem apagados.

Uma vez removida essa hierarquia de classes supérflua, provavelmente vai sobrar uma classe bem inchada pedindo para ser decomposta, daí só usar as ferramentas básicas que o Fowler recomenda. Faltou dizer a motivação para esse anti-pattern, uma é a criar a falta ilusão de um tipo menos inchado, outra é tentar introduzir as abstrações que futuramente o sistema sistema precisará, ou seja, fazer papel de adivinho.

Tags: Programming

4 responses so far ↓

  • 1 Paulo Silveira // Aug 29, 2006 at 11:33 pm

    E isso acontece muito!

    É realmente incrível o tamanho da árvore de hierarquia, ou a quantidade de decorators decorando outros decorators… Eu sinceramente vejo muito disso no Spring.

    A sun tem procurado ser mais enxuta e direta nesses casos, procurando apenas interfacear uma coisa ou outra, e só quando houver a necessidade, como CharSequence.

    Tenho de confessar que as vezes me pego criando esses diagramas mirabulosos, criando mais e mais subinterfaces para poder expor o mínimo de métodos para cada caso, quando no final me referencio sempre pela mesma interface!

  • 2 Phillip Calçado "Shoes" // Aug 30, 2006 at 2:24 pm

    Defendendo o Spring acho que muito disso no framework se deve à extensibilidade. Já criei alguns gerenciadores de transação e outras coisas que um usuário comum não toca nele e sua abertura permite muita customização.

    O ponto é que no caso do Spring temos um framework que cobre, sei lá, 90% da infra-estrutura de uma aplicação. Na aplicação em si, que não foi criada para ter tanta reusabilidade de código como um framework, é um tiro no pé!

  • 3 kumpera // Aug 30, 2006 at 2:33 pm

    Phillip, o Spring é um framework, ele tem que ser extensivel, é o boa parte do motivo dele existir. Ou seja, no caso dele é justificavel existir muitas partes móveis.

  • 4 Sami Koivu // Aug 31, 2006 at 9:24 am

    Realmente, obfusca o objetivo do código muito bem. Deve ser por isso que algo semelhante é até usado em alguns obfuscadores (de fluxo) de código. Abstrair provavelmente não é um termo apropriado nesse contexto, já com um programa difícilmente tem a capacidade de abstrair, mas o resultado fica comparável. E realmente fica ilegível.

Leave a Comment