Sua aplicação não é filha de um framework
Dev In Company 2014
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”
Sobre mim...
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”- Programador há “um tanto” de tempo (+10 anos)
Sobre mim...
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”- Programador há “um tanto” de tempo (+10 anos)- APAIXONADO por Arquitetura de Software
Sobre mim...
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”- Programador há “um tanto” de tempo (+10 anos)- APAIXONADO por Arquitetura de Software- Músico, Produtor, DJ… essas coisas aí.
Sobre mim...
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”- Programador há “um tanto” de tempo (+10 anos)- APAIXONADO por Arquitetura de Software- Músico, Produtor, DJ… essas coisas aí.- @yourwebmaker
Sobre mim...
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”- Programador há “um tanto” de tempo (+10 anos)- APAIXONADO por Arquitetura de Software- Músico, Produtor, DJ… essas coisas aí.- @yourwebmaker (só escrevo besteira)
Sobre mim...
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”- Programador há “um tanto” de tempo (+10 anos)- APAIXONADO por Arquitetura de Software- Músico, Produtor, DJ… essas coisas aí.- @yourwebmaker (só escrevo besteira)- fb.com/dlpinheiro
Sobre mim...
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”- Programador há “um tanto” de tempo (+10 anos)- APAIXONADO por Arquitetura de Software- Músico, Produtor, DJ… essas coisas aí.- @yourwebmaker (só escrevo besteira)- fb.com/dlpinheiro
Sobre mim...
- Daniel Lima dos Anjos Pinheiro, a.k.a “Tonho da Lua”- Programador há “um tanto” de tempo (+10 anos)- APAIXONADO por Arquitetura de Software- Músico, Produtor, DJ… essas coisas aí.- @yourwebmaker (só escrevo besteira)- fb.com/dlpinheiro
Sobre mim...
- Maior site de cifras do Brasil- 560mil visitas diárias- Projeto de 18 anos e…. crescendo!
- Código legado em alguns lugares- Código espalhado- “Feito em casa”- Despadronizado- Difícil de manter
Vamos usar um framework!
Full-stack- Zend- Symfony- Cake- Laravel- Phalcon- “um tanto”
Qual iríamos usar?
Full-stack- Zend- Symfony- Cake- Laravel- Phalcon- “um tanto”
Qual iríamos usar?
Micro- Silex- Respect- Slim- Aura- Flight- “um tanto”
Phalcon
Phalcon
Prós- Extension do PHP- Compilado- Alta performance- Baixo consumo de memória- Responde a um grande número de reqs/s
Phalcon
Phalcon
Phalcon
Phalcon
PhalconContras- Escrito em C
- Quem aqui é um bom desenvolvedor C?- Péssimo para testar
- “final” em diversos métodos- Péssimo para debugar
- Stack-trace? Onde? Como?
Quem aqui é um bom desenvolvedor C?
OK...Dá pra levar#chatiado
Até que…
HHVM
HHVM
- Symfony 2 + HHVM > Phalcon- Zend 2 + HHVM > Phalcon- Controle do framework usado- Debug e manutenção do framework usado
HHVM
HHVM
HHVM
Assunto pra outra palestra =)
Let’s code direito!!!
Let’s Desacoplar!
Não… Pera!
Pense!
- Isso não é receita de bolo!- Assim como quase tudo em dev também não é!
- Talvez não seja o caso para sites novos!- Não é necessário reinventar a roda!
Pense!
Pensou?
Let’s code direito!!!
Separando conceitos
MVC?
Quanto mais camadas melhor!
Divida camadas em sub-camadas
User Interface
Application
Domain
Infra
Forms Nav Grid Search
Input Validation Session Auth Router
Domain Services
Entities Repositories Value Objects
Database Cache FileSystem Log
...
Factories
Domain
Domain Services
Entities Repositories Value Objects Factories
Domain do Cifra Club
Domain
Domain Services
Entities Repositories Value Objects Factories
- Exibir cifras- Transpor cifras- Listar músicas - Ver video aulas- Enviar cifra- Moderar cifra- Moderar usuários
- Top artistas por periodo- Top cifras por periodo- Segredinhos =)
Domain
Domain Services
Entities Repositories Value Objects Factories
Domain é vida!- Independente do framework, ele será o mesmo!- Se importe com ele, de verdade =)- Coração da sua aplicação!
Domain
Domain Services
Entities Repositories Value Objects Factories
Domain é vida!- Independente do framework, ele será o mesmo!- Se importe com ele, de verdade =)- Coração da sua aplicação!
- Ele NÃO DEVE saber qual framework é usado.- Ele NÃO DEVE saber qual banco ou infra é usada.
Domain
Domain Services
Entities Repositories Value Objects Factories
Mas… Como separá-lo?
Interfaces
Repositories
Services
S.O.L.I.D.
Tudo isso ligado com...
Injeção de Dependência
Cadê o código?
- Entidades- Interfaces dos repositórios- Implementação dos repositórios- Serviço- Controller- Config das dependencias- Index.php
Gist
Reflexões sobre o gist...
Apesar de parecerem “simples” e “facilitar” a
vida, caia fora deles!
“deles”, quem?
dos frameworks?
NÃO!!!
Desses caras aqui!!!
- C.R.U.D.
Desses caras aqui!!!
- C.R.U.D.- Arrays
Desses caras aqui!!!
- C.R.U.D.- Arrays- Rotinas
Desses caras aqui!!!
- C.R.U.D.- Arrays- Rotinas- Código “Deus”
Desses caras aqui!!!
Interfaces devem representar o que seu
Domain faz...
interface MusicaRepositoryInterface
{
function buscarMaisAcessadas($quantidade = 1000);
function buscarMaisAcessadasPorArtista(Artista $artista);
}
#bom
interface ArtistaRepositoryInterface
{
function buscarMaisAcessados(Periodo $periodo);
}
#bom
… E depois devem ser implementadas em outras
camadas!
class MusicaDbRepository implements MusicaRepositoryInterface
{
function buscarMaisAcessadas($quantidade = 1000)
{ //.. acessa o banco }
function buscarMaisAcessadasPorArtista(Artista $artista)
{ //.. acessa o banco }
}
#bom
“Saber” muito em OO é MUITO ruim!
class DomainClass
{
public function fazAlgumaCoisa()
{
$infraObject = new InfraClass;
$applicationObject = new ApplicationClass;
$uiObject = new UIClass;
}
}
#ruim
class DomainClass
{
public function fazAlgumaCoisa(
DomainInterfaceX $infraObject,
DomainInterfaceY $appObject,
DomainInterfaceZ $uiObject,
)
{ //.. }
}
#bom
Evite usar o operador “new” dentro de métodos
public function fazAlgo()
{
$componente = new Componente;
}
#ruim
$componente = new SeuComponente;
//..
public function fazAlgo(SeuComponente
$componente)
{
$foo = $componente->fazAlgo();
}
#bom
Evite singletons dentro de *suas* classes
public function fazAlgo()
{
$componente = $frameworkComponente::
getInstance();
}
#ruim
$componente = $frameworkComponente::getInstance();
//..
public function fazAlgo(SeuComponente
$componente)
{
$componente->fazAlgo();
}
#bom
Evite herança de componentes do
framework no seu Domain
class DomainClass extends FrameworkClass
#ruim
class DomainClass
#bom
Lembre-se:“Software development is
all design”
Seja pramático na escolha das suas libs...
… evite libs “novas”, pouco ativas, non-community
standards…
#use libs de verdade
TWIG
Monolog
Doctrine
sf\Crawler
aura\signal
Pense!
Phalcon???
Perguntas?
Guilherme Blanco
Agradecimentos
Luís Cobucci
ReferênciasPatterns of Enterprise Application Architecture
Domain-Driven Design: Tackling Complexity in the Heart of Software
Refactoring: Improving the Design of Existing Code
Estamos contratando!
Valeu!
Top Related