Programe para interface e não para implementação

Hoje vamos começar com uma pequena história ilustrativa:

Em um departamento de TI qualquer, havia uma programador que após semanas de desespero, horas extras e litros de café  trabalho, estava orgulho por entregar no prazo o novo mecanismo de persistência de dados customizado para o novo SGDB recém-adquirido pelo cliente. Estava navegando tranquilamente na internet, quando seu chefe aparece de surpresa do seu lado:

– O cliente cabou de me ligar dizendo que houve um problema com as licenças do SGDB XPTO que eles iriam utilizar, então deveremos utilizar o SGDB ABC, certo ?
– Que droga! Mas tudo bem, eu levarei 1 semana para modifcar  em todo sistema e realizar os novos testes. – responde o programador, tenso.
– VOCÊ TÁ LOUCO!! É só trocar a conexão, não têm nada de complexo nisso. Além do mais, prometi par ao cliente que vamos entregar no prazo mesmo esse problema – responde o gênio chefe.
– Mas.. Mass… é para entregar o projeto daqui a 3 dias e ja´está tudo homologado!!! – responde o programador, gaguejando.
– Não me importa, esse cliente é importante, portanto temos que entregar SEM ATRASOS! – responde seu chefe.

FIM

Tá bom! Tá bom!

A maioria de vocês estão pensando “Que  história mais idiota!”, tudo bem, o objetivo não era ser o próximo best-seller literário, mas sim propor a seguinte reflexão:

Quantas vezes o sistema que eu estou trabalhando mudou?

Não é novidade para ninguém que a única todo projeto muda, que todo sistema evolui (para o bem ou para o mal), mas o que talvez não seja conhecido de todos é como reduzir os impactos destas mudanças durante o desenvolvimento. Hoje apresento a vocês a prática de programar voltado a interface e não para implementação, que ajuda a torna códigos mais flexíveis passiveis de mudança.

Como utilizar essa prática?

Primeiramente, devemos entender que interfaces nada mais são do que contratos entre componentes do seu sistema. Uma vez que utilizamos uma interface, temos que respeitar todas as suas condições(no caso, suas assinaturas de método). Além disso,  não precisamos entender os detalhes das classes que a utilizam, pois uma vez que elas respeitam o contrato, sabemos quais comportamento esperar destes componentes.

Não existe uma “receita de bolo” infálivel para está prática,então resolvi compilar algumas dicas que me ajudam a pensar na utilização desta prática:

  • Sempre que possível, utilize tipos genéricos: Isso ajuda a garantir uma maior flexibilidade e liberdade na escolha das melhores classes concretas para resolve o seu problema. Além disso, a uma propabilidade menor de houver quebras de compatibilidade entre versões de uma mesma ferramenta. Por exemplo, utilize a interface ICollection nas assinaturas ao invés do List ou ArrayList.
  • Evite expor APIs de terceiros: Pense duas vezes antes de  adicionar classes de fornecedores explicitamente nas chamadas do seu sistema, pois você não possui controle sobre as futuras alterações nestas  APIs(Application Program Interface) . Invés disso, crie uma interface e crie outra classe implementando a interface com a API.
  • Exponha contratos entre as camadas do sistema: Camadas de negócio não precisam entender ou saber quais são os mecanismo de persistência que você utilizou, pois isso pode deixar suas camadas fortemente acopladas. Invés disso, crie interfaces para que as camadas possam conversar entre elas.
  • Considere utilizar containers de Injeção de Dependência: Ferramentas de utilizam o padrão de injeção de dependência permitem que os desenvolvedores escolham quais são objetos concretos que o sistema utilizara surante sua execução de maneira configurável, ou seja, o desenvolver consegue alternar entre componentes que implementam uma interface, sem precisar alterar internamente seus módulos (prometo escrever um post sobre detalhando deste padrão).

Com as dicas acima, provavelmente você criará aplicações mais flexiveis, além de reduzir impactos em futuras mudanças em no seu projeto.

Espero ter ajudado.

Até o próximo post. =)

Advertisements

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

%d bloggers like this: