Conceitos básicos de design de software

O projeto de software é um processo para transformar os requisitos do usuário em alguma forma adequada, o que ajuda o programador na codificação e implementação do software.

Para avaliar os requisitos do usuário, um documento SRS (Software Requirement Specification) é criado, enquanto para codificação e implementação, há uma necessidade de requisitos mais específicos e detalhados em termos de software. A saída desse processo pode ser usada diretamente na implementação em linguagens de programação.

O projeto de software é a primeira etapa do SDLC (Ciclo de Vida do Projeto de Software), que move a concentração do domínio do problema para o domínio da solução. Tenta especificar como cumprir os requisitos mencionados na SRS.

Níveis de Design de Software

O design de software produz três níveis de resultados:

  • Architectural Design - O projeto arquitetônico é a versão abstrata mais elevada do sistema. Ele identifica o software como um sistema com muitos componentes interagindo entre si. Nesse nível, os designers têm a ideia do domínio da solução proposta.
  • High-level Design- O projeto de alto nível quebra o conceito de projeto arquitetônico de 'entidade única-componente múltiplo' em uma visão menos abstrata de subsistemas e módulos e descreve sua interação uns com os outros. O design de alto nível concentra-se em como o sistema, juntamente com todos os seus componentes, podem ser implementados em formas de módulos. Ele reconhece a estrutura modular de cada subsistema e sua relação e interação entre si.
  • Detailed Design- O projeto detalhado lida com a parte de implementação do que é visto como um sistema e seus subsistemas nos dois projetos anteriores. É mais detalhado em relação aos módulos e suas implementações. Ele define a estrutura lógica de cada módulo e suas interfaces para se comunicar com outros módulos.

Modularização

Modularização é uma técnica para dividir um sistema de software em vários módulos discretos e independentes, que devem ser capazes de realizar tarefas de forma independente. Esses módulos podem funcionar como construções básicas para todo o software. Os projetistas tendem a projetar módulos de forma que possam ser executados e / ou compilados separadamente e independentemente.

O design modular segue involuntariamente as regras da estratégia de solução de problemas de "dividir para conquistar", porque há muitos outros benefícios associados ao design modular de um software.

Vantagem da modularização:

  • Componentes menores são mais fáceis de manter
  • O programa pode ser dividido com base em aspectos funcionais
  • O nível de abstração desejado pode ser incluído no programa
  • Componentes com alta coesão podem ser reutilizados novamente
  • A execução simultânea pode ser possível
  • Desejado do aspecto de segurança

Simultaneidade

No passado, todos os softwares devem ser executados sequencialmente. Por execução sequencial, queremos dizer que a instrução codificada será executada uma após a outra, implicando que apenas uma parte do programa seja ativada a qualquer momento. Digamos que um software tenha vários módulos, então apenas um de todos os módulos pode ser encontrado ativo em qualquer momento de execução.

No design de software, a simultaneidade é implementada dividindo o software em várias unidades independentes de execução, como módulos e executando-os em paralelo. Em outras palavras, a simultaneidade fornece capacidade ao software de executar mais de uma parte do código em paralelo entre si.

É necessário que os programadores e designers reconheçam esses módulos, que podem ser executados em paralelo.

Exemplo

O recurso de verificação ortográfica no processador de texto é um módulo de software, que funciona junto com o próprio processador de texto.

Acoplamento e Coesão

Quando um programa de software é modularizado, suas tarefas são divididas em vários módulos com base em algumas características. Como sabemos, os módulos são um conjunto de instruções reunidas para realizar algumas tarefas. No entanto, eles são considerados como uma entidade única, mas podem referir-se um ao outro para trabalharem juntos. Existem medidas pelas quais a qualidade de um design de módulos e sua interação entre eles pode ser medida. Essas medidas são chamadas de acoplamento e coesão.

Coesão

Coesão é uma medida que define o grau de intra-dependência dentro dos elementos de um módulo. Quanto maior a coesão, melhor é o desenho do programa.

Existem sete tipos de coesão, a saber -

  • Co-incidental cohesion -É uma coesão não planejada e aleatória, que pode ser o resultado da divisão do programa em módulos menores por causa da modularização. Por não ser planejado, pode confundir os programadores e geralmente não é aceito.
  • Logical cohesion - Quando elementos categorizados logicamente são colocados juntos em um módulo, isso é chamado de coesão lógica.
  • Temporal Cohesion - Quando os elementos do módulo são organizados de forma que sejam processados ​​em um ponto semelhante no tempo, isso é chamado de coesão temporal.
  • Procedural cohesion - Quando os elementos do módulo são agrupados, os quais são executados sequencialmente para realizar uma tarefa, é chamado de coesão procedural.
  • Communicational cohesion - Quando os elementos do módulo são agrupados, os quais são executados sequencialmente e funcionam sobre os mesmos dados (informações), é chamado de coesão comunicacional.
  • Sequential cohesion - Quando os elementos do módulo são agrupados porque a saída de um elemento serve como entrada para outro e assim por diante, isso é chamado de coesão sequencial.
  • Functional cohesion - É considerado o mais alto grau de coesão e é altamente esperado. Os elementos do módulo na coesão funcional são agrupados porque todos contribuem para uma única função bem definida. Também pode ser reutilizado.

Acoplamento

O acoplamento é uma medida que define o nível de inter-confiança entre os módulos de um programa. Diz em que nível os módulos interferem e interagem uns com os outros. Quanto mais baixo for o acoplamento, melhor será o programa.

Existem cinco níveis de acoplamento, a saber -

  • Content coupling - Quando um módulo pode acessar ou modificar diretamente ou referir-se ao conteúdo de outro módulo, isso é chamado de acoplamento de nível de conteúdo.
  • Common coupling- Quando vários módulos têm acesso de leitura e gravação a alguns dados globais, isso é chamado de acoplamento comum ou global.
  • Control coupling- Dois módulos são chamados de controle acoplado se um deles decide a função do outro módulo ou altera seu fluxo de execução.
  • Stamp coupling- Quando vários módulos compartilham uma estrutura de dados comum e trabalham em diferentes partes dela, isso é chamado de acoplamento de selo.
  • Data coupling- O acoplamento de dados é quando dois módulos interagem entre si por meio da passagem de dados (como parâmetro). Se um módulo passa a estrutura de dados como parâmetro, o módulo receptor deve usar todos os seus componentes.

Idealmente, nenhum acoplamento é considerado o melhor.

Verificação de Design

A saída do processo de design de software é a documentação de design, pseudocódigos, diagramas lógicos detalhados, diagramas de processo e descrição detalhada de todos os requisitos funcionais ou não funcionais.

A próxima fase, que é a implementação do software, depende de todas as saídas mencionadas acima.

É então necessário verificar a saída antes de prosseguir para a próxima fase. Quanto mais cedo qualquer erro for detectado, melhor será ou pode não ser detectado até o teste do produto. Se as saídas da fase de projeto estiverem na forma de notação formal, então suas ferramentas associadas para verificação devem ser usadas, caso contrário, uma revisão completa do projeto pode ser usada para verificação e validação.

Por meio da abordagem de verificação estruturada, os revisores podem detectar defeitos que podem ser causados ​​por negligenciar algumas condições. Uma boa revisão de design é importante para um bom design, precisão e qualidade de software.