Objetos Litúrgicos Usados en la Iglesia Objetos y Términos ...
Interfaces - Como os objetos deveriam se comportar
-
Upload
nelson-senna-do-amaral -
Category
Technology
-
view
126 -
download
0
Transcript of Interfaces - Como os objetos deveriam se comportar
![Page 1: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/1.jpg)
InterfacesComo objetos se comportam deveriam se comportar
![Page 2: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/2.jpg)
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
![Page 3: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/3.jpg)
Motivação
![Page 4: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/4.jpg)
Um pouco de teoria…
![Page 5: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/5.jpg)
Assim como nós humanos, sistemas se
comunicam
![Page 6: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/6.jpg)
Apesar de ter variantes, a comunicação de maneira simplista
se resume em passar uma mensagem
![Page 7: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/7.jpg)
Emissor -> Mensagem -> Receptor
![Page 8: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/8.jpg)
Mas, para que a comunicação seja bem sucedida o emissor
precisa ter prévio conhecimento do receptor
![Page 9: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/9.jpg)
Ou, em outras palavras o receptor precisa ser capaz
receber a mensagem
![Page 10: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/10.jpg)
“Hmm… Exemplo?”
![Page 11: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/11.jpg)
<?php
class Teenager { public function listenToKatyPerry() { // Teenager knows this kinda of music } }
![Page 12: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/12.jpg)
$teenager = new Teenager; $teenager->listenToLedZeppelin(); // The line above outputs: Fatal error: Call to undefined method Teenager::listenToLedZeppelin
![Page 13: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/13.jpg)
A interface da classe Teenager não contemplava o
comportamento de escutar Led Zeppelin
![Page 14: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/14.jpg)
Interfaces definem comportamento
![Page 15: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/15.jpg)
E possibilitam a comunicação, já que mostram qual mensagens o
receptor pode receber
![Page 16: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/16.jpg)
E como definir interfaces?
![Page 17: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/17.jpg)
Primeiro você tem que respeitar as leis!
![Page 18: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/18.jpg)
Uma interface deve fazer o que seu método diz que faz
![Page 19: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/19.jpg)
<?php
class FileReader { public function readLine() { $f = fopen('/tmp/file', 'w'); fputs($f, 'bullshit'); } }
![Page 20: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/20.jpg)
(╯°□°)╯︵ ┻━┻
![Page 21: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/21.jpg)
A implementação de uma interface não deve causar mal
![Page 22: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/22.jpg)
<?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; } }
![Page 23: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/23.jpg)
(╯°□°)╯︵ ┻━┻
![Page 24: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/24.jpg)
Uma interface tem que notificar quem a chama se não conseguir
executar o que foi pedido
![Page 25: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/25.jpg)
<?php
class FileReader { public function readLine() { $f = @fopen(‘/tmp/file', ‘r’);
if (!$f) return ‘’;
// code to read a line } }
![Page 26: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/26.jpg)
(╯°□°)╯︵ ┻━┻
![Page 27: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/27.jpg)
Segundo, ela tem que ser coesa*!
![Page 28: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/28.jpg)
Os métodos nela devem ter um conceito em
comum
![Page 29: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/29.jpg)
<?php
interface FileReader { public function readLine(); public function sendEmail(); }
![Page 30: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/30.jpg)
(╯°□°)╯︵ ┻━┻
![Page 31: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/31.jpg)
Quantos métodos ela tem que ter?
![Page 32: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/32.jpg)
Depende…
![Page 33: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/33.jpg)
Você prefere uma interface mínima ou uma completa? Uma simples
ou complexa? Stateless ou stateful?
![Page 34: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/34.jpg)
Mínima
![Page 35: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/35.jpg)
<?php
interface File { public function open(); public function read(); public function write(); public function close(); }
![Page 36: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/36.jpg)
Completa
![Page 37: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/37.jpg)
<?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(); }
![Page 38: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/38.jpg)
Mínima
![Page 39: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/39.jpg)
<?php
interface ConnectionInterface { public beginTransaction() public commit() public excuteQuery($statement, array $params) public rollBack() }
![Page 40: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/40.jpg)
Completa
![Page 41: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/41.jpg)
<?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) }
![Page 42: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/42.jpg)
Simples
![Page 43: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/43.jpg)
<?php
interface LegCostCalculator { public function calculate($leg); }
![Page 44: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/44.jpg)
Complexa
![Page 45: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/45.jpg)
<?php
interface LegCostCalculator { public function calculateGasCostByDistance($leg); public function calculateTollCost($leg); public function calculateTripdaFee($leg); }
![Page 46: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/46.jpg)
Stateful
![Page 47: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/47.jpg)
<?php
interface File { public function open(); public function read(); public function write(); public function close(); }
![Page 48: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/48.jpg)
Stateless
![Page 49: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/49.jpg)
<?php
interface HttpClient { public function get($url); public function post($url, array $params); }
![Page 50: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/50.jpg)
Herança e composição
![Page 51: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/51.jpg)
–Sandi Metz
“Duplication is far cheaper than the wrong abstraction.”
![Page 52: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/52.jpg)
Com interfaces eu posso criar “papéis”. Combinações de
interfaces que definem uma classe de objetos. De maneira explícita.
![Page 53: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/53.jpg)
<?php
interface ReadableStream { public function read($bytes); }
interface WritableStream { public function write($data); }
interface SeekableStream { public function seek($offset); }
![Page 54: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/54.jpg)
<?php
class FileStream implements ReadableStream, WritableStream, SeekableStream { public function read($bytes); public function write($data); public function seek($offset); }
![Page 55: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/55.jpg)
Considerações finais
![Page 56: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/56.jpg)
Dúvidas?
![Page 57: Interfaces - Como os objetos deveriam se comportar](https://reader030.fdocuments.in/reader030/viewer/2022032716/55b3c83cbb61ebc0548b46af/html5/thumbnails/57.jpg)
Fim