Na teoria, teoria e prática são a mesma coisa.
Na prática, não.
SOLID mão na massa
30 minutos
60 minutos
Programação orientada a objetos...
Abstração de um objeto do mundo real para o código.
Embrulha propriedades de uma classe.
Adaptabilidade.
Na biologia, plantas e animais tem com o intuito de sobrevivência.
Extremamente utilizada para a diminuição de código.
Single Responsibility Principle
Open-Closed Principle
Liskov Substitution Principle
Dependency Inversion Principle
Interface Segregation Principle
export class Pagamento {
nome = 'Rafael'
salario = 4000
horas = 40
pagar() {
const salario = this.salario * this.horas
return (`Pagando ${salario} para ${this.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar()
class Estagiario {
nome = 'Estudante'
salario = 2000
horas = 20
}
export class Pagamento {
pagar(funcionario: Estagiario) {
const salario = funcionario.salario * funcionario.horas
console.log(`Pagando ${salario} para ${funcionario.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar(new Estagiario())
class Estagiario {
nome = 'Dev Junior'
salario = 2000
horas = 20
}
export class Pagamento {
pagar(funcionario: Estagiario) {
const salario = funcionario.salario * funcionario.horas
console.log(`Pagando ${salario} para ${funcionario.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar(new Estagiario())
class Estagiario {
nome = 'Estudante'
salario = 20000
horas = 20
}
class Junior extends Estagiario {
nome = 'Dev Junior'
salario = 50000
horas = 40
}
export class Pagamento {
pagar(funcionario: Estagiario | Junior) {
const salario = funcionario.salario * funcionario.horas
return (`Pagando ${salario} para ${funcionario.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar(new Estagiario())
class Estagiario {
nome = 'Estudante'
salario = 20000
horas = 20
}
class Junior extends Estagiario {
nome = 'Dev Junior'
salario = 50000
horas = 40
}
export class Pagamento {
pagar(funcionario: Estagiario | Junior) {
const salario = funcionario.salario * funcionario.horas
return (`Pagando ${salario} para ${funcionario.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar(new Estagiario())
interface Pessoa {
nome: string
salario: number
horas: number
}
class Estagiario implements Pessoa {
nome = 'Estudante'
salario = 20000
horas = 20
}
class Junior implements Pessoa {
nome = 'Dev Junior'
salario = 50000
horas = 40
}
export class Pagamento {
pagar(pessoa: Pessoa) {
const salario = pessoa.salario * pessoa.horas
console.log(`Pagando ${salario} para ${pessoa.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar(new Estagiario())
pagamento.pagar(new Junior())
interface Pessoa {
nome: string
salario: number
horas: number
}
class Estagiario implements Pessoa {
nome = 'Estudante'
salario = 20000
horas = 20
}
class Junior implements Pessoa {
nome = 'Dev Junior'
salario = 50000
horas = 40
}
export class Pagamento {
pagar(pessoa: Pessoa) {
const salario = pessoa.salario * pessoa.horas
return (`Pagando ${salario} para ${pessoa.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar(new Estagiario())
pagamento.pagar(new Junior())
abstract class Pessoa {
abstract nome: string
abstract salario: number
abstract horas: number
abstract calculaSalario(): number
}
class Estagiario implements Pessoa {
nome = 'Estudante'
salario = 20000
horas = 20
calculaSalario() {
return this.salario * this.horas
}
}
class Junior implements Pessoa {
nome = 'Dev Junior'
salario = 50000
horas = 40
calculaSalario() {
return this.salario * this.horas
}
}
class Pleno implements Pessoa {
nome = 'Dev Pleno'
salario = 100000
horas = 40
calculaSalario() {
const bonus = this.salario * this.horas * 0.1
return (this.salario * this.horas) + bonus
}
}
export class Pagamento {
pagar(pessoa: Pessoa) {
const salario = pessoa.calculaSalario()
return (`Pagando ${salario} para ${pessoa.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar(new Estagiario())
pagamento.pagar(new Junior())
pagamento.pagar(new Pleno())
abstract class Pessoa {
abstract nome: string
abstract salario: number
abstract horas: number
abstract calculaSalario(): number
}
class Estagiario implements Pessoa {
nome = 'Estudante'
salario = 20000
horas = 20
calculaSalario() {
return this.salario * this.horas
}
}
class Junior implements Pessoa {
nome = 'Dev Junior'
salario = 50000
horas = 40
calculaSalario() {
return this.salario * this.horas
}
}
class Pleno implements Pessoa {
nome = 'Dev Pleno'
salario = 100000
horas = 40
calculaSalario() {
const bonus = this.salario * this.horas * 0.1
return (this.salario * this.horas) + bonus
}
}
export class Pagamento {
pagar(pessoa: Pessoa) {
const salario = pessoa.calculaSalario()
return (`Pagando ${salario} para ${pessoa.nome}`)
}
}
const pagamento = new Pagamento()
pagamento.pagar(new Estagiario())
pagamento.pagar(new Junior())
pagamento.pagar(new Pleno())
import { setDependency, useDependency } from "../ic"
abstract class Pessoa {
abstract nome: string
abstract salario: number
abstract horas: number
abstract calculaSalario(): number
}
abstract class Desenvolvedor extends Pessoa {
abstract nome: string
abstract salario: number
abstract horas: number
abstract calculaSalario(): number
abstract resolveProblema(): boolean
}
class Estagiario implements Desenvolvedor {
nome = 'Estudante'
salario = 20000
horas = 20
calculaSalario() {
return this.salario * this.horas
}
resolveProblema() {
return false
}
}
class Junior implements Desenvolvedor {
nome = 'Dev Junior'
salario = 50000
horas = 40
calculaSalario() {
return this.salario * this.horas
}
resolveProblema() {
return false
}
}
class Pleno implements Desenvolvedor {
nome = 'Dev Pleno'
salario = 100000
horas = 40
calculaSalario() {
const bonus = this.salario * this.horas * 0.1
return (this.salario * this.horas) + bonus
}
resolveProblema() {
return true
}
}
class Pagamento {
pagar(pessoa: Pessoa) {
const salario = pessoa.calculaSalario()
return (`Pagando ${salario} para ${pessoa.nome}`)
}
}
const devs: Record<string, Desenvolvedor> = {
estagiario: new Estagiario(),
junior: new Junior(),
pleno: new Pleno(),
}
setDependency(Desenvolvedor, Junior)
app.get('/devs', (req, res) => {
const dev = useDependency(Desenvolvedor)
res.json(dev)
})
app.get(`/pagamento/:dev`, (req, res) => {
const dev = devs[req.params.dev]
const pagamento = new Pagamento()
res.json({ message: pagamento.pagar(dev) })
})