9  POO e Módulos

Programação Orientada a Objetos (POO) ajuda a modelar o mundo real em código usando classes e objetos.

9.1 Conceitos básicos de POO

  • classe: molde para criar objetos;
  • objeto: instância da classe;
  • atributo: característica do objeto;
  • método: comportamento do objeto.

9.2 Criando uma classe

class Pessoa {
  constructor(nome, idade) {
    this.nome = nome
    this.idade = idade
  }

  apresentar() {
    return `Meu nome é ${this.nome} e tenho ${this.idade} anos.`
  }
}

const p1 = new Pessoa("Lia", 17)
console.log(p1.apresentar())

9.3 Encapsulando regras com métodos

class ContaEstudante {
  constructor(saldoInicial = 0) {
    this.saldo = saldoInicial
  }

  depositar(valor) {
    if (valor <= 0) return
    this.saldo += valor
  }

  sacar(valor) {
    if (valor > this.saldo) return "Saldo insuficiente"
    this.saldo -= valor
    return "Saque realizado"
  }
}

const conta = new ContaEstudante(100)
conta.depositar(50)
console.log(conta.sacar(30))
console.log(conta.saldo)

9.4 Herança

Herança permite reutilizar código de uma classe base.

class Pessoa {
  constructor(nome, idade) {
    this.nome = nome
    this.idade = idade
  }
}

class Aluno extends Pessoa {
  constructor(nome, idade, curso) {
    super(nome, idade)
    this.curso = curso
  }

  dados() {
    return `${this.nome} - ${this.curso}`
  }
}

const aluno = new Aluno("Rafa", 16, "Informática")
console.log(aluno.dados())

9.5 Polimorfismo (ideia prática)

Diferentes classes podem ter métodos com o mesmo nome e comportamentos específicos.

class Transporte {
  calcularTempo() {
    return "Tempo padrão"
  }
}

class Onibus extends Transporte {
  calcularTempo() {
    return "Tempo estimado: 25 min"
  }
}

class Bicicleta extends Transporte {
  calcularTempo() {
    return "Tempo estimado: 18 min"
  }
}

const opcoes = [new Onibus(), new Bicicleta()]
opcoes.forEach((item) => console.log(item.calcularTempo()))

9.6 Relembrando módulos ES

9.6.1 Export nomeado

matematica.js

export function somar(a, b) {
  return a + b
}

main.js

import { somar } from "./matematica.js"
console.log(somar(5, 7))

9.6.2 Export default

formatador.js

export default function formatarMoeda(valor) {
  return `R$ ${valor.toFixed(2)}`
}

app.js

import formatarMoeda from "./formatador.js"
console.log(formatarMoeda(35.5))

9.7 Exemplo integrado: classe + módulo

produto.js

export class Produto {
  constructor(nome, preco) {
    this.nome = nome
    this.preco = preco
  }

  aplicarDesconto(percentual) {
    this.preco -= this.preco * (percentual / 100)
  }
}

index.js

import { Produto } from "./produto.js"

const caderno = new Produto("Caderno", 30)
caderno.aplicarDesconto(10)
console.log(caderno)

9.8 Exercícios

  1. Crie uma classe Produto com nome, preço e método de desconto.
  2. Crie Funcionario e Professor usando herança.
  3. Crie uma classe RoteiroTuristico com método para calcular custo total.
  4. Separe funções em módulos e importe no arquivo principal.
  5. Desafio: combine uma classe com persistência em array de objetos.