Olá, estudante, tudo bem com você? Agora que você já se inteirou sobre o conceito de API's em back-end e programação orientada a eventos, chegou o momento de se encontrar com o paradigma da programação mais utilizado em aplicações back-end, a Programação Orientada a Objetos. Nosso objetivo nesta lição, dentro do paradigma, é tratar de uma introdução do conceito e quais seus pilares, vantagens e forma de se trabalhar, mas o foco principal será em classes, que são as estruturas fundamentais da Programação Orientada a Objetos, que irei me referir a partir de agora somente como POO. Uma classe pode ser definida como um conjunto de atributos (variáveis) e métodos (funções) que descrevem as características e comportamentos dos objetos que serão criados a partir dela. Elas servem como moldes para criar objetos, que, por sua vez, são instâncias dessas classes.
Irei lhe apresentar, também, o conceito de herança, que permite criar novas classes baseadas em outras já existentes, aproveitando seus atributos e métodos. A partir disso, a classe original é chamada de classe base ou superclasse, e a nova classe é chamada de classe derivada ou subclasse. Finalizarei a lição com a apresentação do conceito de polimorfismo, que é um conceito que permite que objetos de diferentes classes possam ser tratados de maneira uniforme, desde que compartilhem uma interface comum. Assim, é possível escrever um código mais genérico e flexível. Os dois tipos de polimorfismo são de sobrecarga e sobrescrita. Bem, este é o nosso objetivo para a lição de hoje! Vamos lá!
A herança é um conceito crucial na POO, que desempenha um papel fundamental na resolução de problemas computacionais complexos. Ela oferece uma maneira eficaz de reutilizar código, organizar hierarquias de classes e promover a extensibilidade do software. Para reforçar o que foi dito, considere o cenário de desenvolver um software para gerenciar uma biblioteca que possui diferentes tipos de materiais, como livros, revistas e DVDs, cada um com suas próprias propriedades e comportamentos específicos. Em vez de criar classes separadas para cada tipo de material, você pode utilizar a herança para resolver esse problema de forma mais eficiente.
Você poderia começar criando uma classe chamada “Material” que contém os atributos e métodos comuns a todos os tipos de materiais, como título, autor, data de publicação e método de empréstimo. Essa classe representa o nível mais abstrato da hierarquia.
Em seguida, você cria subclasses específicas para cada tipo de material, como “Livro”, “Revista”, e “DVD”. Cada uma dessas subclasses herdam os atributos e métodos da classe “Material” e adicionam suas próprias propriedades e comportamentos exclusivos. Por exemplo, a classe “Livro” pode ter um atributo adicional para o número de páginas e um método para calcular o tempo de leitura estimado. A POO, então, através da herança, resolve problemas computacionais ao permitir a criação de uma hierarquia de classes que compartilham código comum e estendem suas funcionalidades de maneira organizada, promovendo a reutilização, a modularidade e a flexibilidade do software.
Na lição de hoje, irei apresentar para você a TechPet Solutions, uma empresa que se dedica a desenvolver soluções tecnológicas inovadoras para donos de animais de estimação. Eles estão criando um software chamado “PetCare Hub” para auxiliar os proprietários de animais de estimação no gerenciamento de cuidados, saúde e atividades de seus animais. O software é construído com base em princípios de POO e utiliza intensivamente o polimorfismo para lidar com diferentes tipos de animais e suas necessidades únicas.
O “PetCare Hub” é um aplicativo que permite aos usuários registrarem informações sobre seus animais de estimação, agendar consultas veterinárias, rastrear vacinas, monitorar atividades físicas e muito mais. Para lidar com a diversidade de animais (cães, gatos, pássaros etc.) e suas particularidades, a equipe de desenvolvimento optou por utilizar o polimorfismo da seguinte maneira: foi criada uma classe base chamada “Animal” que contém os atributos e métodos comuns a todos os tipos de animais, como nome, idade e método de alimentação. Em seguida, eles criaram subclasses específicas para diferentes tipos de animais, como “Cão”, “Gato” e “Pássaro”.
O polimorfismo é aplicado por meio da definição de métodos polimórficos. Por exemplo, a classe base “Animal” possui um método chamado “fazerSom()” que é sobrescrito nas subclasses para reproduzir o som característico de cada tipo de animal. Isso permite que os objetos das subclasses sejam tratados de forma uniforme, mesmo quando são tipos diferentes de animais. Com isso, a TechPet Solutions, mesmo sendo uma empresa fictícia, demonstra como o polimorfismo em um software POO pode resolver problemas complexos e tratar objetos de diferentes classes de maneira uniforme.
Vamos compreender quais são os passos para que você, futuro desenvolvedor, consiga criar softwares semelhantes a esse?
A programação orientada a objetos (POO) é um paradigma de programação que se baseia na organização de código em torno de “objetos”, que representam entidades do mundo real ou conceitual. Sendo assim, podemos dizer que a POO oferece uma abordagem mais organizada, modular e reutilizável para o desenvolvimento de software.
Uma forma de olhar a POO muito interessante vem de Dall'oglio (2018), que define a orientação a objetos como um paradigma que representa uma filosofia para construção de sistemas. Na POO, utilizamos uma óptica mais próxima do mundo real, lidamos com objetos, que, por sua vez, são estruturas que carregam dados e comportamento próprio, além de trocarem mensagens entre si com o objetivo de formar algo maior, um sistema.
Antes de conceitualizar os termos específicos do objetivo desta lição, é importante ressaltar os pilares da Programação Orientada a Objetos, que são quatro conceitos fundamentais e servem como diretrizes para a criação e organização de sistemas orientados a objetos. Esses pilares são:
Encapsulamento: é o princípio de esconder os detalhes internos de um objeto e expor apenas uma interface bem definida para interagir com ele. Isso significa que os atributos e métodos internos de um objeto são protegidos e acessados apenas por meio de métodos públicos. O encapsulamento melhora a segurança, evita o acesso indevido aos dados e permite que a implementação interna de uma classe seja alterada sem afetar o código externo que a utiliza.
Abstração: é o processo de simplificar complexidades, representando objetos do mundo real em modelos conceituais dentro do programa. Isso envolve a criação de classes que capturam as características essenciais de um objeto e ocultam detalhes irrelevantes. A abstração permite que os programadores se concentrem nas características mais importantes de um objeto sem se preocupar com sua implementação interna.
Herança: de maneira simplificada, é o processo que permite criar novas classes (subclasses) a partir de classes existentes (superclasses). Contudo, esse pilar é um dos objetivos de nossa lição de hoje, portanto, será melhor explicado mais adiante.
Polimorfismo: basicamente significa “muitas formas” e refere-se à capacidade de diferentes classes serem tratadas como se fossem objetos de uma única classe comum. No entanto, esse também é um de nossos objetivos de hoje, sendo assim, ainda vamos nos aprofundar nele.
Esses quatro pilares – encapsulamento, abstração, herança e polimorfismo – são os princípios fundamentais que orientam a Programação Orientada a Objetos. Eles ajudam a criar sistemas mais organizados, flexíveis, reutilizáveis e de fácil manutenção, permitindo a você, Técnico em desenvolvimento de sistemas, criar um software complexo de maneira mais eficiente e eficaz.
Por algumas vezes já citei aqui a palavra "classe" e enfim chegou a hora de explicar para você o que significa de verdade esse termo dentro da POO.
Na POO, o uso de objetos é fundamental. Segundo Dall'oglio (2018), a criação de objetos requer, antes de mais nada, a formalização de sua estrutura, a qual determinará os atributos e comportamentos de cada objeto. Essa estrutura é conhecida como "classe".
Uma classe é um modelo – ou um “molde” – para criar objetos. Ela define suas características (atributos) e comportamentos (métodos) que os objetos de uma determinada classe terão. Por exemplo, em um sistema de gerenciamento de biblioteca, uma classe “Livro” pode ter atributos como título, autor e número de páginas, além de métodos como emprestar() e devolver(). Você pode conferir um exemplo básico de como ficaria codificada essa classe usando a linguagem de programação Java na Figura 1 a seguir:
A aplicação da orientação a objeto nos conduz para uma ordenação ampliada da estrutura de código-fonte, porém uma das principais vantagens que encontramos nessa abordagem é a reutilização. Dall'oglio (2018) cita que a possibilidade de reutilizar partes de código já definidas é o que nos dá mais agilidade, além de eliminar a necessidade de eventuais duplicações ou reescritas de código.
É um mecanismo que permite criar uma nova classe (subclasse), a partir de uma classe existente (superclasse). A subclasse, então, herda atributos e métodos da superclasse, podendo, também, adicionar novos atributos e métodos específicos. Isso promove a reutilização de código e a organização hierárquica de classes. Por exemplo, a classe “Romance” pode herdar da classe “Livro”, mantendo seus atributos específicos, como gênero literário.
Refere-se à capacidade de objetos de diferentes classes serem tratados como objetos de uma classe comum. Isso permite escrever um código que pode funcionar com diferentes tipos de objetos sem saber exatamente a classe específica do objeto. O polimorfismo é alcançado por meio de herança e interfaces, permitindo que diferentes classes implementem os mesmos métodos de maneira específica para elas. Por exemplo, diferentes tipos de animais (gato, cachorro, pássaro) podem implementar um método “fazerSom()”, mas de maneira distinta para cada animal.
Segundo Dall'oglio (2018), polimorfismo em orientação a objetos é o princípio que permite que classes derivadas de uma mesma superclasse tenham métodos iguais (com a mesma nomenclatura e os mesmos parâmetros), mas com comportamentos diferentes, redefinidos em cada uma das classes filhas (como também são chamadas as subclasses).
As situações/exemplos apresentados nos dois últimos itens estão sendo exemplificadas na prática no item saiba aplicar desta lição!
A Programação Orientada a Objetos (POO) oferece diversas vantagens, tornando-a um paradigma de programação amplamente utilizado. Algumas das principais vantagens da POO incluem:
Reutilização de código: classes e objetos podem ser reutilizados em diferentes partes do programa ou em projetos diferentes.
Organização: POO promove uma organização hierárquica e modular do código tornando-o mais compreensível e manutenível.
Abstração: a abstração permite modelar o mundo real de maneira mais precisa, simplificando a complexidade.
Encapsulamento: a encapsulação esconde os detalhes internos dos objetos, expondo apenas as interfaces necessárias.
No geral, pode-se dizer que a POO é um paradigma poderoso que fornece uma maneira eficaz de modelar, estruturar e desenvolver software. Classes, herança e polimorfismo são conceitos fundamentais que contribuem para a modularização, reutilização e flexibilidade do código, permitindo a criação de sistemas complexos de maneira mais organizada e eficiente.
Agora você irá codificar um pouco do software apresentado no case desta lição. Isso mesmo. Você irá criar a classe “Animal” e a Classe “Cão” com o método polimórfico “fazerSom()” utilizando a linguagem de programação Java. Então, vamos lá!
Acesse a plataforma Codiva.io clicando aqui. Ao acessar o site, clique no link “Try without login!” logo abaixo do botão laranja “Start coding now”. Você verá uma IDE on-line já com uma classe java HelloCodiva –, você poderá utilizá-la para execução do resultado de nossa aplicação. Portanto, deixe-a como está e clique no ícone de + para criar um novo arquivo que terá o nome de Animal. Uma vez criado você irá digitar o código da Figura 2:
Na sequência, você irá criar um novo arquivo, novamente clicando no ícone de + e agora irá chamá-lo Cao – se atente que é a palavra Cão, sem o acento til, pois nestes casos não se utiliza acentuação nas palavras – e irá digitar o código conforme a Figura 3:
Para finalizar, então, agora, você irá usar a primeira classe criada pelo Codiva chamada de HelloCodiva e irá implementar o código da Figura 4:
Com os 3 arquivos (classes) devidamente codificados, basta agora que você clique no botão “Run” para conferir o resultado de sua implementação com polimorfismo que deverá ser uma primeira linha com o texto “esse animal faz som” e uma segunda linha com o texto “esse animal late” mostrando que com a utilização da herança e o polimorfismo do método fazerSom() você trabalha com a hierarquia de classes de animais de maneira uniforme.
DALL'OGLIO, P. PHP Programando Com Orientação A Objetos. 4. ed. São Paulo: Novatec, 2018.