Infelizmente a maioria dos programadores que conheço nunca ouviram falar sobre ortogonalidade no desenvolvimento de software, embora este seja um principio fundamental para se escrever código de qualidade.
Em desenvolvimento de software, o termo ‘ortogonalidade’ passou a significar uma espécie de independência ou dissociação. A ideia é que componentes que conceitualmente não estão relacionados devem ser construídos de forma a não possuírem nenhuma dependência entre si. Adicionar um novo atributo a um objeto do ActiveRecord (na maioria das vezes) não deveria exigir uma alteração na interface com o usuário, por exemplo.

Foto de Voxphoto
Em linguagens orientadas a objetos é muito fácil acrescentar dependências ao código. Em Ruby basta um simples ‘require‘ e seu projeto passa a depender de uma ou várias bibliotecas. Talvez devido a essa simplicidade este tende a se tornar um problema viral, já que nos estimula a estarmos sempre adicionando mais e mais dependências em nossos sistemas.
Queremos projetar componentes auto-suficientes e com um único propósito bem definido. Sistemas não ortogonais são difíceis de alterar. Em projetos onde seus componentes dependem uns dos outros não existem correções pontuais. Uma correção pode levar a um ou mais problemas em outra parte. E isto pode se tornar um ciclo sem fim.
Por outro lado, em sistemas onde os componentes são isolados uns dos outros, desde que você não mude a sua interface pública, você sabe que pode alterar um deles sem se preocupar com os outros.
Os ganhos em produtividade ao colocar em prática este principio são imensos. Uma abordagem ortogonal promove a reutilização. Como seus componentes serão bem específicos e com responsabilidades bem definidas é fácil reaproveitá-los em outros sistemas. Outro fator importante é que por possuírem apenas o código necessário para cumprir uma única tarefa, obviamente estas bibliotecas serão menores e mais simples de serem projetadas, implementadas, testadas e dificilmente precisaremos revisita-las para adicionar novas funcionalidades ou fazer correções.
O fato de serem componentes menores e com menos código também simplifica a criação de testes. E mesmo que um bug passe despercebido ele não será tão critico, pois o tempo de resolução será menor e a chance de o problema se espalhar por todo o sistema são mínimas, o que diminui os riscos.
Vamos considerar como exemplo o desenvolvimento de um e-commerce. O requisito original previa apenas uma interface web simples, mas as exigências foram alteradas para também contemplar uma interface web para telefones celulares e para compras através de uma central telefônica. Em um sistema projetado ortogonalmente, você precisaria alterar apenas os módulos associados com a interface do usuário para lidar com isso. Se o seu sistema foi bem estruturado, você deveria ser capaz de suportar todas essas interfaces com o mesmo código criado inicialmente para realizar as vendas. O paradigma MVC utilizado no Ruby on Rails funciona bem nestas situações.
Testes unitários são uma ótima forma de verificar a ortogonalidade de um componente. Se para realizar o teste é necessário carregar ou acessar uma grande quantidade de outras bibliotecas, então você encontrou um módulo que não está bem dissociado do resto do sistema. Outra forma menos interessante de realizar esta avaliação é ao corrigir bugs. Quando você faz uma alteração, outros problemas surgem misteriosamente? Esta é uma evidência de que seu código não é ortogonal.
Ortogonalidade está intimamente relacionado com o princípio DRY (veja mais aqui e aqui). Enquanto DRY visa minimizar a duplicação dentro de um sistema, com a ortogonalidade você reduz a interdependência entre os componentes do sistema. Utilizar estes dois princípios combinados tornará nossos projetos muito mais flexíveis e fáceis de manter.
Este artigo é descaradamente ‘baseado’ no capítulo de mesmo nome do livro The Pragmatic Programmer.
9 Comentários
Trackbacks
- uberVU - social comments
- Linguagem de programação e Linguagem de programador « Agilebox – Programação e Rock'n Roll
Belo post, Carlos!!
Aliás, acho surpreendente como muitos (muitos mesmos) ainda não leram o The Pragmatic Programmer. Toneladas de experiência condensado em um lugar e uma leitura muito prazerosa.
Abraços.
Bem interessante.
Mas, parece-me mais com o conceito de Alta Coesão e Baixo Acoplamento… existe diferença entre eles e a ortogonalidade?
IMHO muitos desses “programadores” não estão acostumados somente com o *nome* “ortogonalidade”… o conceito é sim bastante conhecido (embora não seja sempre aplicado).
De qualquer forma, valeria a pena citar (também) como exemplo a história dos comandos do helicóptero :)
Verdade, Henrique.
Muita gente conhece o conceito por nomes como modularização, componetização, etc.. Embora isto não costume ser uma preocupação frequente para alguns programadores.
E o exemplo do helicóptero realmente é bom.
Olá Carlos.
Trabalho com MVC faz algum tempo, e tenho ficado bastante satisfeito com o grau de independência entre as partes dos sistemas que aplicam tal conceito.
A minha pergunta é a seguinte, o quão distante está o conceito de Ortogonalidade para o conceito de MVC?
Abraço!
Nícolas,
Eu vejo o paradigma MVC como um auxiliador na criação de softwares ortogonais. O que não significa que automaticamente estaremos criando módulos independentes apenas pelo fato de termos adotado o MVC.
Acho que a ideia de ortogonalidade vai muito além disso. Podemos (e devemos) aplicar este principio em todos os aspectos do desenvolvimento, desde o banco de dados até a documentação do sistema.
O meu Deus sou mais um que nunca ouviu falar de “Ortogonalidade” em desenvolvimento de software, entretanto, já ouvir falar por ai de um tal de Encapsulamento (Tema bem batido por sinal) OO básica, que é bem parecido.
Ortogonal:
Perpendicular, que forma um ângulo reto, de 90º.
Vem do Grego “orthos” que significa “justo, reto” e “gonia” que significa “ângulo”.
A diferença entre perpendicular e ortogonal é que a primeira é comumente usada para se referir a triângulos enquanto ortogonal é usada para falar sobre vetores ou coordenadas geométricas.
http://www.dicionarioinformal.com.br/definicao.php?palavra=ortogonal&id=799
robson,
A ideia do encapsulamento é basicamente a mesma da ortogonalidade. A principal diferença é que encapsulamento, componentização, etc. se aplicam basicamente ao código, enquanto ortogonalidade tem um sentido mais amplo, conforme eu mencionei um comentário acima.
Muito bom o artigo.