Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Traits - Criando Aplicações Sólidas

Traits - Criando Aplicações Sólidas

Como Traits ajudam a sua aplicação a atender os princípios S.O.L.I.D. ao implementar o require das classes.

Ricardo Coelho

June 25, 2014
Tweet

More Decks by Ricardo Coelho

Other Decks in Programming

Transcript

  1. S. O. L. I. D. PRINCÍPIOS • Single Responsibility •

    Open for Extension / Closed for Modification • Liskov Substitution (Strong Behavioral Subtyping) • Interface Segregation (KISS) • Dependency Inversion (interface, interface, interface)
  2. EXEMPLOS • Singleton • Log • O bom e velho

    Magic Setter/Getter • Qualquer coisa com Reflexion Reflexion
  3. LOG TRAIT <?php ! trait Log { public function log($message)

    { … } } ! class User { use Log; public function delete() { $this->log(‘Apagando usuário…’); …. } }
  4. TRAITS MÚLTIPLOS <?php ! trait Log { public function log($message)

    { … } } ! trait Email { public function sendMail($message) { … } } ! class User { use Log, Email; public function delete() { $this->log(‘Apagando usuário…’); $this->sendMail(‘Apagando usuário…’); …. } }
  5. TRAITS COMPOSTAS trait Log { public function log($message) { …

    } } ! trait Email { public function sendMail($message) { … } } ! trait LogAndSendEmail { use Log, Email; } ! class User { use LogAndSendEmail; public function delete() { $this->log(‘Apagando usuário…’); $this->sendMail(‘Apagando usuário…’); …. } }
  6. CONFLITOS <?php ! trait Log { public function log($message) {

    … } } ! trait Email { public function sendMail($message) { … } public function log($message) { … } } ! class User { use Log, Email { Log::log insteadof Email; } }
  7. VISIBILIDADE <?php ! trait Log { public function log($message) {

    … } } ! class User { use Log { log as protected; } }
  8. VISIBILIDADE COM ALIAS <?php ! trait Log { public function

    log($message) { … } } ! class User { use Log { log as private pvtLog; // log ainda vai existir e será público } }
  9. FUNÇÕES ESTÁTICAS <?php ! trait Log { public static function

    log($message) { … } } ! class User { use Log; } ! User::log(…);
  10. FUNÇÕES ABSTRATAS <?php ! trait Log { public function log($message)

    { echo $this->getPrefix() . $message; } abstract public function getPrefix(); } ! class User { use Log; public function getPrefix() { return ‘[User]: ’; } }
  11. MIXIN TRAITS <?php ! trait MixInTrait { public $x =

    1; } É possível implementar mixins usando traits. ! Cada classe que use esta trait terá uma instância distinta da propriedade (ao contrário da herança).