JayCesar / generation-bootcamp

[💻 Bootcamp ] Um programa de estudos de 3 meses da Generation Brasil, sendo cada qual destinado a diferentes tecnologias.
4 stars 0 forks source link

Programação Orientada a Objetos (POO) - Parte 1 #14

Closed JayCesar closed 1 year ago

JayCesar commented 1 year ago

Programação Orientada a Objetos (POO)

É um Paradigma de Programação que ajuda a definir a estrutura de programas de computadores, baseado nos conceitos do mundo real, sejam eles Reais ou Abstratos. A ideia é simular as coisas que existem e acontecem no mundo real no mundo virtual.

1) Objetos

No mundo real, objetos podem ser animados ou inanimados, mas qualquer um deles possui características que podem ser classificadas como atributos ou comportamentos. Na imagem abaixo, vemos alguns exemplos de objetos: image

Modelar um Sistema baseado em Objetos traz algumas vantagens:

- Simplificação da concepção do sistema: a transição da realidade para o modelo é facilitada.

- Simplificação da compreensão do modelo: como o modelo é mais próximo da realidade, a compreensão do modelo por quem compreende o problema real é quase automática.

- Simplificação do Gerenciamento do sistema: assim como na realidade, os objetos são estáveis na solução de um problema, ou seja, os objetos mudam muito pouco; quando é necessário resolver problemas ligeiramente diferentes, modificamos a forma com que os objetos interagem e não os objetos em si.

1.1) O que são Objetos em Programação?

Objeto é uma Entidade caracterizada por um conjunto de operações e um estado, caracterizados por funções (chamados de Métodos) e campos (chamados de Atributos), podendo ainda ser compostos por outros Objetos (os Atributos podem ser Objetos de outras Classes).

Note que um objeto é uma estrutura similar à uma "estrutura de dados", porém, além de "dados", um objeto pode armazenar também "funções". Em um objeto os dados são chamados de Atributos e as funções são chamadas de Métodos.

Todo o Objeto possui 3 características fundamentais:

2) Classes

Classes são como pequenos programas, que podem ser considerados novos tipos de dados. Uma classe pode ser considerada como um "molde" de um Objeto, sendo uma descrição de como um objeto pode ser criado. Uma forma interessante de explicar é que uma classe está para um objeto assim como a planta de uma casa está para a casa.

image

É tipo assim: a classe do objeto Casa é planta, porque a planta define as características que a casa terá.

Repare que a classe em si é um conceito abstrato, como um molde, que se torna concreto e palpável através da criação de um objeto. Chamamos essa criação de Instanciação da Classe, como se estivesse usando a Classe como molde para criar vários Objetos.

image

Os Métodos são responsáveis por definir as ações que irão modificar e/ou interagir com os Atributos. image

⚠️ Atributos são identificados por substantivos e os Métodos são identificados por verbos.

2.1) Representação Gráfica

Para representar uma Classe graficamente na Orientação Objetos, utilizamos o Diagrama de Classes, que faz parte da UML - Unified Model Language. que é uma Linguagem de Modelagem Unificada para Sistemas Orientados a Objetos.

O Diagrama de Classes é organizado da seguinte forma: image

3) Modificadores

Os Modificadores merecem um tópico a parte. Os modificadores são palavras-chave da Linguagem Java, que servem para definir a visibilidade e algumas propriedades de uma Classe, Método ou Atributo.

As Classes possuem apenas 2 modificadores de acesso:

Modificador Descrição
padrão Uma Classe padrão ou friendly (identificado pela ausência de modificadores), poderá ser acessada por todas as Classes que estiverem no mesmo pacote.
public Uma Classe public poderá ser acessado por qualquer classe em qualquer pacote.

Modificadores de Acesso - Métodos e Atributos

Modificador Descrição UML
padrão Um Método ou Atributo padrão (identificado pela ausência de modificadores) poderá ser acessado por todas as classes que estiverem no mesmo pacote, que a classe que possui o Atributo.  
public Um Método ou Atributo public poderá ser acessado por qualquer classe em qualquer pacote. O acesso a um método só é permitido se você tiver primeiro acesso à classe (Pública). +
protected Um Método ou Atributo protected é protegido e pode ser chamado por todas as classes que compõe o pacote package. A grande diferença para o modificador padrão é que uma classe (mesmo que esteja fora do pacote), que estende a Classe com o Atributo ou o Método protected, ela terá acesso a ele, logo o acesso é por pacote e por herança. #
private Um Método ou Atributo private possui o acesso restrito. Somente a Classe que o definiu pode acessá-lo, ou seja, um método privado só poderá ser acessado dentro da classe que o definiu. -

image

Na tabela abaixo temos um resumo:

Modificador Classe Pacote Sub Classe Mundo / Módulo
public
protected
padrão
private

3.1) Modificadores Non-Access

O modificador Non-Access permite especificar algumas propriedades específicas de uma Classe, Método ou Atributo, determinando como as Classes que herdarão uma Classe, Método ou Atributo, podem ou não instanciar uma Classe, redefinir e/ou alterar um Método ou Atributo.

As Classes possuem apenas 2 modificadores Non-Access:

Modificador Descrição
abstract Uma classe abstrata não pode ser usada para criar objetos, ou seja, instanciar objetos de forma direta. Para acessar uma classe abstrata, ela deve ser herdada por outra classe e instanciada por meio desta herança.
final Uma Classe final não pode ser Herdada (estendida) por outra Classe.

Modificadores Non-Access - Métodos

Modificador Descrição
abstract Um método abstrato não implementa nenhuma funcionalidade, somente assina o método e faz com que a primeira subclasse concreta seja obrigada a implementar o método. Uma classe que possua um método abstrato deve obrigatoriamente ser abstrata.
final Um método final define que ele não pode ser sobrescrito e/ou modificado.
static Um método static é um método da Classe, ou seja, são métodos que não dependem de um Objeto, quando eles são invocados, executam uma função sem a dependência de um objeto ou instância de uma classe, conseguindo chamar direto qualquer Método da classe.

Modificadores Non-Access - Atributos

final Um atributo final é uma constante, ou seja, não pode ser modificado.
static Um atributo static é um atributo da Classe, ou seja, não dependem de um Objeto ou instância de uma classe.

4) Métodos Especiais: Métodos Cosntrutor, Getters and Setters

Ao construirmos nossas Classes como modelo para construção de Objetos, precisamos implementar alguns Métodos especiais:

Método Construtor

Para criar (instanciar) um novo Objeto de uma Classe, precisamos implementar um Método para gerar este novo Objeto. O Método responsável por esta tarefa em uma Classe é o Método Construtor.

Um Método Construtor é um Método especial, definido para cada classe. Entre as suas principais características, podemos destacar:

Métodos Get e Set

Os métodos GET e SET são técnicas padronizadas para gerenciamento sobre o acesso dos atributos. Nesses métodos determinamos quando será alterado um atributo e o acesso ao mesmo, tornando o controle e as modificações mais práticas e limpas, sem a necessidade de alterar a assinatura do método usado para acessar o atributo. Estes Métodos são essenciais porquê os Atributos da Classe são privados e portanto só podem ser manipuladas por estes métodos da classe.

Métodos SET

Os métodos SET servem para modificar os atributos. Eles são chamados de setters. Se o nome do atributo é nome, o nome do setter será setIdade( int idade). Entre parênteses devemos indicar o novo valor desejado para o atributo (parâmetro). É recomendado que o setter valide os novos valores para variáveis de instância, inclusive retornando um valor ou mensagem para indicar que os dados são inválidos.

5) Encapsulamento

Encapsular, nada mais é do que proteger os atributos de uma classe de acesso externo, permitindo somente sua manipulação de forma indireta.

Encapsular os dados de uma aplicação significa evitar que estes sofram acessos indevidos. Para isso, é criada uma estrutura que contém métodos que podem ser utilizados por qualquer outra classe, sem causar inconsistências no desenvolvimento de um código.

Na prática, isso é feito por meio de dois métodos: os getters e os setters, que forma vistos no tópico anterior. Os Métodos getters tem por objetivo retornar o valor que lhe foi pedido, mas de forma a não prejudicar a integridade do dado em si, enquanto os Métodos setters recebem como argumento uma informação, que pode ser qualquer tipo de dado suportados pela linguagem. Dessa forma, não haverá o risco de ocorrerem acessos indevidos. Veja o exemplo abaixo:

Na Classe Conta, além dos Métodos Construtor, Getters e Setters, nós vamos criar um Método para sacar um valor da conta. Se os atributos puderem ser acessados diretamente em qualquer trecho do código, haverá o risco de o saldo ser alterado sem passar pelo método sacar(). Para evitar isso, podemos usar os métodos get e set para evitar o acesso direto. Logo, para proteger os atributos da Classe, principalmente o saldo, utilizamos os métodos get saldo e set saldo.

Quais as vantagens de encapsular? Com base no fato de que o encapsulamento evita o acesso indevido a alguns tipos de dados, diversas vantagens podem ser notadas, entre elas podemos destacar:

- Manutenção de código: Com o encapsulamento, isso passa a ser mais fácil, uma vez que, com a devida proteção de acesso aos dados, a pessoa desenvolvedora achará mais rápido algum ponto onde o código precisa ser melhorado. Sem o encapsulamento, seria bem difícil encontrar os pontos de inconsistência do código.

- Reuso de código: Com o encapsulamento, o programa terá mais chances de ter o código reaproveitado em outros projetos, poupando bastante tempo da equipe de desenvolvimento.

- Desenvolvimento acelerado e simplificado: O encapsulamento transforma a implementação de alguns códigos em uma espécie de caixa preta. Na prática, isso significa que as classes externas não precisam acessar alguns dados de forma direta. Assim, o desenvolvimento dos sistemas passa a ficar simplificado e acelerado.


Minhas anotações

O peradigma POO existe - como se fosse uma regra. Cada gorverno, ou seja, cada linguagem, aplica essa regra de acroda com seus próprios moldes.