interfaces - como os objetos deveriam se comportar

57
Interfaces Como objetos se comportam deveriam se comportar

Upload: nelson-senna-do-amaral

Post on 26-Jul-2015

128 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Interfaces - Como os objetos deveriam se comportar

InterfacesComo objetos se comportam deveriam se comportar

Page 2: Interfaces - Como os objetos deveriam se comportar

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

Motivação

Page 4: Interfaces - Como os objetos deveriam se comportar

Um pouco de teoria…

Page 5: Interfaces - Como os objetos deveriam se comportar

Assim como nós humanos, sistemas se

comunicam

Page 6: Interfaces - Como os objetos deveriam se comportar

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

Emissor -> Mensagem -> Receptor

Page 8: Interfaces - Como os objetos deveriam se comportar

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

Ou, em outras palavras o receptor precisa ser capaz

receber a mensagem

Page 10: Interfaces - Como os objetos deveriam se comportar

“Hmm… Exemplo?”

Page 11: Interfaces - Como os objetos deveriam se comportar

<?php

class Teenager { public function listenToKatyPerry() { // Teenager knows this kinda of music } }

Page 12: Interfaces - Como os objetos deveriam se comportar

$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

A interface da classe Teenager não contemplava o

comportamento de escutar Led Zeppelin

Page 14: Interfaces - Como os objetos deveriam se comportar

Interfaces definem comportamento

Page 15: Interfaces - Como os objetos deveriam se comportar

E possibilitam a comunicação, já que mostram qual mensagens o

receptor pode receber

Page 16: Interfaces - Como os objetos deveriam se comportar

E como definir interfaces?

Page 17: Interfaces - Como os objetos deveriam se comportar

Primeiro você tem que respeitar as leis!

Page 18: Interfaces - Como os objetos deveriam se comportar

Uma interface deve fazer o que seu método diz que faz

Page 19: Interfaces - Como os objetos deveriam se comportar

<?php

class FileReader { public function readLine() { $f = fopen('/tmp/file', 'w'); fputs($f, 'bullshit'); } }

Page 20: Interfaces - Como os objetos deveriam se comportar

(╯°□°)╯︵ ┻━┻

Page 21: Interfaces - Como os objetos deveriam se comportar

A implementação de uma interface não deve causar mal

Page 22: Interfaces - Como os objetos deveriam se comportar

<?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

(╯°□°)╯︵ ┻━┻

Page 24: Interfaces - Como os objetos deveriam se comportar

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

<?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

(╯°□°)╯︵ ┻━┻

Page 27: Interfaces - Como os objetos deveriam se comportar

Segundo, ela tem que ser coesa*!

Page 28: Interfaces - Como os objetos deveriam se comportar

Os métodos nela devem ter um conceito em

comum

Page 29: Interfaces - Como os objetos deveriam se comportar

<?php

interface FileReader { public function readLine(); public function sendEmail(); }

Page 30: Interfaces - Como os objetos deveriam se comportar

(╯°□°)╯︵ ┻━┻

Page 31: Interfaces - Como os objetos deveriam se comportar

Quantos métodos ela tem que ter?

Page 32: Interfaces - Como os objetos deveriam se comportar

Depende…

Page 33: Interfaces - Como os objetos deveriam se comportar

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

Mínima

Page 35: Interfaces - Como os objetos deveriam se comportar

<?php

interface File { public function open(); public function read(); public function write(); public function close(); }

Page 36: Interfaces - Como os objetos deveriam se comportar

Completa

Page 37: Interfaces - Como os objetos deveriam se comportar

<?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

Mínima

Page 39: Interfaces - Como os objetos deveriam se comportar

<?php

interface ConnectionInterface { public beginTransaction() public commit() public excuteQuery($statement, array $params) public rollBack() }

Page 40: Interfaces - Como os objetos deveriam se comportar

Completa

Page 41: Interfaces - Como os objetos deveriam se comportar

<?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

Simples

Page 43: Interfaces - Como os objetos deveriam se comportar

<?php

interface LegCostCalculator { public function calculate($leg); }

Page 44: Interfaces - Como os objetos deveriam se comportar

Complexa

Page 45: Interfaces - Como os objetos deveriam se comportar

<?php

interface LegCostCalculator { public function calculateGasCostByDistance($leg); public function calculateTollCost($leg); public function calculateTripdaFee($leg); }

Page 46: Interfaces - Como os objetos deveriam se comportar

Stateful

Page 47: Interfaces - Como os objetos deveriam se comportar

<?php

interface File { public function open(); public function read(); public function write(); public function close(); }

Page 48: Interfaces - Como os objetos deveriam se comportar

Stateless

Page 49: Interfaces - Como os objetos deveriam se comportar

<?php

interface HttpClient { public function get($url); public function post($url, array $params); }

Page 50: Interfaces - Como os objetos deveriam se comportar

Herança e composição

Page 51: Interfaces - Como os objetos deveriam se comportar

–Sandi Metz

“Duplication is far cheaper than the wrong abstraction.”

Page 52: Interfaces - Como os objetos deveriam se comportar

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

<?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

<?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

Considerações finais

Page 56: Interfaces - Como os objetos deveriam se comportar

Dúvidas?

Page 57: Interfaces - Como os objetos deveriam se comportar

Fim