🚀 Engenharia de Software

Orientação a Objetos (O.O.)

(Decifrando o DNA da UML e do Código Moderno)

👨‍🏫 Professor: Ricardo Pires
📚 Unidade III


🧬 O Paradigma de Orientação a Objetos

Antes da O.O., a humanidade programava de forma “Estruturada”. Imagine ler um livro de 5 mil páginas onde todas as regras de uma folha de pagamento corporativa estão escritas em uma única sequência de “Ifs” e “Loops”. Quando quebrava uma vírgula lá embaixo, a tela do usuário falhava lá em cima (O Caos Spaghetti 🍝).

O Paradigma O.O. (Iniciado nos anos 60 e popularizado nos 90 com Java) virou a mesa: Ele modela o software da mesma forma tridimensional que enxergamos o mundo real. Você não programa “Procedimentos”, você cria “Coisas” que conversam entre si.


🚘 1. Objeto vs Classe (O Molde vs A Matéria)

O programador novato confunde os dois diariamente!

  • CLASSE (O Molde Platônico): É a planta baixa invisível. A receita de bolo que o arquiteto escreve. A classe não ocupa espaço na rua.
    • Exemplo: A Classe CARRO. A classe determina que “todo carro deverá nascer com uma Cor e saber Acelerar”.
  • OBJETO (A Instância Física): É o carro de metal na sua garagem! É quando a Planta Baixa ganha matéria prima (memória RAM) do Computador.
    • Exemplo: O Objeto Corolla Prata da Placa ABC-1234.

🧬 O DNA Oculto de uma Classe

Toda classe que você constrói é obrigada a unir a biologia da programação: Dados + Ação.

  1. Atributos (A Anatomia / O que ele É): São os substantivos. Cor, chassi, Nome, CPF, Saldo Bancário.
  2. Métodos (A Contração Muscular / O que ele FAZ): São os verbos (sempre seguidos de parênteses). ligar(), frear(), comprarAcao(), emitirNotaFiscal().

(O Objeto encapsula a própria energia! Ele não precisa que o sistema cuide da velocidade dele, ele mesmo possui um método genético chamado acelerar()).


💻 Visualizando o Paradigma em Python

Veja como a Classe (O Molde) instiga o nascimento do Objeto (A Vida):

# 1. Eu crio A CLASSE Abstrata (O Molde da Fábrica)
class ClienteBancario:
    def __init__(self, nome, saldo_inicial):
        self.nome = nome          # Atributo
        self.saldo = saldo_inicial # Atributo
 
    def sacar(self, valor):       # Método (Verbo)
        if valor <= self.saldo:
            self.saldo -= valor
 
# 2. Eu dou VIDA aos Objetos (Instanciação na Memória RAM)
cliente1 = ClienteBancario("Ricardo", 5000)
cliente2 = ClienteBancario("Maria", 120000)

Eles coexistem independentes! Se Ricardo empobrecer, a Maria não sofre!


👁️ O Escudo do Encapsulamento (+ / -)

Na vida real, a fabricante do seu carro “esconde” o motor com um capô de aço, para que você não coloque a mão nas engrenagens (Dados sensíveis) e exploda o pistão. Você só acessa o carro através de uma “Interface” segura (O Volante e o Botão de Ligar).

Na O.O., protegemos variáveis do banco de dados para que Programadores não as alterem acidentalmente:

  • [ + ] Público: Acesso liberado (A Maçaneta da Porta).
  • [ # ] Protegida: Acesso apenas familiar (Acesso ao Cofre da Herança).
  • [ - ] Privada: Invisível ao mundo externo! (A lógica imutável do giro do motor. Ninguém de fora pode ver ou alterar a variável saldo_bancario).

🌳 2. Herança (Reciclagem Existencial)

Revolucionou a produtividade. É a capacidade de uma Classe Filha sugar Atributos e Métodos da Classe Mãe de graça!

Imagine que o Banco Santander decida criar “Conta Poupança” e “Conta Corrente”. Ambas possuem Titular, Agência e Conta. Sem a herança, o Dev copiaria e colaria mil linhas de código 2 vezes.

Com a Herança (É-UM):

  • A Mãe: [🏦 ContaBase] (Tem Agência, Numero e um método Sacar bruto).
  • O Filho RICO: [💰 ContaBlack] (Herda TUDO da mãe por genética, e só adiciona um recurso novo chamado ativarSalaVip()).

(Gera extrema manutenção limpa. Se um bug na Agência ocorrer, você conserta SÓ na Mãe, e as mil Filhas recebem a cura instantaneamente).


🗣️ QUIZ VERBAL: Usar ou não Herança?

Pergunta Filosófica de O.O.: O arquiteto da empresa está construindo um jogo eletrônico complexo. Ele já possui a poderosa classe Avião pronta. Hoje, ele precisa programar o inimigo do jogo, a classe Pássaro Mutante. Sabendo que ambos obrigatoriamente sabem voar através dos céus da tela (comportamento_de_voo()), o arquiteto pode fazer a Classe Avião HERDAR da Classe Pássaro Mutante apenas para economizar o tempo de copiar e colar a asa?


✅ RESPOSTA DO QUIZ

Catastroficamente Não! 🛑

A Falácia da Composição Curta: A Herança não existe para “economizar teclas do teclado de preguiça”. A Herança exige a regra estrita e ontológica do “IS A” (É UM). Todo Avião “É UM” Pássaro biológico? Não. Se você forçar essa herança falsa só para herdar as asas, amanhã o desenvolvedor que for debugar seu Avião vai descobrir chocado que o Airbus A320 possui atributos paternos sombrios escondidos como botarOvos() e terPenas(). A O.O. condena a má modelagem, indicando usar Interfaces.


🎭 3. Polimorfismo (A Ordem Única)

A jóia da coroa da O.O. (Poli = Muitas / Morfismo = Formas). É a capacidade mágica de eu mandar uma mesma ordem para mil objetos diferentes de uma família, e cada um executar a ordem “do seu próprio jeito único”.

No Código sem Polimorfismo: O sistema tenta falar com os animais:

if (animal == "Cachorro") { latir(); }
else if (animal == "Gato") { miar(); }
else if (animal == "Pato") { grasnar(); }

(Se eu adicionar 300 animais no Zoo, tenho que vir aqui refazer o If 300 vezes. Código duro!)


🎭 O Código Limpo do Polimorfismo

No Código COM Polimorfismo: A Classe Mãe (Animal) dita a lei genérica: “Todos tem que Falar”.

// O botão central do sistema grita:
animal_desconhecido.emitirSom(); 

O sistema não se interessa de qual classe filha é o animal em memória RAM!

  • Se o objeto naquele momento for o Cachorro, a RAM grita: “Au Au!“.
  • Se for o Pato, ele sobrescreve a Mãe e solta seu código particular: “Quack!“.

O polimorfismo delega inteligentemente a responsabilidade. O Sistema Mestre não é uma babá de Ifs!


📐 Matemática de O.O.: Métricas de Qualidade de Classe

Cientístas da computução criaram métricas objetivas para avaliar se uma hierarquia O.O. é saudável:

DIT — Depth of Inheritance Tree (Profundidade da Árvore de Herança):

| DIT | Avaliação | ||----------| | | Classe raíz (sem herdar nada) | | | ✅ Ideal: hierarquia enxuta e compreensível | | | ⚠️ Perigo! Hierarquia profunda demais — fragilidade e acoplamento extremo |

Uma classe com significa 8 níveis de herança acumulados. Alterar qualquer antepassado pode causar efeito dominante catastrófico em todos os filhos.


🗣️ QUIZ VERBAL: Polimorfismo vs If-Else

Cenário: Um sistema de pagamentos precisa processar 4 tipos de pagamento: Cartão de Crédito, Boleto, Pix e Criptomoeda. O Dev Jr. escreveu um método único com 4 if-else aninhados. O Dev Sênior gritou: “Isso é uma bomba relogião! Usa Polimorfismo!”

Explique: Por que o if-else aqui é problemático na persótica de manutenção? Como o Polimorfismo resolveria a situação quando um 5º método de pagamento (ex: Pagamento via QR Code NFC) for adicionado no futuro?


✅ RESPOSTA DO QUIZ FINAL

O if-else é um câncer de escala. O Polimorfismo é a cirurgia. 💉

Explicação:

  • Problema do if-else: A cada novo método de pagamento, o Dev precisa abrir e alterar o método central. Isso viola o Princípio Aberto/Fechado (OCP) do SOLID: classes devem estar fechadas para modificação e abertas para extensão.
  • Solução com Polimorfismo:
// Mãe abstrata define o contrato
abstract class Pagamento { abstract void processar(); }
// Nova forma de pagamento? Cria uma filha nova. Não toca em nada!
class PagamentoNFC extends Pagamento { void processar() { /* QR NFC */ } }

O sistema central chama pagamento.processar() sem saber qual filho está ali. Zero alteração no código existente!


🎯 Síntese de O.O. para Engenheiros

Modelar é destilar o negócio e colocar nas raízes da IDE.

  1. Esqueçam Rotinas longas de cima a baixo. Projetem Classes espertas e microscópicas para gerar Objetos vivos e instanciados na Servidor.
  2. Cerquem seus dados bancários sensíveis com Encapsulamento (-) Privado, forçando o mundo externo a bater na porta pública (Getters e Setters).
  3. Evitem refazer a roda sugando características ancestrais por Herança.
  4. Comandem frotas inteiras heterogêneas usando o Polimorfismo de métodos sobrepostos!