Olá, estudante! Agora que você entendeu a diferença e as características de funções e procedimentos em nossa última lição, meu objetivo com essa lição é aprofundar o assunto sobre Programação Orientada a Objetos, visto inicialmente em nossa Lição 5 (Programação orientada a objetos: classes, herança e polimorfismo).
Com esse objetivo, os assuntos que irei abordar nesta lição são específicos e relacionados a classes e objetos. Você entenderá que as classes funcionam como moldes para a criação de objetos, suas formas de instanciação e como são criadas. Vamos explorar a ideia de atributos, que representam as características dos objetos, e como defini-los e a importância deles para representar o estado de um objeto. E finalizando nosso objetivo, irei abordar sobre os métodos, que representam o comportamento dos objetos, como defini-los e como eles são usados para realizar ações e operações com objetos.
Ao final desta lição, você terá uma compreensão sólida de como criar classes, definir atributos e métodos. Isso irá prepará-lo, enquanto técnico em desenvolvimento de sistemas, para desenvolver programas mais estruturados, reutilizáveis e eficientes, seguindo as melhores práticas da POO - Programação Orientada a Objetos. Vamos lá!
Uma das principais funcionalidades de um sistema de gerenciamento de uma biblioteca é a capacidade de rastrear informações sobre livros, como título, autor, ano de publicação, número de exemplares disponíveis e assim por diante. Então eu lhe pergunto: Como você organiza e gerencia todas essas informações de forma eficiente e lógica?
Classes, atributos e métodos entram em ação para resolver esse tipo de problema. Pois, você pode criar uma classe chamada "Livro" que representa a entidade "livro" em seu sistema e que teria atributos como "título", "autor", "ano de publicação" etc., e seus respectivos métodos para realizar ações como "emprestar" e "devolver". Além disso, você pode criar outras classes relacionadas, como "Usuario" para rastrear informações sobre usuários da biblioteca.
A situação do sistema de gerenciamento de uma biblioteca ilustra como classes, atributos e métodos na programação orientada a objetos são fundamentais para modelar e resolver problemas do mundo real. Eles fornecem uma maneira estruturada e eficaz de organizar e gerenciar informações e ações em sistemas de softwares complexos.
No case fictício de hoje, você conhecerá sobre uma empresa de varejo que enfrentou dificuldades no gerenciamento de seu estoque de produtos. Para resolver esse desafio, a empresa decidiu desenvolver um Sistema de Gerenciamento de Estoque (SGE) personalizado. Esse sistema permitiria o registro de informações sobre cada produto, como nome, categoria, preço e quantidade em estoque, e fornecedor. Além disso, possibilitaria o acompanhamento de vendas, compras de produtos e atualizações de estoque.
Foram criadas classes para representar as entidades principais, como Produto, Fornecedor e Venda. Cada classe tinha atributos que refletiam as informações relevantes para essas entidades. A classe Produto, por exemplo, tinha atributos como nome, categoria, preço e quantidade em estoque. A classe Venda, por sua vez, registrava atributos como a data da venda. Isso permitiu a organização e o armazenamento eficiente das informações. Continuando o desenvolvimento, foram definidos métodos para executar ações específicas, como a Classe Produto que tinha métodos para adicionar produtos ao estoque, atualizar informações do produto e registrar vendas e a classe Venda com métodos para calcular o valor total da venda e atualizar o estoque após uma venda.
O sistema resultante permitiu que a empresa acompanhasse facilmente o estoque de produtos, automatizasse tarefas de registro de vendas e compras e reduzisse erros humanos. Observe que a aplicação eficaz de classes, atributos e métodos simplificou a complexidade do gerenciamento de estoque, e tornou-o mais eficiente e preciso. Como resultado, a empresa economizou tempo e recursos, garantindo um melhor controle sobre suas operações de varejo.
Apenas para relembrar o que foi visto na Lição 5, irei falar sobre a Programação Orientada a Objetos (POO) que é um paradigma de programação que se baseia na criação de objetos para representar entidades, conceitos ou objetos do mundo real. Ela é amplamente utilizada na programação moderna devido à sua eficiência na modelagem de sistemas complexos e na promoção da reutilização de código.
Agora já entrando no objetivo desta lição em POO, objetos são instâncias específicas de classes, que são como moldes e que definem a estrutura e o comportamento dos objetos. As classes representam abstrações de entidades do mundo real, descrevendo seus atributos (dados ou estado) e métodos (comportamento).
Classes e objetos são conceitos fundamentais que desempenham papéis essenciais na criação de software. Uma classe é uma estrutura que atua como um molde ou modelo para criar objetos, sendo assim, ela define a estrutura e o comportamento que serão criados a partir dela. Segundo Furgeri (2014), os objetos compartilham duas características com objetos do mundo real: todos possuem um estado (conjunto de propriedades do objeto) e um comportamento (as ações possíveis do objeto).
Normalmente, uma classe é uma abstração de uma entidade do mundo real e contém os atributos (variáveis) para representar os dados dessa entidade e métodos (funções ou procedimentos) para definir o comportamento ou ações relacionadas a essa entidade. Sendo assim, ela serve como base para a criação de objetos e desempenha um papel semelhante ao de um plano de construção.
Para ilustrar, imagine um sistema de controle de uma loja de brinquedos. Agora, pense em um objeto "Brinquedo" dentro desse sistema. Considere os atributos associados a esse objeto, como código, nome, descrição e preço, bem como os métodos disponíveis, como localizar, incluir e excluir. Visualize como esses atributos e métodos se relacionam com as interações do usuário programador e com as funcionalidades do sistema como um todo. Observe esse exemplo de forma visual na Figura 1:
Na linguagem Java, conforme explicado por Furgeri (2014), uma classe engloba todos os seus atributos e métodos entre chaves. Os atributos podem ser de qualquer tipo de dado, enquanto os métodos consistem em blocos de código com funções específicas. Para ilustrar, consideremos o exemplo da classe "Brinquedo" mencionada anteriormente, conforme mostrado na Figura 2:
Nas linhas 1 e 56, declaramos a classe; nas linhas 2 a 5, declaramos os atributos codigo, nome, descricao e preco; nas linhas 7 a 37, implementamos os métodos getters e setters para cada um dos atributos, o GET para recuperar o valor do atributo pelo objeto que está instanciando a classe e o mesmo o SET para injetar valor para aquele referido atributo. Nas linhas 39 a 41, temos o método localizar (comportamento) um brinquedo informando o seu código e recebe um verdadeiro ou falso caso exista este estado (valores dos atributos). Das linhas 43 a 48, temos o método incluir que insere todos os valores do Brinquedo para cada atributo de uma só vez. E nas linhas 50 a 55 temos o método excluir que simula uma exclusão de um brinquedo.
Para o uso dessa classe, basta que você utilize o seguinte comando: Brinquedo b = new Brinquedo(); que significa que você criou um objeto chamado b que é do tipo da classe Brinquedo que recebeu uma nova instância baseada na classe Brinquedo. Ao usar new Brinquedo() estamos na verdade "chamando" o método construtor da classe Brinquedo que veremos a seguir. Além disso, podemos substituir os vários setters desta classe apenas incluindo um método construtor que também substituiria o método incluir conforme a Figura 03:
O código funciona basicamente como o da Figura 02 com a diferença que o método incluir foi substituído pelo método construtor (linhas 7 a 12) e foram removidos os setters, pois a partir de agora é possível a inserção de valores na instanciação do objeto Brinquedo através do comando: Brinquedo b2 = new Brinquedo(1, “brinquedo”, “descrição do brinquedo”, 30.50);
Como prometido lhe explicarei agora o que é o método construtor que no nosso caso é o new Brinquedo() na figura 2 e o new Brinquedo(1, “brinquedo”, “descrição do brinquedo”, 30.50); na figura 03. Ele é um método especial em uma classe e é usado para criar e inicializar objetos desta classe. Sua principal função é configurar os atributos de um objeto e realizar quaisquer outras ações necessárias quando um novo objeto é instanciado.
Os atributos representam as características ou propriedades de um objeto, assim, eles descrevem o estado de um objeto e o que ele é capaz de armazenar. Segundo Furgeri (2014), para armazenar o estado, um objeto de software utiliza uma ou diversas variáveis chamadas de atributos. Esses atributos são categorizados em atributos de instância que são propriedades que pertencem a instâncias específicas de uma classe. Cada objeto criado a partir da mesma classe terá seus próprios valores de atributos de instância, independentes dos outros objetos.
Por exemplo, se temos uma classe "Carro" com um atributo "cor", cada carro individual terá sua própria cor específica e atributos de classe, que são propriedades compartilhadas por todas as instâncias de uma classe. Esses atributos são declarados como estáticos e pertencem à classe em si, não a uma instância específica. Vale ressaltar que qualquer alteração em um atributo de classe afeta todas as instâncias da classe. Por exemplo, uma classe "Pessoa" pode ter um atributo de classe ‘quantidade de pessoas’ que é compartilhado por todas as instâncias dessa classe.
O que vimos nas Figuras 02 e 03 são todos atributos de instância enquanto um atributo de classe seria por exemplo: public static int quantidadeDeCarros = 0.
Os métodos representam o comportamento ou as ações que os objetos podem executar. Sendo assim, eles permitem que objetos interajam entre si e realizem tarefas específicas. Segundo Furgeri (2014), o comportamento do objeto é definido pelo conjunto de métodos que ele possui.
Assim como os atributos, também podemos categorizá-los em métodos de instância, que são associados a instâncias específicas de uma classe, ou seja, eles podem acessar e modificar os atributos de instância do objeto. Os métodos de instância são frequentemente usados para definir o comportamento de objetos individuais e os métodos de classe, que são métodos que pertencem à classe como um todo, não a instâncias individuais. Esses métodos são declarados como estáticos e não podem acessar ou modificar os atributos de instância. Além disso, os métodos de classe são úteis para realizar ações que não dependem do estado de um objeto específico.
Novamente fazendo analogia com o código da Figura 02 e 03, todos os métodos implementados são métodos de instância sendo a declaração de um método de classe como o public static void main(String[] args) { tão conhecido no java.
Um técnico em desenvolvimento precisa entender sobre classes, atributos e métodos porque são conceitos fundamentais na programação orientada a objetos, que é uma abordagem amplamente utilizada no desenvolvimento de software. Compreender esses conceitos permite que você crie sistemas mais organizados, modulares e reutilizáveis. As classes fornecem uma estrutura para representar objetos do mundo real, os atributos definem as características desses objetos e os métodos especificam o comportamento deles.
Dominar esses fundamentos capacita o técnico a projetar e implementar sistemas de software eficientes e escaláveis. No entanto, nada substitui a prática! Por isso, hoje você irá desenvolver um exemplo simples de um Sistema de Gerenciamento de Estoque (SGE) em Java com base no case fictício apresentado nesta lição. Para isso, utilizaremos o ambiente de desenvolvimento onlinegdb.
Siga o passo a passo da implementação:
Abra seu navegador web e acesse o site OnlineGDB em https://www.onlinegdb.com.
Escolha a linguagem de programação que deseja usar. Selecione “Java” na lista suspensa.
Renomeie o arquivo Main.java para Produto.java.
No editor de código, você pode escrever o código Java com implementação de funções e procedimentos conforme a Figura 04:
Segue algumas explicações sobre o código da Figura 04:
Linhas 1 e 16: Declaração da classe Produto em java com o uso de chaves para delimitar o início e o fim da classe.
Linhas 2 a 5: Declaração dos atributos (nome, categoria, preco e quantidadeEmEstoque) com seu modificador de acesso, tipo e nome.
Linhas 7 a 12: Implementação do método construtor da classe Produto que recebe como parâmetros: nome, categoria, preco e quantidadeEmEstoque e já atribui seus respectivos valores a seus atributos.
Linha 14: Comentário com sugestão de desafio para você em casa ou em sala de aula.
Linha 15: Comentário com sugestão de desafio para você em casa ou em sala de aula.
Na prática essa é a criação básica de uma classe, com seus atributos e seu método construtor. Agora fica como desafio para você fazer em casa, ou na aula junto com o professor, criar o Arquivo “Main.java” e começar a implementar a lógica do SGE. Criando objetos de produtos e vendas, atualizando informações e registrando vendas usando os métodos que você implementou nas classes Produto e Venda. Você pode usar instruções de saída, como System.out.println() para exibir informações e resultados na tela.
Esse foi um exemplo prático, mas você pode expandi-lo e adaptá-lo para atender às necessidades específicas do seu caso de uso. Lembre-se de que a programação orientada a objetos é uma abordagem poderosa para organizar e modelar sistemas complexos.
FURGERI, S. Programação Orientada a Objetos - Conceitos e técnicas. 1. São Paulo: ed. Érica | Saraiva, 2014.