Projeto de Software – 01 – Introdução

Autor(a):

Esta série é o começo de uma jornada de estudo que estou realizando como parte da disciplina de projeto de software na faculdade. No entanto, acredito que as informações compartilhadas podem ser valiosas para desenvolvedores em geral. Quero expressar meus agradecimentos ao Professor Troy, do IC UFF, de onde eu tirei os dados para esse material. Seus créditos são merecidos e reconhecidos em todo este material.

Tudo o que estou compartilhando é baseado em minhas experiências e no material disponibilizado pelo professor. Além disso, esta iniciativa se alinha com uma trend que tenho observado nas redes sociais, chamada “aprendendo em público”. A essência dessa abordagem é compartilhar nossa jornada de aprendizado à medida que progredimos.

Hoje, em especial, estou me preparando para uma avaliação da disciplina de Projeto de Software, e este texto servirá como uma síntese de todo o conteúdo abordado nas aulas. Além disso, pretendo que este material seja uma base para discussões futuras e uma fonte de aprendizado contínuo.

Para começarmos nossa conversa sobre Projeto de Software, é essencial definir o que exatamente isso significa. Toda essa definição é fundamental e é dividida em três elementos primordiais: processos, métodos e ferramentas.

Os processos estabelecem os passos gerais necessários para o desenvolvimento e manutenção de software. Eles servem como uma estrutura que orienta a aplicação dos métodos e ferramentas.

Falando sobre métodos, esses são elementos que se encaixam no encadeamento dos processos. Eles podem ser considerados como “como fazer” passos específicos dentro de um processo. E, é claro, não podemos esquecer a importância das ferramentas que automatizam e facilitam tanto os processos quanto os métodos.

Para tornar isso mais prático, pense em fazer um brigadeiro como nosso artefato final. Os métodos seriam as receitas detalhadas, enquanto as ferramentas seriam os utensílios de cozinha que auxiliam no processo. Exemplo, tirado do material do professor, achei bom rsrs.

Agora, olhando para o processo, podemos considerá-lo como as etapas necessárias para preparar nosso brigadeiro. Primeiro, você mistura leite condensado, margarina e chocolate em pó em uma panela. Em seguida, cozinhe essa mistura no fogão, e, por fim, deixe esfriar.

Transpondo isso para o desenvolvimento de software, temos atividades como Requisitos, Projeto, Implementação, Teste e Manutenção. Embora não precisem necessariamente seguir essa ordem, são possibilidades dentro do processo de criação de software.

Objetivos do Projeto de Software

Vamos agora discutir os objetivos essenciais do projeto de software. Compreendemos que o projeto de software é um conjunto de processos para o desenvolvimento de um sistema de software. No entanto, para que servem esses processos?

O objetivo principal do projeto de software é transformar requisitos em um projeto concreto do sistema de software. Isso é fundamental, assim como você não moraria em um prédio de 5 andares que não foi projetado por um engenheiro, um software também precisa de um projeto sólido.

Além disso, o projeto de software tem os seguintes objetivos:

  • Fomentar a qualidade durante todo o processo de desenvolvimento.
  • Fornecer representações do software que podem ser avaliadas quanto à qualidade.
  • Traduzir com precisão os requisitos do cliente em um produto de software finalizado.
  • Servir como base sólida para as fases de implementação, teste e manutenção.

Em resumo, o projeto de software é o alicerce que garante que o software seja desenvolvido com qualidade, atendendo aos requisitos do cliente e proporcionando uma base sólida para todas as etapas subsequentes do processo de desenvolvimento.

E aí entra as principais preocupações que vem de modinha. Mas vamos nos atentar a cada um dos itens

  • Particionamento (decomposição; divisão e conquista)
  • Abstração
  • Encapsulamento (ocultamento da informação)
  • Modularidade
  • Separação de preocupações (concerns)
  • Separação de políticas da execução de algoritmos
  • Acoplamento e coesão

Estes são os principais elementos que devemos considerar ao pensar nos princípios de um projeto de software. Sem eles, as coisas podem facilmente sair do controle. Vamos falar cada um desses elementos para entender o que eles representam antes de mergulharmos na implementação prática no código.

Particionamento

Vamos definir o conceito de particionamento de forma direta: Quando lidamos com um problema complexo, como o problema P, a abordagem é dividi-lo em problemas menores, também conhecidos como sub-problemas. Cada um desses sub-problemas é compreendido e solucionado separadamente. Em última análise, a combinação das soluções para cada um desses sub-problemas nos permite resolver o problema complexo como um todo. Este é o princípio do particionamento no projeto de software.

Em segundo ponto, vamos começar em abstração.

Abstração

A abstração desempenha um papel essencial quando lidamos com a complexidade. Ela envolve a criação de diferentes níveis de representação, com o foco principal em destacar as características relevantes para resolver um problema específico.

Além disso, a abstração deve permitir que os observadores possam distinguir claramente esses elementos abstratos de outros e, ao mesmo tempo, facilitar o entendimento, a comunicação e a avaliação. É um conceito-chave no projeto de software.

Encapsulamento

O encapsulamento, pelo menos na minha perspectiva atual, é um dos principais ferramentas para separar responsabilidades (um outro ponto que iremos falar abaixo).

A ideia central é criar interfaces de comunicação que revelem o mínimo possível sobre o funcionamento interno de um componente.

Para ilustrar, imagine você indo a um cartório para solicitar um documento X. Não importa qual procedimento complexo está ocorrendo dentro do cartório; para mim, a única coisa relevante é que estou me comunicando com alguém específico, por meio de uma interface de comunicação bem definida(guinche, balcão, tanto faz…). Essa interface age como o ponto de entrada para o objeto ou componente desejado, ocultando os detalhes internos e tornando a interação mais simples e direta.

Modularidade

A modularidade desempenha um papel fundamental na garantia da clareza e inteligibilidade de um software, permitindo que o consigamos dividir em componentes menores, conhecidos como módulos. Abaixo, listo as principais vantagens de adotar um código modular, o que deve ser considerado como um dos princípios essenciais no desenvolvimento de software:

Vantagens:

  • Facilita o entendimento: Cada módulo pode ser estudado separadamente, tornando mais fácil compreender seu funcionamento.
  • Facilita o desenvolvimento: Cada módulo pode ser projetado, implementado e testado de forma independente, agilizando o processo de desenvolvimento.
  • Diminui o tempo de desenvolvimento: Módulos podem ser implementados em paralelo ou até mesmo reutilizados em diferentes partes do projeto, economizando tempo.
  • Promove a flexibilidade no produto: Módulos podem ser substituídos por outros, desde que implementem as mesmas interfaces, tornando o sistema mais flexível e adaptável.
  • Reduz o esforço para resolver problemas: A divisão em módulos permite que os problemas sejam tratados de maneira mais granular, simplificando a identificação e solução de questões específicas.

Separação de Preocupações

Aqui entramos no âmbito do domínio da aplicação. A ideia central é que, ao definir os módulos de um sistema, eles devem lidar com preocupações diferentes ou não relacionadas. A premissa é que cada módulo cuide do seu próprio conjunto de responsabilidades. Esse esforço aparentemente simples leva a um alto nível de coesão e a um baixo acoplamento (explicaremos esses conceitos abaixo).

Separação de Políticas da Execução de Algoritmos

Podemos considerar que essa ideia deriva da separação de preocupações e, principalmente, que um módulo deve se concentrar em decisões sensíveis ao contexto do problema ou na execução de algoritmos, mas não em ambos. De uma forma mais pratica podemos pensar que um módulo deve se preocupar em tomar decisões com base nos dados da aplicação, o que chamamos de política, enquanto outro deve se concentrar na execução desses algoritmos.

O principal benefício dessa abordagem é que ela facilita o uso e a manutenção do sistema, tornando-o mais claro e organizado.

Coesão e Acoplamento

Aqui, chegamos a dois termos amplamente discutidos, mas que frequentemente carecem de definições claras. O que exatamente significam esses conceitos? Vamos lá.

Vamos nos basear nos princípios de Yourdon, Constantine e Myers.

Em termos simples:

Coesão é a medida da funcionalidade de um módulo, ou seja, o quão bem ele realiza uma tarefa específica. Em outras palavras, um módulo coeso tem uma única responsabilidade e executa essa tarefa de forma independente.

Acoplamento mede o grau de interdependência entre módulos, ou seja, quão conectados eles estão. Um acoplamento alto indica que os módulos estão fortemente interligados, enquanto um baixo acoplamento significa que eles têm poucas conexões entre si.

De forma mais detalhada, esses conceitos são baseados nos princípios de engenharia de software, conforme definidos por Yourdon, Constantine e Myers:

Acoplamento é definido como: “O acoplamento é uma medida da interconexão entre os módulos de uma estrutura de software e depende da complexidade da interface entre esses módulos.”

Coesão é definida como: “Um módulo coeso executa uma única tarefa dentro do procedimento de software, exigindo pouca interação com procedimentos executados em outras partes do programa.”

A ideia fundamental é buscar uma alta coesão e um baixo acoplamento. Isso significa que as classes devem ter uma única e clara responsabilidade, e a comunicação entre elas deve ser direta e sem emaranhados. Em outras palavras, apenas as classes que precisam se comunicar devem se comunicar.

Com isso, concluímos este primeiro texto introdutório. Agradeço muito pela leitura e convido você a conferir os próximos textos, pois este é apenas o começo da nossa jornada. É uma ideia que esse texto seja revisado sempre e incrementado com algum novo item. Qualquer sugestão, só entrar em contato comigo nas redes aí. Valeeu!