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

Evite singletons e estruturas estáticas em suas...

Evite singletons e estruturas estáticas em suas aplicações

Avatar for Rogério Zambon

Rogério Zambon

October 09, 2015

More Decks by Rogério Zambon

Other Decks in Programming

Transcript

  1. De uma forma simplista, orientação a objetos é uma forma

    de pensar sobre a construção de uma aplicação.
  2. O paradigma da orientação a objetos oferece uma série de

    princípios e conceitos que nos ajudam a pensar de acordo.
  3. Reusabilidade de código Maior nível de abstração Facilidade para modelar

    o domínio do problema Estado e comportamento resultam em objetos Encapsulamento Melhor organização do código Separação de responsabilidades Mantenabilidade Facilidade para evoluir o código em iterações
  4. Reusabilidade de código Maior nível de abstração Facilidade para modelar

    o domínio do problema Estado e comportamento resultam em objetos Encapsulamento Melhor organização do código Facilidade para evoluir o código em iterações Separação de responsabilidades Mantenabilidade
  5. Além de “esconder” os atributos e métodos em nossa classe,

    garantimos a integridade da identidade do objeto. Encapsulamento
  6. Getters e setters não tem relação alguma com encapsulamento! Ao

    contrário, eles o ajudam a violá-lo. Encapsulamento
  7. struct Date { int day; int month; int year; };

    int main (void) { struct Date today; today.day = 31; today.month = 07; today.year = 2014; }; C
  8. class Date { public $day; public $month; public $year; }

    $today = new Date(); $today->day = 31; $today->month = 07; $today->year = 2014; PHP
  9. Todo objeto que permite a alteração do estado através de

    atribuição de propriedades, chamamos de modelo anêmico. Encapsulamento
  10. Os comportamentos que possuíam a responsabilidade de trabalhar com seus

    atributos não mais a tem. métodos Encapsulamento
  11. Desta forma, as regas de negócios se espalham por toda

    a aplicação e manutenção disso tudo lhe manda um abraço :) Encapsulamento
  12. Pois, se tudo o que você precisa são dos dados

    para realizar algo dentro da sua aplicação, o modelo anêmico te ajuda com isso. Encapsulamento
  13. Encapsulamento Por outro lado, quando não permitimos a alteração do

    estado através de atribuição de propriedades, oferecendo um conjunto de comportamentos, chamamos de modelo rico.
  14. class Board { String board() { StringBuffer buf = new

    StringBuffer(); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { buf.append(data[i][j]); buf.append("\n"); } } return buf.toString(); } }
  15. class Board { String board() { collectRows(); } void collectRow()

    { for (int i = 0; i < 10; i++) collectRows(i); } void collectRows(int row) { for (int i = 0; i < 10; i++) this.buf.append(data[row][i]); this.buf.append("\n"); } }
  16. class Pessoal extends Animal { ... } Conseguimos obter os

    atributos e comportamentos Herança
  17. Métodos estáticos de uma classe não podem ser usados por

    uma instância e nunca são virtuais. Static
  18. Não podem ser sobrescritos, pois qualquer referência é resolvida através

    de early binding e não por late binding. Static
  19. Early binding se dá quando um método a ser invocado

    é definido durante a compilação da aplicação. Static
  20. Late binding se dá quando um método a ser invocado

    é definido em tempo de execução da aplicação. Static
  21. Atributos e métodos estáticos podem ser usados quando não existe

    dependência com o estado do objeto. Static
  22. Se na orientação a objetos trabalhamos com estado e comportamento

    – que resultando em objetos – como estruturas estáticas podem ser úteis?
  23. "Estou cada vez mais contra o uso de métodos de

    classe. Eles levam, muitas vezes, a programação procedural.” (Nick Sutterer) Static
  24. Em linhas gerais, este padrão oferece uma forma de garantir

    que existirá uma única instância de uma classe para sua aplicação. Singleton
  25. Alguns dizem que o padrão deveria se chamar globalton, anti-

    pattern. Singleton Kent Beck, Nat Pryce
  26. “How do you provide global variables in languages without global

    variables? Don't. Your programs will thank you for taking the time to think about design instead.” Singleton
  27. class Dumb { public static $instance; private function __construct() {

    // Não se esqueça que sou privado! :) } public static function getInstance() { if (is_null($instance)) { self::$instance = new Dumb(); } return self::$instance; } }
  28. class Dumb { public static $instance; private function __construct() {

    // Não se esqueça que sou privado! :) } public static function getInstance() { if (is_null($instance)) { self::$instance = new Dumb(); } return self::$instance; } }
  29. class Dumb { public static $instance; private function __construct() {

    // Não se esqueça que sou privado! :) } public static function getInstance() { if (is_null($instance)) { self::$instance = new Dumb(); } return self::$instance; } }
  30. class Dumb { public static $instance; private function __construct() {

    // Não se esqueça que sou privado! :) } public static function getInstance() { if (is_null($instance)) { self::$instance = new Dumb(); } return self::$instance; } }
  31. Uma classe, dentro de uma aplicação, é única e não

    pode ser sobrescrita em tempo de execução. Singleton
  32. Sendo assim, estes atributos são capazes de armazenar apenas um

    único estado, ou seja, uma única atribuição. Singleton
  33. Desta forma, há propagação de estado por toda sua aplicação

    através do uso deste padrão de projeto. Singleton
  34. E a única instância que será utilizada em sua aplicação

    possui estado único. Ou seja, é uma @#% $ completa! Singleton
  35. Manter uma suite de testes de unidade de um classe

    que implementa Singleton é terrível. Singleton
  36. Será necessário adaptações por todo lado, pois dependemos de como

    será devolvido no teste anterior. Singleton
  37. Se for necessário retornar novas instância de acordo com um

    exceção, por exemplo, este gerenciamento deve ser implementado por sua própria conta. Singleton
  38. class Client { private $_server; public Client($server) { $this->_server =

    $server; } public function procces($data) { $response = $this->_server->sendData($data); } }
  39. public function testProcces() { $server = $this->getMock("Server"); $client = new

    Client($server); $this->assertEquals(5, $client->process($params)); }
  40. A classe Server também poderá ser testada à nível de

    unidade sem as complicações “estáticas”.
  41. The shit has been planted! Injeção de dependência é uma

    excelente alternativa. Static e singleton?