Skip to content

Instantly share code, notes, and snippets.

@sergiors
Last active December 25, 2017 23:34
Show Gist options
  • Save sergiors/2c79b09d1608e3aaad550a8e0585fbb7 to your computer and use it in GitHub Desktop.
Save sergiors/2c79b09d1608e3aaad550a8e0585fbb7 to your computer and use it in GitHub Desktop.
dog = new Dog()
// ...

// Não importa se é um Cão, Lobo ou Gato, apenas quero saber se vai latir.
// A medida que os requisitos mudarem, pode haver outras
// formas de latir, porém, esse trecho de código continuará operando
// 
// O que se deve levar em consideração é o que o método .bark() retorna,
// uma string ou um objeto/function? deve se pensar na abstração,
// pois não importa o paradigma, se variar o retorno, terá que dar manutenção
// igual no trecho seguinte..
// Sem uma abstração, quem garantirá que existirá o método .bark()?
function (Barkinterface bark) {
  // ...
}

Exemplo com PHP:

// Vamos imaginar que o array abaixo tem varios objetos, dentro dele: cães, gatos, cavalos,
// lobos e até pessoas, e gostaria de pegar apenas os que latem
$animals = [/*...*/];
$barkAnimals = array_filter($animals, function ($animal) {
  return $animal instanceof BarkableInterface;
});

// Neste ponto, eu tenho apenas animais que latem, além de `$animals`, não mutando os dados..
// Objetos são passados por referência, uma forma ainda melhor seria colocar:
// return clone $animal para evita que alguma modifição em objetos pertencente a $barkAnimals
// reflita em $animals
RobotInterface
drive()
AnimalInterface
poop()
FlyableInterface
fly()
BarkableInterface
bark()
MeowableInterface
meow()
KillableInterface
kill()
Meow : MeowableInterface
meow()
return 'Meow meow'
WoffBark : BarkableInterface
bark()
return 'Woff woff'
AuuBark : BarkableInterface
bark()
return 'Auuuu au au auuuu'
CrazyBark : BarkableInterface
bark()
return 'Muhuahuahua'
MuteBark : BarkableInterface
bark()
return
MurderRobot : RobotInterface : KillableInterface
drive()
return
kill()
return 'fuck off human!'
MurderRobotDog : MurderRobot : BarkableInterface
bark()
return new CrazyBark().bark()
Cat : MeowableInterface : AnimalInterface
construct(MeowableInterface meow = ?)
@meow = meow :? new Meow()
meow()
return @meow.meow()
poop()
return 'poop'
Dog : BarkableInterface : AnimalInterface
construct(BarkableInterface bark = ?)
@bark = bark :? new AuuBark()
bark()
return @bark.bark()
poop()
return 'poop'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment