Por que eu devo ler este artigo:Apresenta uma proposta de rotina elementar a ser seguida para solucionar problemas de programação e exemplos práticos que, além de seguir essa rotina, aplicam estruturas de Java.

Serve como um guia básico, principalmente aos desenvolvedores que estão dando os primeiros passos e têm dificuldade para iniciar a solução de um problema, devido não saberem por onde começar.

Enfrentar um problema de programação, seja ele elementar ou um domínio mais complexo, exige conhecimento desse domínio, de técnicas e recursos. A forma de atacar o problema pode determinar a eficiência ou não da solução. A simples metodologia aqui apresentada, usada juntamente com os recursos disponíveis, é fundamental para se obter sucesso na tarefa de solucionar esses problemas.

Muito já foi discutido sobre o tema “programação é arte ou ciência”. Não é pretensão do autor entrar na discussão, mas usar como ponto de partida deste artigo uma afirmação daquele que consideramos o pai da matéria – Donald Knuth. No artigo “Computer Programming as an Art”, ele afirma que “programação de computadores é uma arte, porque aplica conhecimento acumulado, porque requer habilidade e engenhosidade e, especialmente, porque produz objetos de beleza”.

Note que Knuth não fala sobre talento, inspiração ou coisas do gênero. De onde pode-se concluir que é necessário se preparar, conhecer as ferramentas que serão utilizadas e ter entendimento sobre o domínio do problema.

Para reforçar o exposto acima, Steven Skiena, no prefácio do livro “The Algorithm Design Manual”, diz que a criação de algoritmos corretos e eficientes que solucionem problemas reais exige o conhecimento de técnicas e recursos. Ele considera que a técnica mais importante é a modelagem. Modelagem é a arte de analisar um problema e abstrair uma solução adequada para ser abordada por um algoritmo. E os recursos são formados pela base de conhecimento de algoritmos clássicos, que servem de ponto de partida para a solução do problema.

Desta forma, na seção seguinte será sugerida uma metodologia simples e prática a ser seguida na solução de problemas de programação.

Nota: Donald Knuth é um cientista da computação, autor de uma das principais referências na área – a série de livros entitulados “The Art of Computer Programming”. Em reconhecimento à sua contribuição, a Universidade de Stanford o agraciou com o título “Professor Emeritus of The Art of Computer Programming”.

Abstrair significa concentrar-se nos aspectos essenciais do domínio de um problema, ignorando características irrelevantes. Por exemplo: na análise de um Sistema Acadêmico Escolar, as classes Aluno, Professor e Disciplina são casos de abstração.

Como abordar um problema de programação

Descreveremos aqui alguns passos, não necessariamente imprescindíveis, que poderão ajudar-nos a produzir soluções de programação corretas e eficientes.

Entenda o problema

O problema deve ser bem definido com o máximo de detalhes. Entender o domínio do problema é fundamental. A especificação dos dados que representam as entradas e as informações que a solução do problema deve produzir devem ser também descritas minuciosamente. Se julgar necessário, crie um modelo de domínio preliminar. Leia a seção “Introdução ao modelo de domínio” para um pouco mais de detalhes.

Se for possível, tente resolver o problema manualmente

Execute pequenas partes da solução mentalmente, usando como auxílio papel e caneta. Procure usar valores de entrada diferentes e variados para ver o que acontece. Esse procedimento é o que chamamos teste de mesa.

Defina com precisão o algoritmo

É sempre bom escrever algum pseudocódigo descrevendo o que o programa irá fazer. Certamente que, em se tratando de algo que você já escreveu várias vezes ou algo de nítida simplicidade, isso não seria necessário.

Escreva a versão final do algoritmo que será utilizado na solução e que deverá ser mapeado para a linguagem de programação escolhida.

Codifique o programa

Escreva o programa na linguagem escolhida. Comente o código à medida que vai codificando. Utilize identação para tornar o código fonte mais legível. Use nomes sugestivos e não muito longos para variáveis e métodos e, sempre que possível, divida seu programa em partes menores – ou seja, modularize.

Lembre-se que passamos a maior parte do tempo em programação corrigindo e/ou modificando o código. Portanto gaste tempo escrevendo código mais legível, pois é mais fácil de depurar e manter.

Nas seções seguintes serão apresentados problemas e suas respectivas soluções. Cada seção irá focar em um ou mais temas do universo da programação em Java.

Introdução ao modelo de domínio

Domínio do problema é um termo usado para definir as áreas que precisam ser examinadas para solucionar o problema. Significa que deve-se olhar apenas para os tópicos de interesse, excluindo tudo que for irrelevante.

Modelo de domínio é uma visão conceitual preliminar do problema e normalmente é chamado diagrama de classes conceitual. O modelo conceitual representa as entidades, seus atributos e relacionamentos. Por exemplo, no modelo de domínio Acadêmico Escolar identificamos as seguintes entidades: Curso, Disciplina, Professor, Aluno e Matrícula; e os seguintes relacionamentos: Professor ministra Disciplina, Curso é composto de Disciplina, Aluno matricula-se em Disciplina. Avançando um pouco mais, pode-se definir uma entidade Pessoa que tem como entidades derivadas o Professor e o Aluno.

Para representar um modelo de domínio geralmente usamos o diagrama de classes. Num diagrama de classes, as classes são representadas por retângulos divididos em três partes, como mostra a Figura 1.

Representação de uma classe
Figura 1. Representação de uma classe

Outros elementos do diagrama são mostrados no diagrama da Figura 2, que representa o domínio Acadêmico Escolar, do exemplo citado anteriormente. Generalização representa o relacionamento é-um, como no caso de Professor é uma Pessoa. Agregação representa o relacionamento tem-um, tal como Curso tem Disciplina. Associação representa ligação entre entidades, tal como Aluno matricula-se em Disciplina. Uma associação indica que uma das classes, no mínimo, faz referência à outra. O número de objetos que referenciam o outro em uma associação é representado pela multiplicidade. No exemplo mostrado, a representação 0..* significa que um Aluno matricula-se em zero ou mais disciplinas, e que em uma Disciplina zero ou mais alunos podem se matricular. Além desse caso de multiplicidade, existem outros, tais como:

  • ...
    Quer ler esse conteúdo completo? Tenha acesso completo