PraticOO – Método para o Aprendizado de Orientação a Objetos por Estudantes de Engenharia Carlos Henrique Rodrigues Cardoso1 Abstract The Oriented-Object languages, such as Java, C++ or C# ( read C Sharp ) have been growing fast, in particular, at the solutions generation for telecommunications and electronics. The learning of the Oriented-Object techniques needs a high abstraction level . Therefore, the students, most of the times, have great difficulty in learning and using these techniques in a consistent way and how to apply them in the projects’ development. This paper shows a practical method of teaching the electrical engineering students the OrientedObject techniques with the focus on Electronics and Telecommunications. The purpose of PraticOO method is to permit the migration from structured paradigm to object oriented paradigm. Index Terms Object-Oriented Paradigms, ObjectOriented Programming, Structured Paradigms, Java. Resumo O uso de linguagens Orientadas a Objetos, como Java, C++ ou C# (lê-se C Sharp) vem crescendo rapidamente, em particular na geração de soluções para telecomunicações e eletrônica. O aprendizado das técnicas de Orientação a Objetos necessita de um alto grau de abstração. Em virtude disso, os alunos, na maioria das vezes, têm grande dificuldade de aprender e utilizar essas técnicas de forma consistente, bem como aplicá-las no desenvolvimento de projetos. Este artigo apresenta um método prático de ensino das técnicas de Orientação a Objetos para alunos de engenharia elétrica com ênfase em Eletrônica e Telecomunicações. A intenção do método PraticOO é permitir uma migração do paradigma estruturado para o orientado a objetos. Termos de Índice Paradigmas de Orientação a Objetos, Programação Orientada a Objetos, Paradigma Estruturado, Java. INTRODUÇÃO Muita pesquisa tem sido feita nos últimos anos no sentido de encontrar caminhos que facilitem o aprendizado das técnicas de Orientação a Objetos. Em [1] é apresentado um conjunto de orientações para o ensino de Orientação a Objetos. Estas orientações foram seguidas na criação do método PraticOO. Em [2] são apresentadas as justificativas da escolha da linguagem Java como sendo a que reúne as melhores características para o aprendizado de orientação a objetos. Esta pesquisa está sendo conduzida no sentido de apresentar técnicas pedagógicas que facilitem o aprendizado de Orientação a Objetos por alunos de engenharia eletrônica e de telecomunicações, que em função da tecnologia devem ser capazes de desenvolver projetos de software tanto Estruturados como Orientados a Objetos, aproveitando o máximo de cada técnica quando apropriado. Os alunos que utilizaram o método PraticOO são alunos que obtiveram formação em desenvolvimento de projetos estruturados utilizando a linguagem C, muito comum em equipamentos eletrônicos. Em [3] é colocado o problema da “contaminação de paradigmas” que ocorre quando diferentes metodologias são misturadas ou combinadas e os benefícios de uma ou outra metodologia são perdidos. Porém, em Engenharia Eletrônica e de Telecomunicações o aluno deve conhecer as duas metodologias - Estruturada e Orientada a Objetos - e deve utilizá-las adequadamente. Não é possível determinar qual é a melhor metodologia. Este trabalho de pesquisa se iniciou em 2002, no curso de Engenharia Elétrica do Inatel, na disciplina de Computação III. Introduz-se no próximo tópico as principais dificuldades encontradas no aprendizado de Orientação a Objetos apresentadas em outras pesquisas e confirmadas durante o desenvolvimento da pesquisa. Em seguida apresenta-se o método PraticOO. Ao final do artigo apresentam-se o tópico com as conclusões e trabalhos futuros, e finalmente apresentam-se as referências bibliográficas utilizadas no desenvolvimento da pesquisa. Em [4] destaca-se a importância do uso de uma ferramenta adequada para o ensino de orientação a objetos. Nesta pesquisa foi utilizada a ferramenta Eclipse (www.eclipse.org) em conjunto com o plugin EclipseUML (www.omondo.com) por serem gratuitas, o que permite o uso no laboratório ou em casa e pela facilidade no uso. O Eclipse permite ainda a inclusão de outros plugins, o que o torna uma ferramenta extremamente versátil. O Eclipse possui ainda várias características do BlueJ[4], com a vantagem de ser também uma ferramenta de uso profissional. O uso de uma ferramenta é fundamental para a compreensão da orientação a objetos por permitir a visualização de diagramas que orientam o uso das técnicas. 1 Carlos Henrique Rodrigues Cardoso, Inatel - Instituto Nacional de Telecomunicações – ICC – Inatel Competence Center - DCOM - Departamento de Computação, Av. João de Camargo, 510, 37.540-000, Santa Rita do Sapucaí, MG, Brazil, caí[email protected] PRATICOO – TÉCNICAS DE ENSINO DE ORIENTAÇÃO A OBJETOS Problemas e soluções já foram experimentadas indicando caminhos para o aprendizado de Java e orientada a objeto[1], e uma das conclusões é o ensino dos conceitos de objeto antes de conhecer uma linguagem orientada a objetos[5]. O método PraticOO foi desenvolvido pensando em alunos de engenharia eletrônica e de telecomunicações que já possuem conhecimento de programação estruturada, no caso utilizando C. A base da metodologia consiste em apresentar um projeto não trivial do ponto de vista de orientação a objetos, mas que se inicie de um projeto estruturado e vá a cada fase da migração acrescentando as características da orientação a objeto, justificando assim as suas vantagens, apresentando quais tipos de projeto se beneficiam de uma ou outra metodologia. A meta da migração é atingir um projeto orientado a objetos utilizando o padrão Model-View-Control (MVC)[6]. O encapsulamento é feito, inicialmente, isolando-se a parte visual do projeto; em seguida é definido o modelo e, finalmente, é introduzida a classe de controle. A apresentação da Orientação a Objetos é feita sempre utilizando código em Java; as classes são criadas e o sistema deve ser executado desde a primeira versão. É importante ressaltar que cada fase é desenvolvida em código e apresentada no diagrama de classes. Em um determinado momento esta seqüência é invertida, ou seja, primeiro o diagrama e em seguida o código, uma vez que esta é a forma de desenvolver orientado a objetos. A seguir são apresentados os passos do método: 1. Escolha o projeto que será desenvolvido e dê um nome a esse projeto. Para alunos de engenharia eletrônica/telecomunicações são utilizados projetos de linha de comando porque o uso de interfaces gráficas tira o foco da orientação a objetos[1]. Deve-se também aproveitar para apresentar a orientação no problema (usado em projetos orientados a objetos) ao invés da orientação na solução (usado em projetos estruturados)[3]. 2. Desenvolva junto com os alunos a versão estruturada do projeto. É interessante neste caso utilizar do conhecimento existente, como por exemplo a construção de fluxogramas. Todo o código estará em uma única classe que possui o nome do projeto. Além do método main, é interessante criar métodos que façam escrita em vídeo e principalmente leitura de teclado. A leitura de teclado em Java é bastante complexa; isso deve ser apresentado sem se detalhar o uso de classes e objetos. 3. Crie classes com métodos estáticos. O gerenciamento de memória não é um conceito 4. 5. 6. 7. 8. muito utilizado em projetos estruturados. Em C seria necessário utilizar as funções malloc para alocar memória e free para retornar a memória alocada. Em linguagens orientadas a objeto os objetos são criados e destruídos todo o tempo. É importante definir uma classe estática que receberá os métodos de leitura de teclado e escrita na tela. No nosso caso esta classe é chamada de Console. Introduza o conceito de criação de objetos com o operador new. O uso racional da memória disponível no sistema é muito crítico em sistemas embarcados em eletrônica ou telecomunicações. É importante que o aluno compreenda a necessidade de racionalizar a utilização da memória para que os poucos recursos possam ser aproveitados ao máximo. O aluno deve desenvolver um projeto como exercício para a fixação desta teoria. Introduza os relacionamentos de associação e dependência. Até este momento, as classes estavam isoladas. O relacionamento existia, porém não era apresentado no diagrama. Isto deve ser feito para que os alunos compreendam que os objetos existem para atender a um outro objeto. Nesta fase deve-se iniciar o refactoring do projeto introduzindo classes que manipulem a entrada e a saída de informações do projeto. É interessante que o projeto contemple relacionamentos 1 para 1 e/ou 1 para muitos. Os alunos devem desenvolver um exercício para a fixação da teoria. Distribua as responsabilidades utilizando herança. É importante que o projeto contemple a possibilidade de herança. Apesar do uso de alocação dinâmica de objetos, é possível que isto não esteja trazendo grandes vantagens ao sistema em função do acúmulo de responsabilidade das classes. O uso adequado dos recursos é utilizado didaticamente para auxiliar nas justificativas do uso da metodologia orientada a objetos. Os alunos devem desenvolver um exercício para a fixação da teoria. Isole o controle, ou seja, a distribuição de ações. As classes de visualização e modelo (entidades) são mais fáceis de compreender. Porém, neste momento, algum método estará fazendo o controle e pode ser isolado em uma classe. Este é o momento para se definir o padrão e apresentar as vantagens de se utilizar padrões para desenvolvimento de projetos orientados a objetos. Apresente o conceito de polimorfismo. Este conceito é importante para que os alunos possam compreender a força da orientação a objetos, mesmo que nem sempre seja necessária a sua utilização. 9. Crie pacotes que definam o padrão MVC. O uso de pacotes é muito utilizado na linguagem Java e oferece um novo nível de abstração. A ferramenta Eclipse permite o uso de refactoring de uma forma totalmente automática. Este recurso agiliza a demonstração do conceito. Faça sempre uma análise do projeto em desenvolvimento. É importante estar sempre mostrando para os alunos de onde o projeto partiu e o porquê de cada passo. Isso irá fortalecer os conceitos de orientação a objetos sem interferir nos conceitos de programação estruturada. relação as funções cin e cout de C++), e a classe Operação que recebe os parâmetros e executa a operação solicitada. Note que todos os métodos são estáticos (estão sublinhados). APLICAÇÃO DO MÉTODO PRATICOO Os alunos de primeiro ano em engenharia eletrônica e/ou telecomunicações não possuem ainda conhecimentos específicos da área que possam ser utilizados como exemplo de projeto. Deve-se escolher projetos que sejam de conhecimento dos alunos, utilizando por exemplo o conhecimento de física ou matemática. Um exemplo interessante é uma calculadora que pode ser iniciada com somente 4 operações e evoluir para uma calculadora científica. Esta evolução permite o ensino do processo de desenvolvimento incremental diferente do processo cascata utilizado para desenvolver estruturado[3]. Outros exemplos de projeto são cálculo de trajetória, conversor de temperatura, lançamento de projéteis, agenda eletrônica, entre outros. Na figura 1 é apresentado o diagrama de classes com uma única classe e com um único método - o main, que faz as equações. Se os alunos conhecem lógica, a compreensão do funcionamento deste código é bastante simples. Neste momento deve-se analisar os problemas de evolução do sistema, a definição da arquitetura, manutenção, etc., e permitir a introdução de novos conceitos. Os métodos cin e cout fazem respectivamente a leitura de teclado e a apresentação no display. FIGURA. 2 CALCULADORA ORIENTADA A OBJETOS COM MÉTODOS ESTÁTICOS. A figura 3 apresenta o projeto com as mesmas classes; porém, a classe Operação passou a ser dinâmica e precisará ser instanciada com o operador new. FIGURA. 3 CALCULADORA ORIENTADA A OBJETOS COM MÉTODOS DINÂMICOS. FIGURA. 1 CALCULADORA NÃO ORIENTADA A OBJETOS. A figura 2 apresenta o projeto com duas novas classes: a classe Console, que é responsável pela leitura do teclado e escrita na tela (veja que os nomes dos métodos fazem A figura 4 apresenta a informação de relacionamento e permite apresentar os conceitos de associação e dependência. FIGURA. 4 CALCULADORA COM RELACIONAMENTO DE ASSOCIAÇÃO E DEPENDÊNCIA. Na figura 5, o projeto foi remodelado, diminuindo a responsabilidade da classe Operação e criando uma classe para cada operação diferente. A classe Operação passou a ser abstrata e o método calcular também se tornou abstrato, sendo necessário que cada classe filha seja responsável pela execução do método. Neste momento é possível tratar de polimorfismo dinâmico e estático e introduzir a UML no projeto de software[7]. FIGURA. 5 CALCULADORA COM RELACIONAMENTO DE HERANÇA. Na figura 6, o projeto foi remodelado mais uma vez porque a responsabilidade do controle das informações havia ficado com a classe CalculadoraMenu. Neste modelo então as classes CalculadoraMenu e a Console fazem parte do pacote View; a classe Controle corresponde ao Control e as demais classes correspondem a Model. FIGURA. 6 CALCULADORA UTILIZANDO O PATTERN MVC. CONCLUSÕES O aprendizado de Orientação a Objetos tem se tornado um desafio para professores e alunos. Por se tratar de um raciocínio muito abstrato, torna-se difícil a compreensão e a justificativa clara da sua utilização para os alunos. Porém, com o aumento da complexidade e distribuição dos sistemas, torna-se premente o uso de técnicas, em particular a orientação a objetos, que permitam o uso das características da engenharia com análise, projeto, acompanhamento em desenvolvimento de software. O método apresentado neste artigo foi aplicado em 65 alunos do primeiro ano de graduação em Engenharia Elétrica que não haviam tido contato com Orientação a Objetos ou com a linguagem Java. Os resultados obtidos mostraram que é possível introduzir novas técnicas em grupos que já conhecem programação estruturada/procedural utilizando-se métodos práticos que façam a conexão entre o conhecimento já dominado e novas técnicas a serem aprendidas. Os trabalhos futuros na utilização do método incluem a incorporação de atividades de laboratório que incentivem ao exercício prático do método em projetos diferentes, em particular em projetos em Java para aparelhos de celular (J2ME – Java 2 Micro Edition), nos quais as condições de baixos recursos de memória e processamento são próximos da realidade enfrentada no desenvolvimento. Além disso pretende-se realizar experimentos com a linguagem C++ e comparar as dificuldades no aprendizado utilizando uma linguagem não tão bem comportada como Java. REFERÊNCIAS [1] Kolling, M., Rosenberg, J., “Guidelines for Teaching Object Orientation with Java”, published in The Proceedings of the 6th conference on Information Technology in Computer Science Education (ITiCSE ,2002), Canterbury, 2001. [2] Blumenstein, M. “Experience in Teaching Object-Oriented Concepts to First Year Students with Diverse Backgrounds”, Proceedings of the International Conference on Information Technology; Coding and Computing(ITCC’04), IEEE, 2004 [3] Gerber, A., Cloete, E., “Teaching Objected-oriented Systems Development to Structurally Exposed Students”, Proceeding of the 17th Conference on Software Engineering Education and Training (CSEET’04), IEEE, 2004 [4] Kolling, M., Quig, B., Patterson, A. Rosenbeg, J., “The BlueJ system and pedagogy”, published in the Journal of Computer Science Education, Special Issue o Learning and Teaching Object Technology, Vol 13, No. 14, December 2003. [5] Blumenstein, M. “Strategies for Improving a Java-based, First Year Programming Course”, Proceedings of the International Conference on Computers in Education(ICCE’02) IEEE,2002 [6] Gama, Erich et. al., “Design Patterns”, Addison Wesley Profesional Comuting Series, 1994 [7] Cardoso, Caique (pseudônimo de Cardoso, Carlos Henrique Rodrigues) ,“UML na Prática – Do Problema ao Sistema”, Ciência Moderna, 2003.