SlideShare une entreprise Scribd logo
1  sur  57
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances (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
 

Similaire à Interfaces - Como os objetos deveriam se comportar

Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01
joaocarlobarros
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 
PHP, mas o que é isso ?
PHP, mas o que é isso ?PHP, mas o que é isso ?
PHP, mas o que é isso ?
phpal
 

Similaire à 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
 

Plus de Nelson Senna do Amaral

Plus de 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
 

Dernier

Dernier (6)

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 

Interfaces - Como os objetos deveriam se comportar