Conceito: Elevar o Nível de Abstração
Esse princípio descreve como reduzir a complexidade elevando o nível de abstração.
Descrição Principal

Introdução

A complexidade é uma questão central no desenvolvimento de software. Elevando o nível de abstração ajuda a reduzir a complexidades, assim como a quantidade de documentação necessária ao projeto. Isso pode ser obtido através de reutilização, o uso de ferramentas de modelagem de alto nível, e estabilizando a arquitetura inicialmente.

          
Benefícios
  • Produtividade
  • Complexidade Reduzida.
Padrão
  1. Reutilizar ativos existentes
  2. Utilizar ferramentas de nível mais alto e linguagens para reduzir a quantidade de documentação produzida.
  3. Focalizar primeiro a arquitetura
  4. Arquitetar para obter controles da elasticidade, qualidade, instabilidade e complexidade.
Antipadrões
  • Ir diretamente dos requisitos vagos, de alto nível, para o código customizado.
    • Como algumas abstrações são utilizadas, surgem muitas discussões sobre o nível de código versus um nível mais conceitual, o que faz perder muitas oportunidades de reutilização, entre outras coisas.
    • Os requisitos informalmente capturados e outras informações requerem a revisão de decisões e especificações repetidàs vezes.
    • Ênfase limitada sobre a arquitetura resulta em atraso de retrabalho no projeto.

Discussão 

Um dos principais problemas que enfrentamos no desenvolvimento de software e a complexidade. Sabemos que reduzir a complexidade apresenta maior impacto sobre a produtividade. Trabalhar em um nível maior de abstração reduz a complexidade e facilita a comunicação.

Uma abordagem efetiva de se reduzir a complexidade é reutilizar ativos existentes, como componentes reutilizáveis, sistemas legados, processo de negócios existente, padrões ou software de código aberto. Dois grandes exemplos de reutilização que apresentaram o maior impacto sobre a indústria de software na última década são:

  • A reutilização de middleware, como bancos de dados, servidores de Web e portais, e mais recentemente,
  • Software de código aberto que oferecem muitos componentes menores e maiores que podem ser alavancados.

Avançando, os serviços da Web provavelmente terão maior impacto na reutilização, já que oferecem formas simples de reutilizar as principais parte da funcionalidade através de plataformas diferentes e com acoplamentos soltos entre o consumidor e o provedor de um serviço. Isso significa que podemos elevar mais facilmente diferentes combinações de serviços para atender às necessidades comerciais. A reutilização também é facilitada pelos padrões abertos, como RAS, UDDI, SOAP, WSDL, XML e UML.

Diagrama ilustrando a reutilização existente de ativos através de arquiteturas orientadas para o serviço
Reutilizar ativos existentes através de arquiteturas orientados para o serviço.
Um dos problemas com a reutilização é que dois componentes precisam conhecer a experiência um do outro no momento do desenvolvimento. As arquiteturas orientados para o serviço minimizam esse problemas fornecendo o que chamam de consumidor solto: O consumidor de um serviço pode encontrar dinamicamente um provedor de um serviço. Podemos, portanto, agrupar os componentes existentes ou sistemas legados dentro dos serviços, permitindo que outros componentes ou aplicativos obtenham acesso dinamicamente a suas capacidades através de uma interface baseada em padrões, independentemente da plataforma e da tecnologia de implementação.

Outra abordagem para reduzir a complexidade e melhorar a comunicação consiste emalavancar ferramentas, estruturas e linguagens de níveis mais altos:

  • Linguagens padrões com a UML (Unified Modeling Language) e linguagem de aplicativos rápidos como EGL fornecem a capacidade de expressar constructos de alto nível, como processo de negócios e componentes de serviços, que facilitam a colaboração entre constructos de alto nível enquanto ocultam detalhes desnecessários.
  • Design e ferramentas de construção podem automatizar o movimento de constructos de alto nível para código de trabalho:
    • Eles fornecem assistentes que automatizam o design, a construção e testam tarefas gerando códigos e ativando o uso de trechos de código.
    • Eles convertem integração e teste em tarefas de desenvolvimento perfeitas através de desenvolvimento integrado, construção e ambientes de teste.
  • Ferramentas de gerenciamento de portifólio, que ativam o gerenciamento  financeiro e outros aspectos de vários projetos como uma entidade versus um conjunto separado de entidades.

Em resumo, ferramentas de alto nível capturam graficamente informações de modelagem, o que é uma forma atrativa de resumir e apresentar essa informação. Os benefícios da modelagem visual são explorados mais detalhadamente em Material de Suporte: Modelagem Visual.

Uma terceira abordagem para gerenciar a complexidade é focalizar na arquitetura, tanto para definir um negócio como para desenvolver um sistema ou aplicativo. Em desenvolvimento de software, procuramos obter uma arquitetura projetada, implementada e testada antes do projeto. Isso significa que, antes de um projeto, focalizamos os seguintes objetivos:

  • Definir blocos de construção de alto nível e os componentes mais importantes, suas responsabilidades e suas interfaces.
  • Projetar e implementar os mecanismos arquiteturais, ou seja, soluções prontas para problemas comuns, como por exemplo, como lidar com a persistência ou a coleção de lixo.

Obtendo a arquitetura logo de início, fornecemos uma estrutura de esqueleto para nosso sistema, tornando-o mais fácil de gerenciar a complexidade na medida em que incluímos mais pessoas, componentes, capacidades e código ao projeto. Também identificamos quais ativos reutilizáveis podemos alavancar e quais aspectos do sistemas precisam ser customizados.