INTRODUÇÃO

Eu poderia dizer muita coisa aqui, mas vou ser pragmático e resumir o objetivo deste livro em uma frase: utilizar o paradigma de Programação Orientada a Objetos para construir software de qualidade.

Abordagem

Este livro está sendo escrito a partir de notas de aula usadas na disciplina de Programação Orientada a Objetos, ministrada no curso de Análise e Desenvolvimento de Sistemas oferecido pelo Instituto Federal de Educação, Ciência e Tecnologia do Rio Grande do Sul (IFRS). Essa origem, digamos, deu à esse livro as seguintes propriedades:

  • Para a sala de aula (física ou virtual): projetado para ser didático assim como as estratégias de ensino em sala aula;
  • Foco na prática: para cada explanação teórica há exemplos de aplicação prática, com exemplos e estudos de caso, pois ele é destinado à educação profissionalizante;
  • No nosso idioma e na nossa cultura: sem cara de tradução e escrito para os Brasileiros (com um leve sotaque gaúcho;)
  • Linguagem acessível: são evitadas expressões rebuscadas e formalidades linguísticas - o que é muito útil para as pessoas não dormirem nas aulas.

O ponto forte deste livro, penso, é a não-separação de teoria e prática. Logo, cada conceito ou princípio abordado vem junto com um “exemplo bobo”, depois uma situação de uso mais elaborada e um exercício. Como “exemplo bobo”, quero dizer uma amostra de implementação pequena, direta e evidente que, embora não muito útil para o uso cotidiano, deve ser esclarecedora para o aprendiz, com o mínimo de distrações. A situação de uso, por outro lado, é um estudo de caso mais elaborado e serve para observar uma aplicação mais séria e plausível.

Os exercícios servem para a prática do conhecimento e apropriação da habilidade. Exemplos e exercícios crescem em complexidade ao longo do capítulos. Portanto, certifique-se de compreender bem os tópicos anteriores antes de avançar.

Os exemplos e exercícios são baseados em especificações e assertivas, que permitem validar e verificar se o software está conforme o planejado e com as respostas esperadas. Estas são as premissas mais básicas de um controle de qualidade de software e princípios da programação defensiva, que estarão distribuídos transversalmente no livro.

Considere fortemente realizar os exercícios e atividades, eles representam 80% do aprendizado, enquanto ler proporciona apenas 20%. Por mais que entendas muito bem a teoria, a programação é uma atividade prática, de transpiração mesmo, de errar, de acertar, de sair frustrado sem solução para o problema e só descobrir uma saída durante o sono ou banho. É tudo “parte do jogo”.

Linguagem de programação

Este livro foi planejado para priorizar a POO em vez de uma linguagem específica. Portanto, muitos exemplos estão escritos usando pseudocódigo, isto é, a ideia geral estará escrita em português estruturado, como: classe Teste, método MêsPorExtenso(mês: Inteiro): Texto, se condição // ... fim se etc. Assim, estes modelos são implementáveis na maioria das linguagens orientadas a objetos.

Os códigos específicos que poderão ser executados, por outro lado, estão escritos na linguagem de programação Java. Ela é a linguagem preferida na grande maioria dos livros de referência para a Programação Orientada a Objetos. Além disso, Java é bastante usada pelas faculdades e escolas técnicas. Aqui mesmo, no IFRS, usamos Java na disciplina de POO do curso superior de Análise e Desenvolvimento (mas usamos JavaScript/TypeScript na disciplina de POO do curso técnico em Informática para Internet).

No futuro pretendo lançar esse livro com outras linguagens de programação. Como disse antes, é objetivo desse livro não se “apegar” a UMA linguagem de programação, sempre tentando abordar os conceitos, princípios e implementações de forma mais genérica possível, focando sempre no paradigma e não na linguagem de programação. Dito isso, este livro não é uma referência da linguagem Java. Em vez disso, é uma referência para entender e usar a POO

Lembrando: a maioria dos códigos presentes no livro são implementáveis em qualquer linguagem de programação que ofereça um suporte razoável à POO.

Todos os códigos estão disponíveis na on-line em um repositório no github.com neste endereço: https://github.com/marciojrtorres/poocomhonra. Fique à vontade para baixá-los, adaptá-los, testá-los, forkar o repositório, bem, faça como quiser, mi código es su código. (mas os use por sua conta e risco, hehehe :).

Organização dos capítulos

O livro está organizado para cobrir tópicos de POO gradualmente, presumindo que o estudante já conheça o fundamental de programação, como detalhes de sintaxe, declaração, desvios condicionais, laços, etc, como se já estivesse passado por uma disciplina de lógica ou introdução à programação ou computação. Na lista a seguir há uma ideia do que é visto em cada capítulo, na forma de quais questões deve responder.

  • Capítulo 0 – Introdução: o que há neste livro? ele serve para mim?
  • Capítulo 1 – Programação Modular: quais são os fundamentos de modularização de código?
  • Capítulo 2 – História da Programação Orientada a Objetos: como surgiu a POO?
  • Capítulo 3 – Modelo de Objetos: como é um objeto? como descrevê-los e usá-los?
  • Capítulo 4 – Estado: como é o ciclo de vida de um objeto? como definir o conjunto de valores que representam?
  • Capítulo 5 – Comportamento: como são as operações realizadas pelos objetos? como defini-las?
  • Capítulo 6 – Polimorfismo ad hoc: como uma mesma operação pode ser executada com diferentes entradas?
  • Capítulo 7 – Encapsulamento: como um objeto esconde sua complexidade e protege suas informações vitais?
  • Capítulo 8 – Identidade: como um objeto é diferente de outro objeto?
  • Capítulo 9 – Representação: como um objeto pode ser representado alternativamente? quais formatos são mais utilizados?
  • Capítulo 10 – Imutabilidade: como saber se um objeto deve ser constante ou variável?
  • Capítulo 11 – Coesão: como saber quais informações e operações devem ficar juntas no mesmo objeto?
  • Capítulo 12 – Associação: como os objetos trabalham uns com os outros?
  • Capítulo 13 – Delegação: como os objetos delegam operações para outros objetos?
  • Capítulo 14 – Agregação: como os objetos se unem para resolver um problema maior?
  • Capítulo 15 – Modelagem: como descrever a colaboração desses objetos antes de escrever o código?
  • Capítulo 16 – Responsabilidades: como saber o que cada objeto deve fazer?
  • Capítulo 17 – Direcionalidade: como saber a direção das mensagens?
  • Capítulo 18 – Multiplicidade: como saber quantos objetos conectar a outro objeto?
  • Capítulo 19 – Composição: como saber se um objeto deve ser composto de “objetinhos”?
  • Capítulo 20 – Acoplamento: como as relações de dependência entre objetos afetam o projeto?
  • Capítulo 21 – Interface: como um objeto é usado por outros?
  • Capítulo 22 – Generalização e Especialização (Herança): como um objeto pode compartilhar parte de sua lógica e informação?
  • Capítulo 23 – Polimorfismo por Subtipagem: como os objetos específicos podem redefinir o comportamento?
  • Capítulo 24 – Abstração: quão genérico devem ser os objetos genéricos?
  • Capítulo 25 – Polimorfismo Paramétrico: e se eu não souber o tipo específico? como deixar o tipo em aberto?
  • Capítulo 26 – Considerações Finais: sabendo de onde eu vim, para onde eu vou agora?

Para quem é este livro

É sempre importante esclarecer que este é um livro voltado à educação profissional, baseado na minha experiência profissional e no ensino de programação para iniciantes. O livro é útil para os estudantes que já passaram pela disciplina inicial de lógica ou introdução à programação em seus cursos.

Esta obra também pode atender programadores recém formados, entusiastas e autodidatas de programação que desejam compreender melhor (e melhor aplicar) o paradigma orientado a objetos.

Profissionalmente, este livro pode ser usado para descobrir boas estratégias para a modularização de sistemas, embora não se aprofunde em atividades de design de software ou arquitetura de sistemas.

Academicamente, este livro é adequado ao ensino em cursos voltados para a Educação Profissional, Técnica e Tecnológica, tais como: Técnico em Informática, Técnico em Informática para Internet, Tecnologia em Análise e Desenvolvimento de Sistemas, Tecnologia em Sistemas para Internet, além de cursos de formação inicial e continuada na área de desenvolvimento de sistemas. As disciplinas de POO em cursos de bacharelado podem tirar proveito desta obra, mas apenas se objetivarem um viés mais prático. Para ajudar, saiba que ele está sendo usado no IFRS para a disciplina de Programação Orientada a Objetos, cuja ementa está a seguir:

Conceitos e princípios de programação orientada a objetos: abstração, classes, instâncias, estado e comportamento, atributos e métodos, comandos e consultas, coesão, encapsulamento, associação, agregação, composição, delegação, dependência e acoplamento, herança e polimorfismo. Modelagem, implementação e testes. Noções de princípios e padrões de projeto.

Para quem não é este livro

Este livro não cobre construções básicas de programas e não tem o objetivo de ensinar a programar “do zero”. Se não sabes programar, se não passaste por uma disciplina de lógica de programação ou algoritmos, então ele pode te parecer muito avançado e, ao final, não te ser muito útil.

Não espere deste livro uma abordagem completamente teórica. Ele foi escrito por um praticante e para praticantes.

Não espere, também, uma cobertura abrangente da linguagem de programação, neste caso Java. O objetivo é estudar os conceitos do paradigma orientado a objetos. A linguagem é usada apenas para “materializar” esses conceitos. Pensa nela como o instrumento para colocar em prática estes conceitos.

Se tu já sabes POO e procuras um livro que aprofunde esse conhecimento, também pode não ser uma boa escolha. Para estes casos, pode te ser mais útil alguma referência sobre Projeto Orientado a Objetos, como um livro de Padrões de Projeto ou de Arquitetura de Sistemas.

Convenções

A seguir algumas convenções a respeito da abordagem, tipografia e layout.

Acrônimos

Algumas palavras e nomes aparecem abreviados, usando siglas ou acrônimos. Na primeira vez que forem exibidos constará o nome completo e no restante do livro (salvo exceções) é usado o acrônimo. Por exemplo, Programação Orientada a Objetos será abreviada como “POO”, assim como Orientação a Objetos será abreviada como “OO”.

Inglês

Este livro tem a proposta de proporcionar material técnico no nosso idioma. Entretanto, na área de desenvolvimento de softwares, o idioma inglês é predominante – frequentemente ele é inevitável. Por este motivo, termos e nomes amplamente conhecidos em inglês terão uma explicação em português, mas também serão apresentados na sua forma original (em inglês). É importante te habituares, pois mesmo que pareça estranho alguém dizer “dropa a tabela”, é o modo como as pessoas falam no ambiente de trabalho. É muito importante conhecer esse “dialeto”, por assim dizer, sobretudo em um livro que te prepara para o mundo do trabalho.

Códigos

Trechos de código são exibidos usando fonte de largura fixa. Em meio ao texto eles aparecem como “… usamos o método isFuture(Date):boolean para …”. As assinaturas de métodos são apresentadas como Classe.metodo(TipoArgumento):TipoRetorno, semelhante à notação UML.

Trechos mais extensos de código são apresentados em blocos com título, linhas numeradas (quando for necessário) e link para obter o fonte (quando estiver disponível). Por exemplo:

Exemplo de um Código de Exemplo
1 // Os códigos aparecerão em fonte de largura fixa e com comentários como este.
2 class UmaClasse {
3   String umAtributo = "";
4   String umMetodo(int umParametro) {
5     int umRetorno = umParametro * 2;
6     return this.umAtributo + umRetorno;
7   }
8   // ...    <-- reticências significa código omitido
9 }

Os comentários seguidos por reticências // ... significam código omitido, pois às vezes o código inteiro é muito longo para ser colocado na listagem. Nestes casos visite o link para acessá-lo na íntegra e ver o exemplo funcional completo.

Dicas, avisos, observações e milongas

O livro está cheio de quadros. A maioria está relacionado com questões da POO e quando ela está sendo empregada corretamente ou não.

Sobre o Autor

Atualmente sou Professor no IFRS e atuo nos cursos superior de Analise e Desenvolvimento de Sistemas e técnico em Informática para Internet.

Os alunos engraçadinhos perguntam: “professor, tu trabalha ou só dá aula?” (sic)

É a vida de quem ensina. Eu trabalho em sala de aula hoje. Ainda participo de projetos internos e dou uns pitacos em sistemas alheios (atividade conhecida como consultoria :).

Atrás disso, tenho uma história longa, passei por vários marcos na linha do tempo da evolução da computação e tecnologia em geral. Para me conheceres melhor vou contar um pouco dessa história no devaneio a seguir:

“Eu nasci a dez mil anos atrás”. Comecei programando em Basic, num CP500 da Prológica. Sem Internet, se aprendia lendo revistas técnicas, transcrevendo códigos e fazendo experiências. Mais tarde comecei a desenvolver aplicações comerciais com dBase e então Clipper, ambos sobre a plataforma MS-DOS. Joguei Prince of Persia, Wolfenstein e o primeiro DOOM - tinha que usar o DOS/4GW para liberar a memória estendida. Já montei meu próprio computador – quando se selecionava IRQ por jumpers/switches. Vivenciei a ascensão da interface gráfica - não aguentava mais ver caracteres em fósforo verde. Instalei o Windows 95 - malditos 13 disquetes. Tive um Kit Multimídia da Creative – e uma placa de vídeo Voodoo. Migrei meus sistemas de Clipper para Visual Basic e mais tarde Delphi. Usei a Internet quando ainda só existia HTML com “meia dúzia” de tags – nada de CSS ou JS. Acompanhei a ascensão da Internet e da Web. Presenciei o início do Linux, sua evolução e importância para a consolidação dos sistemas on-line – junto com Perl, Apache, MySQL, PHP, etc. Já instalei o Conectiva Linux, compilei o Kernel e aprendi a usar uma linha de comando de verdade. Comecei a programar em Java a partir da versão 1.3 – ainda sem enums, generics, autoboxing etc – e foi meu primeiro contato com a orientação a objetos – velhos hábitos procedimentais são difíceis de perder. Observei a Googlificação – mas usei o Cadê e o AltaVista. Acompanhei o crescimento do Comércio Eletrônico - e também o estouro da bolha da Internet.

Sou um programador que ensina e um professor que programa.

Boa leitura!