Como utilizar o Java para solucionar problemas
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.
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.