Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Interfaces
Como objetos se comportam deveriam se comportar
Nelson Senna
• Github: https://github.com/nelsonsar
• Twitter: https://twitter.com/nelson_senna
• Tripda: https://tripda.c...
Motivação
Um pouco de teoria…
Assim como nós
humanos, sistemas se
comunicam
Apesar de ter variantes, a
comunicação de maneira simplista
se resume em passar uma
mensagem
Emissor -> Mensagem -> Receptor
Mas, para que a comunicação
seja bem sucedida o emissor
precisa ter prévio conhecimento
do receptor
Ou, em outras palavras o
receptor precisa ser capaz
receber a mensagem
“Hmm… Exemplo?”
<?php
class Teenager
{
public function listenToKatyPerry()
{
// Teenager knows this kinda of music
}
}
$teenager = new Teenager;
$teenager->listenToLedZeppelin();
// The line above outputs: Fatal error: Call to undefined metho...
A interface da classe Teenager
não contemplava o
comportamento de escutar Led
Zeppelin
Interfaces definem
comportamento
E possibilitam a comunicação, já
que mostram qual mensagens o
receptor pode receber
E como definir
interfaces?
Primeiro você tem
que respeitar as leis!
Uma interface deve fazer o que seu
método diz que faz
<?php
class FileReader
{
public function readLine()
{
$f = fopen('/tmp/file', 'w');
fputs($f, 'bullshit');
}
}
(╯°□°)╯︵ ┻━┻
A implementação de uma interface
não deve causar mal
<?php
class FileReader
{
public function readLine()
{
$f = fopen('/tmp/file', 'r');
$totalNumberOfBytes = filesize('/tmp/file...
(╯°□°)╯︵ ┻━┻
Uma interface tem que notificar
quem a chama se não conseguir
executar o que foi pedido
<?php
class FileReader
{
public function readLine()
{
$f = @fopen(‘/tmp/file', ‘r’);
if (!$f) return ‘’;
// code to read a ...
(╯°□°)╯︵ ┻━┻
Segundo, ela tem que
ser coesa*!
Os métodos nela devem
ter um conceito em
comum
<?php
interface FileReader
{
public function readLine();
public function sendEmail();
}
(╯°□°)╯︵ ┻━┻
Quantos métodos ela
tem que ter?
Depende…
Você prefere uma interface mínima
ou uma completa? Uma simples
ou complexa? Stateless ou
stateful?
Mínima
<?php
interface File
{
public function open();
public function read();
public function write();
public function close();
}
Completa
<?php
interface File
{
public function open();
public function read();
public function readLine();
public function readFro...
Mínima
<?php
interface ConnectionInterface
{
public beginTransaction()
public commit()
public excuteQuery($statement, array $para...
Completa
<?php
class PDO
{
public beginTransaction()
public commit()
public errorCode()
public errorInfo()
public exec($statement)
...
Simples
<?php
interface LegCostCalculator
{
public function calculate($leg);
}
Complexa
<?php
interface LegCostCalculator
{
public function calculateGasCostByDistance($leg);
public function calculateTollCost($l...
Stateful
<?php
interface File
{
public function open();
public function read();
public function write();
public function close();
}
Stateless
<?php
interface HttpClient
{
public function get($url);
public function post($url, array $params);
}
Herança e
composição
–Sandi Metz
“Duplication is far cheaper than the wrong
abstraction.”
Com interfaces eu posso criar
“papéis”. Combinações de
interfaces que definem uma classe
de objetos. De maneira explícita.
<?php
interface ReadableStream
{
public function read($bytes);
}
interface WritableStream
{
public function write($data);
...
<?php
class FileStream implements ReadableStream, WritableStream,
SeekableStream
{
public function read($bytes);
public fu...
Considerações finais
Dúvidas?
Fim
Upcoming SlideShare
Loading in …5
×

Interfaces - Como os objetos deveriam se comportar

645 views

Published on

Apresentação sobre interfaces de objetos baseada no livro de Ken Pugh. Conceitos de o que é e quais são suas funções bem como algumas classificações para as mesmas que o autor achou interessante (com exemplos em PHP).

Published in: Technology

Interfaces - Como os objetos deveriam se comportar

  1. 1. Interfaces Como objetos se comportam deveriam se comportar
  2. 2. Nelson Senna • Github: https://github.com/nelsonsar • Twitter: https://twitter.com/nelson_senna • Tripda: https://tripda.com.br • Membro do PHPSP • Moderador eventual do PHP Brasil no Facebook
  3. 3. Motivação
  4. 4. Um pouco de teoria…
  5. 5. Assim como nós humanos, sistemas se comunicam
  6. 6. Apesar de ter variantes, a comunicação de maneira simplista se resume em passar uma mensagem
  7. 7. Emissor -> Mensagem -> Receptor
  8. 8. Mas, para que a comunicação seja bem sucedida o emissor precisa ter prévio conhecimento do receptor
  9. 9. Ou, em outras palavras o receptor precisa ser capaz receber a mensagem
  10. 10. “Hmm… Exemplo?”
  11. 11. <?php class Teenager { public function listenToKatyPerry() { // Teenager knows this kinda of music } }
  12. 12. $teenager = new Teenager; $teenager->listenToLedZeppelin(); // The line above outputs: Fatal error: Call to undefined method Teenager::listenToLedZeppelin
  13. 13. A interface da classe Teenager não contemplava o comportamento de escutar Led Zeppelin
  14. 14. Interfaces definem comportamento
  15. 15. E possibilitam a comunicação, já que mostram qual mensagens o receptor pode receber
  16. 16. E como definir interfaces?
  17. 17. Primeiro você tem que respeitar as leis!
  18. 18. Uma interface deve fazer o que seu método diz que faz
  19. 19. <?php class FileReader { public function readLine() { $f = fopen('/tmp/file', 'w'); fputs($f, 'bullshit'); } }
  20. 20. (╯°□°)╯︵ ┻━┻
  21. 21. A implementação de uma interface não deve causar mal
  22. 22. <?php class FileReader { public function readLine() { $f = fopen('/tmp/file', 'r'); $totalNumberOfBytes = filesize('/tmp/file'); $numberOfReadBytes = 0; $line = ''; while ($totalNumberOfBytes != $numberOfReadBytes) { $byte = fgets($f, 1); if ($byte == PHP_EOL) return $line; $line .= $byte; } return $line; } }
  23. 23. (╯°□°)╯︵ ┻━┻
  24. 24. Uma interface tem que notificar quem a chama se não conseguir executar o que foi pedido
  25. 25. <?php class FileReader { public function readLine() { $f = @fopen(‘/tmp/file', ‘r’); if (!$f) return ‘’; // code to read a line } }
  26. 26. (╯°□°)╯︵ ┻━┻
  27. 27. Segundo, ela tem que ser coesa*!
  28. 28. Os métodos nela devem ter um conceito em comum
  29. 29. <?php interface FileReader { public function readLine(); public function sendEmail(); }
  30. 30. (╯°□°)╯︵ ┻━┻
  31. 31. Quantos métodos ela tem que ter?
  32. 32. Depende…
  33. 33. Você prefere uma interface mínima ou uma completa? Uma simples ou complexa? Stateless ou stateful?
  34. 34. Mínima
  35. 35. <?php interface File { public function open(); public function read(); public function write(); public function close(); }
  36. 36. Completa
  37. 37. <?php interface File { public function open(); public function read(); public function readLine(); public function readFrom($fromBytes); public function write(); public function writeLine(); public function close(); }
  38. 38. Mínima
  39. 39. <?php interface ConnectionInterface { public beginTransaction() public commit() public excuteQuery($statement, array $params) public rollBack() }
  40. 40. Completa
  41. 41. <?php class PDO { public beginTransaction() public commit() public errorCode() public errorInfo() public exec($statement) public getAttribute($attribute) public static getAvailableDrivers() public inTransaction() public lastInsertId($name = NULL) public prepare($statement, array $driver_options = array()) public query($statement) public quote($string, $parameter_type = PDO::PARAM_STR) public rollBack() public setAttribute($attribute, $value) }
  42. 42. Simples
  43. 43. <?php interface LegCostCalculator { public function calculate($leg); }
  44. 44. Complexa
  45. 45. <?php interface LegCostCalculator { public function calculateGasCostByDistance($leg); public function calculateTollCost($leg); public function calculateTripdaFee($leg); }
  46. 46. Stateful
  47. 47. <?php interface File { public function open(); public function read(); public function write(); public function close(); }
  48. 48. Stateless
  49. 49. <?php interface HttpClient { public function get($url); public function post($url, array $params); }
  50. 50. Herança e composição
  51. 51. –Sandi Metz “Duplication is far cheaper than the wrong abstraction.”
  52. 52. Com interfaces eu posso criar “papéis”. Combinações de interfaces que definem uma classe de objetos. De maneira explícita.
  53. 53. <?php interface ReadableStream { public function read($bytes); } interface WritableStream { public function write($data); } interface SeekableStream { public function seek($offset); }
  54. 54. <?php class FileStream implements ReadableStream, WritableStream, SeekableStream { public function read($bytes); public function write($data); public function seek($offset); }
  55. 55. Considerações finais
  56. 56. Dúvidas?
  57. 57. Fim

×