Objetivos dos algoritmos e níveis de abstração
Os algoritmos podem ser escritos de formas diferentes, dependendo dos objetivos que leveram a sua elaboração. Assim, o objetivo de um algoritmo pode ser prover uma solução para que seja implementada em uma linguagem de programação e o de outro, apresentar uma estratégia que deve ser seguida para obter-se um resultado de interesse.
Objetivos do pseudocódigo
O pseudocódigo pode ser visto como uma mistura de aspectos mais formais, como computação ou notação matemática, com linguagem natural.
Como um primeiro exemplo é apresentado o Algoritmo 1, que considera uma forma de se obter indiretamente a altura de um prédio dados os comprimentos das sombras do prédio de de uma pessoa, juntamente com a altura dessa pessoa. Este tipo de algoritmo pode ser facilmente implementado em C.
Algoritmo 1: Estimativa da altura de um prédio em função de sobras projetadas.
Este é um típico problema e programa solicitado em listas de exercícios de cursos de programação. O algoritmo apresenta uma solução praticamente pronta para a implementação do programa, incluindo sugestões para os nomes das variáveis e até induzindo os comandos que serão usados. A escrita do Algoritmo 1 foi feita considerando que o algoritmo seria lido por um programador com, minimamente, as capacidades básicas de codificação.
Como um segundo exemplo de pseudocódigo, o Algoritmo 2 pode ser considerado.
Algoritmo 2: PNN based LPP, adaptado de Levada (2022)
Este algoritmo é uma adaptação do apresentado no artigo de Levada (2022) e, para entendê-lo por completo, tanto o texto do artigo deve ser lido quanto o leitor deve ter conhecimento sobre o tema abordado. O objetivo do algoritmo não é o entendimento do procedimento que ele realiza em detalhes, mas observar a sequência de passos para produzir o resultado desejado. Ele ainda envolve a integração da linguagem natural com notação matemática para representar as expressões e matrizes utilizadas. No algoritmo original não há a documentação com a descrição nem as pré e pós-condições, uma vez que ele está inserido na discussão apresentada pelo artigo como um todo.
O Algoritmo 2 não foi escrito para pronta implementação. Ele deixa muitos pontos em aberto, mesmo sendo claro quanto a todos os cálculos que devem ser feitos e em que sequência. Esse é um algoritmo de nível alto de abstração, ou seja, muitos detalhes são omitidos propositalmente em função do público-alvo, que são os leitores do artigo científico. Apresentar todos os detalhes, como o passo a passo da criação dos vetores de distâncias \(\vec{d}_i\) ou a própria fórmula usada para a distância somente tornaria o código desnecessariamente complexo, prejudicando a compreensão da estratégia da solução.
Nível de abstração e o público alvo
Quando um algoritmo vai ser escrito, é preciso ter claro qual é o público-alvo que ele pretende atingir. As instruções, portanto, assumem uma forma baseada no conhecimento prévio de quem vai interpretá-las. Essa decisão implica na escolha do nível de abstração que será empregado.
Um algoritmo escrito com nível de abstração baixo é aquele mais próximo do programa que será implementado. Ele costuma apresentar as variáveis e comandos de forma mais explícita. Quando o nível de abstração sobe, os detalhes de implementação são substituídos por descrições mais genéricas.
Supondo que o problema a ser resolvido seja a soma de duas matrizes de mesma dimensão, são apresentados algoritmos em níveis de abstração diferentes, todos corretos e abordando exatamente a mesma solução. O Algoritmo 3 possui um nível de abstração bastante alto, seguido pelo Algoritmo 4, o qual apresenta mais detalhes e pode ser considerado de nível médio; por sua vez, o Algoritmo 5 e o Algoritmo 6 já possuem nível baixo e se aproximam mais de uma possível implementação em um programa.
Algoritmo 3: Soma de duas matrizes de mesma dimensão (nível alto).
Algoritmo 4: Soma de duas matrizes de mesma dimensão (nível médio).
Algoritmo 5: Soma de duas matrizes de mesma dimensão (nível mais baixo).
Algoritmo 6: Soma de duas matrizes de mesma dimensão (nível baixo).
Os algoritmos são apresentados em quatro níveis de abstração diferentes. A Tabela 1 sumariza uma comparação desses algoritmos.
| Algoritmo | Nível | Comentário |
|---|---|---|
| Algoritmo 3 | Alto | Pressupõe o conhecimento de matrizes e suas operações; detalhes como as dimensões são omitidos. |
| Algoritmo 4 | Médio | Ainda considera o conhecimento sobre matrizes; há mais detalhes de como os dados são obtidos e como o cálculo da soma é feito. |
| Algoritmo 5 | Mais baixo | A necessidade de conhecer matrizes é mínima, bastando assumir cada elemento como uma variável separada; introduz a necessidade das dimensões para controle da somas; mantém uma linguagem mais natural. |
| Algoritmo 6 | Baixo | Não há praticamente necessidade de entender o que é uma matriz; uma estruturação de pseudocódigo é adicionada; cada ação é hiperdetalhada; a linguagem natural é mínima. |
Da mesma forma que o nível de abstração depende do público-alvo, também inexiste a necessidade de que um mesmo algoritmo mantenha o nível de abstração constante para todas suas partes. Desse modo, pontos menos importantes, ou seja, que não são o foco do algoritmo, podem ter nível mais alto enquanto outras partes podem ser mais detalhadas, deixando o nível mais baixo para explicitar pontos relevantes da solução.