Ortogonalidade

A Ortogonalidade é um conceito importante para a arquitetura de software e é imprescindível quando se deseja criar sistemas que sejam fáceis de entender, modificar, testar e estender. As vezes em que ouvi falar sobre o conceito de ortogonalidade, ligado a arquitetura de software, soaram como um conceito implícito e ligeiramente abstrato como consequências e efeitos colaterais de decisões de projeto baseadas em outros princípios. O princípio da ortogonalidade quando aplicado de forma consciente e intencional, se torna uma ferramenta poderosa para o desenvolvimento de software.

O que é ortogonalidade?

A ortogonalidade é um conceito que vem da geometria e que se refere a um sistema de coordenadas onde os eixos são ortogonais, ou seja, são perpendiculares entre si. Um exemplo de sistema de coordenadas ortogonal é o sistema de coordenadas cartesiano, onde os eixos X e Y são perpendiculares entre si.

Este conceito serve para representar um tipo de independência entre os eixos. Ou seja, o movimento de um eixo não afeta o movimento do outro eixo.

Sitema de coordenadas ortogonal

Na computação o conceito de ortogonalidade é usado para descrever sistemas (ou “componentes”) que são independentes entre si. Ou seja, duas ou mais partes de um sistema são ortogonais quando elas não se influenciam mutuamente.

Coesão e acoplamento como conceitos complementares

Talvez a ideia de ortogonalidade esteja ligeiramente remetendo à conceitos como “isolamento” ou “desacoplamento”. Mas não é bem assim. O conceito de ortogonalidade é mais forte que o de isolamento ou desacoplamento. O conceito de isolamento ou desacoplamento se refere a uma relação entre dois componentes, enquanto o conceito de ortogonalidade se refere a uma relação entre mais de dois componentes.

Em resumo, a ortogonalidade refere-se à independência dos conceitos, a coesão refere-se à relação entre os elementos de um módulo e o acoplamento refere-se à dependência entre os módulos. Cada um desses conceitos é importante para o design e desenvolvimento de sistemas de software eficientes e eficazes. Irei ficar devendo uma explicação mais detalhado sobre os conceitos de coesão e acoplamento. Mas se você quiser saber mais sobre esses conceitos, recomendo a leitura do livro “Clean Code” do Robert C. Martin. Ele tem um capítulo inteiro dedicado a esses conceitos.

Sistemas NÃO ortogonais são inerentemente mais complexos para entender, modificar, testar e estender. 😉

Dos benefícios da ortogonalidade

Vamos às vantagens de um sistema ortogonal:

  1. Maior modularidade: A separação de funcionalidades em módulos independentes permite que cada módulo seja testado, mantido e atualizado separadamente, sem afetar os outros módulos.

  2. Maior reutilização de código: A ortogonalidade permite que as funcionalidades sejam reutilizadas em diferentes contextos, sem exigir grandes alterações no código.

  3. Melhor escalabilidade: A separação de funcionalidades em módulos independentes permite que o sistema seja facilmente escalado, adicionando ou removendo módulos conforme necessário.

Eu ainda consigo pensar em mais benefícios como; Ganho de produtividade, redução de custos, baixa entropia etc..

Corrigindo as falhas

Após explorarmos os fundamentos da ortogonalidade e seus benefícios, é momento de avançarmos para a prática, avaliando e aprimorando nossos projetos com esse conceito em mente. Antes de detalharmos técnicas específicas, é crucial enfatizar a importância de aplicar a ortogonalidade de maneira intencional e consciente. Embora possa parecer desafiador inicialmente, os frutos desse esforço se revelam rapidamente, tanto na qualidade do código quanto na eficiência do desenvolvimento.

1. Identifique os conceitos

A primeira coisa que você precisa fazer é identificar os conceitos que estão presentes no seu software. Para isso, você pode usar criar “desenho de diagrama de conceitos”. Fazendo isso você será capaz de mapear todas as entidades, suas relações e como elas interagem entre si. Isso ajuda a visualizar as áreas do seu software e como elas se conectam, facilitando a identificação de dependências e potenciais sobreposições de funcionalidades. Essa clareza é fundamental para criar um design mais ortogonal, onde cada parte do sistema tem uma responsabilidade única e bem definida

Diagrama de conceitos com relações

2. Adote convenções e padrões para a code base

A consistência no estilo de codigo e na adoção de padrões de projeto facilita o entendimento e a colaboração. Defina e siga convenções de nomenclatura, formatação e documentação. Se possivel tente aplicar padrões de projeto (como Singleton, Factory, Strategy, entre outros) para resolver problemas comuns de design de software de maneira consistente. Isso não apenas melhora a legibilidade do código, mas também ajuda a manter a ortogonalidade ao fornecer soluções padronizadas para problemas recorrentes.

3. Encontre a oportunidade e refatore

A refatoração é o processo de reestruturar o código existente sem alterar seu comportamento externo para melhorar sua estrutura interna. Você deve práticar a refatoração regularmente para identificar e corrigir problemas de design, como dependências desnecessárias, duplicação de código, e falta de coesão entre os módulos. Isso ajuda a manter a ortogonalidade ao longo do ciclo de vida do desenvolvimento, garantindo que o sistema permaneça fácil de entender, modificar e estender.

Lembrando:

Como identificar os conceitos ortogonais?

Os conceitos que são ortogonais são aqueles que não possuem nenhuma relação entre si. Ou seja, se você modificar um conceito, isso não afetará os outros conceitos.

Como identificar os conceitos NÃO ortogonais?

Os conceitos que não são ortogonais são aqueles que possuem alguma relação entre si. Ou seja, se você modificar um conceito, isso afetará os outros conceitos.

Diagrama de venn

Esta abordagem é baseada no livro “Domain-Driven Design: Tackling Complexity in the Heart of Software” do Eric Evans. Mas não é algo que está escrito em pedra. Você pode usar a abordagem que melhor se adequar. O ponto é: antes de tomar qualquer decisão, apenas saiba que isso existe e entenda o conceito e para saber como aplicá-lo, e claro o livro é muuuito mais abrangente e detalhado. Recomendo a leitura. 😉

Conclusão

Entender e aplicar os conceitos de ortogonalidade é crucial no processo de desenvolvimento, permitindo criar sistemas robustos e manuteníveis. Embora este possa parecer um conceito abstrato à primeira vista, sua essência reside na capacidade de criar componentes de software independentes, reutilizáveis e minimamente interdependentes. Esta abordagem não apenas facilita a manutenção e a expansão dos sistemas, mas também promove uma maior eficiência e colaboração entre os membros da equipe de desenvolvimento.

Referências