🚀 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”.
- Exemplo: A Classe
- 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.
- Exemplo: O Objeto
🧬 O DNA Oculto de uma Classe
Toda classe que você constrói é obrigada a unir a biologia da programação: Dados + Ação.
- Atributos (A Anatomia / O que ele É): São os substantivos. Cor, chassi, Nome, CPF, Saldo Bancário.
- 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ávelsaldo_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 chamadoativarSalaVip()).
(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.
- Esqueçam Rotinas longas de cima a baixo. Projetem Classes espertas e microscópicas para gerar Objetos vivos e instanciados na Servidor.
- Cerquem seus dados bancários sensíveis com Encapsulamento (-) Privado, forçando o mundo externo a bater na porta pública (Getters e Setters).
- Evitem refazer a roda sugando características ancestrais por Herança.
- Comandem frotas inteiras heterogêneas usando o Polimorfismo de métodos sobrepostos!