SlideShare a Scribd company logo
1 of 57
Download to read offline
Interfaces
Como objetos se comportam 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
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 method
Teenager::listenToLedZeppelin
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');
$numberOfReadBytes = 0;
$line = '';
while ($totalNumberOfBytes != $numberOfReadBytes) {
$byte = fgets($f, 1);
if ($byte == PHP_EOL) return $line;
$line .= $byte;
}
return $line;
}
}
(╯°□°)╯︵ ┻━┻
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 line
}
}
(╯°□°)╯︵ ┻━┻
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 readFrom($fromBytes);
public function write();
public function writeLine();
public function close();
}
Mínima
<?php
interface ConnectionInterface
{
public beginTransaction()
public commit()
public excuteQuery($statement, array $params)
public rollBack()
}
Completa
<?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)
}
Simples
<?php
interface LegCostCalculator
{
public function calculate($leg);
}
Complexa
<?php
interface LegCostCalculator
{
public function calculateGasCostByDistance($leg);
public function calculateTollCost($leg);
public function calculateTripdaFee($leg);
}
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);
}
interface SeekableStream
{
public function seek($offset);
}
<?php
class FileStream implements ReadableStream, WritableStream,
SeekableStream
{
public function read($bytes);
public function write($data);
public function seek($offset);
}
Considerações finais
Dúvidas?
Fim

More Related Content

What's hot

What's hot (9)

Minicurso PHP básico
Minicurso PHP básicoMinicurso PHP básico
Minicurso PHP básico
 
Linguagem PHP
Linguagem PHPLinguagem PHP
Linguagem PHP
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHP
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sério
 
Programação Web com PHP 7.x
Programação Web com PHP 7.xProgramação Web com PHP 7.x
Programação Web com PHP 7.x
 
Guia php
Guia phpGuia php
Guia php
 

Similar to Interfaces - Como os objetos deveriam se comportar

Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01joaocarlobarros
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHPAugusto das Neves
 
Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Jonata Weber
 
O Aduino ama a Internet - TDC 2012
O Aduino ama a Internet - TDC 2012O Aduino ama a Internet - TDC 2012
O Aduino ama a Internet - TDC 2012Marco Antonio Maciel
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
15 coisas sobre php para saber antes de morrer
15 coisas sobre php para saber antes de morrer15 coisas sobre php para saber antes de morrer
15 coisas sobre php para saber antes de morrerMichele Silva
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012Luís Cobucci
 
PHP, Presente e Futuro
PHP, Presente e FuturoPHP, Presente e Futuro
PHP, Presente e FuturoFreedom DayMS
 
Curso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoCurso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoLuiz Junior
 
PHP, mas o que é isso ?
PHP, mas o que é isso ?PHP, mas o que é isso ?
PHP, mas o que é isso ?phpal
 
M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Webdiogoa21
 

Similar to Interfaces - Como os objetos deveriam se comportar (20)

Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
 
Apresentação faef
Apresentação faefApresentação faef
Apresentação faef
 
Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)
 
Apresentação faef
Apresentação faefApresentação faef
Apresentação faef
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem Python
 
O Aduino ama a Internet - TDC 2012
O Aduino ama a Internet - TDC 2012O Aduino ama a Internet - TDC 2012
O Aduino ama a Internet - TDC 2012
 
Zephir
ZephirZephir
Zephir
 
PHP(I-Bim).ppt
PHP(I-Bim).pptPHP(I-Bim).ppt
PHP(I-Bim).ppt
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
15 coisas sobre php para saber antes de morrer
15 coisas sobre php para saber antes de morrer15 coisas sobre php para saber antes de morrer
15 coisas sobre php para saber antes de morrer
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012
 
PHP, Presente e Futuro
PHP, Presente e FuturoPHP, Presente e Futuro
PHP, Presente e Futuro
 
Security & PHP
Security & PHPSecurity & PHP
Security & PHP
 
Curso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoCurso de PHP Básico ao Avançado
Curso de PHP Básico ao Avançado
 
PHP, mas o que é isso ?
PHP, mas o que é isso ?PHP, mas o que é isso ?
PHP, mas o que é isso ?
 
PHP Presente e Futuro
PHP Presente e FuturoPHP Presente e Futuro
PHP Presente e Futuro
 
Linguagem PHP
Linguagem PHPLinguagem PHP
Linguagem PHP
 
M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Web
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 

More from Nelson Senna do Amaral

More from Nelson Senna do Amaral (10)

Veni vedi vici.
Veni vedi vici.Veni vedi vici.
Veni vedi vici.
 
Pague o aluguel
Pague o aluguelPague o aluguel
Pague o aluguel
 
Dando nome aos códigos
Dando nome aos códigosDando nome aos códigos
Dando nome aos códigos
 
Melhorando seu código com Law of Demeter e Tell don't ask
Melhorando seu código com Law of Demeter e Tell don't askMelhorando seu código com Law of Demeter e Tell don't ask
Melhorando seu código com Law of Demeter e Tell don't ask
 
OOP: Princípios e Padroes
OOP: Princípios e PadroesOOP: Princípios e Padroes
OOP: Princípios e Padroes
 
Ruby Gotchas
Ruby GotchasRuby Gotchas
Ruby Gotchas
 
Domínio: Dividir e conquistar
Domínio: Dividir e conquistarDomínio: Dividir e conquistar
Domínio: Dividir e conquistar
 
Nossa experiência com TDD
Nossa experiência com TDDNossa experiência com TDD
Nossa experiência com TDD
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
Tirando o coelho da cartola: integrando sistemas com RabbitMQ
Tirando o coelho da cartola: integrando sistemas com RabbitMQTirando o coelho da cartola: integrando sistemas com RabbitMQ
Tirando o coelho da cartola: integrando sistemas com RabbitMQ
 

Interfaces - Como os objetos deveriam se comportar