Programming 1 na UoPeople – Debugging

E já se foram alguns cursos compartilhados aqui desde que comecei a série de textos sobre a University of the People. Testei formatos diferentes procurando manter a estrutura mais ou menos coesa: linhas gerais do curso, pontos fortes, fracos, desafios e dicas gerais. O objetivo sempre foi lançar uma luz no caminho, não mostrar os detalhes do trajeto.

Parte desse esforço é egoísta. Cada postagem me força a revisar o curso e isso me ajuda a internalizar o que estudei. É também uma oportunidade de refletir sobre o que aprendi, e, principalmente, sobre como eu aprendi. Esse é o aspecto mais interessante do processo de aprendizado, na minha opinião. O “como” e o contexto. É entender o que está acontecendo no mundo enquanto aprendo determinado tópico e como isso afeta esse processo de internalização do conteúdo.

É um equilíbrio difícil. Ao criar um espaço público para compartilhar as minhas ideias, estabeleço invariavelmente um compromisso com o mundo externo. Preciso ser compreendido pelos outros. Não estou falando sozinho. O ato de compartilhar envolve ação e reação. É um ciclo que se retroalimenta. Abrir-se para o mundo envolve risco. E de que vale se arriscar se não for de corpo inteiro? De que vale se manter na zona de conforto no meio do desconhecido?

Essa postagem é sobre o curso de Programming 1 na University of the People, mas não de uma forma óbvia. Dessa vez não vou falar sobre o syllabus do curso, nem sobre os discussion forums, ou sobre os learning journals. São tópicos pontuais que podem ser escritos por qualquer um e já são publicados com prazo de validade limitado. Pouco significa falar que programamos em Java, que utilizamos Netbeans como IDE, ou que os Programming Assignments possuem 25% de peso na nota final. Isso foi assim há um ano atrás.

O objetivo-chave é o que podemos fazer de prático com esse conhecimento. É responder no quê Programming 1 acrescentou na minha vida. É explicar quais ferramentas adquiri para contribuir com algo, nem que esse algo seja um único grão de areia no castelo da humanidade. Programação Orientada a Objetos, Herança, Polimorfismo, Classes, Interface Gráfica e Estrutura de Dados: o que significa tudo isso para o mundo atual?

Nesse processo de reflexão pessoal é fácil deixar o pessimismo dominar tudo e revelar a resposta mais horrenda de todas: Eu não sei o que tudo isso significa. Entendo os conceitos. Aprendi ao longo do curso sobre estes e tantos outros tópicos considerados “essenciais”. É isso que Programming 1 cobre. Tópicos básicos sobre programação. Mas isso não significa nada sem objetivo. É como olhar um martelo e entender que ele serve para bater um prego, mas nunca utilizá-lo.

Eu faço aqui um convite e uma provocação. De agora em diante só vou falar enquanto bato o prego.

Polimorfismo em Java

Na unidade 6 do curso de Programação 1 aprendemos o conceito de polimorfismo, termo derivado do grego poli — muitos —, e morpheus — forma, estrutura. Uma das tarefas é discutir polimorfismo no contexto de programação orientada a objetos e dar um exemplo de como implementar essa funcionalidade em Java.

Revisando as anotações achei que a minha abordagem foi interessante. Segue para a apreciação, com pequenas modificações.


The world around us is polymorphic. We can see this almost everywhere: people, animals, cars, books, languages, houses. As humans, we seek to differentiate ourselves from others. We like to think and show that we are unique up to a point in which other people still recognize us as humans. Up to a point that they still can relate and interact with us.

Something similar happens with a programming language like Java. The ability to instantiate and handle multiple objects together make complex programs easier to handle, manage and develop. It is expected that complex software keeps evolving and including new functionalities with time. Imagine that if for each new functionality you have, you need to review previous objects and update old code to fit each new features included. It can easily become a complex and time-consuming task. Polymorphism is a powerful solution that avoids a lot of code rework and guarantee program fluidity. Citing Oracle Java documentation definition, “subclasses of a class can define their own unique behaviors and yet share some of the same functionality of the parent class.” (Oracle, 2017)

Imagine the following Language superclass and English subclass.

class Language {
    void toHear(Language hear) {
    // Method to hear some language
}
toSpeak(Language speak) {
    // method to speak some language
    }
}

class English extends Language {
	void toHear(English hear) {
	// specific instructions to hear and understand the English language.
	}
	toSpeak(English speak) {
	// specific instructions to hear and understand the English language.
	}
}

Imagine that in the example above you have multiple language subclasses and want then all to “work” in their own language. Of course that this is a simplified example, but the same method toSpeak would call a specific response for each object (aka each language), a unique behavior, while still sharing some functionality from the parent class.

Reference: Oracle (Ed.). (n.d.). Polymorphism. Retrieved October 18, 2017, from https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html