KingHost
Canais iMasters

PHP

PHPog: uma questão de design?

Primeiramente, gostaria de agradecer ao André Noel pela gentileza em permitir o uso da tirinha abaixo nesse artigo:


Quando falamos sobre design patterns, estamos falando sobre soluções reutilizáveis para problemas recorrentes. Utilizamos essas soluções para evitar repetições e redundâncias no código da aplicação (DRY  => Don't repeat yourself) e, assim, ter um código consistente, escalável, legível e fácil de manter. Na prática, escrevemos códigos para que sejam soluções para problemas e não para criar novos problemas.

Já faz algum tempo que o PHP tem tido funcionalidades adicionadas à parte de POO (programação orientada a objetos) que, sinceramente, não possuem nada de POO. De fato, estão mais para Pog (Programação Orientada a Gambiarras) do que POO. Vejamos um exemplo:

$o = new SomeClass();

Como eu sei que você é um programador que gosta de orientação a objetos, lhe entrego a instância acima e digo para você trabalhar com ela.

O que você fará com isso ?

- A não ser que o desenvolvedor que escreveu SomeClass esteja ao seu lado ou que você tenha poderes mágicos, você não saberá como trabalhar com isso, e não saberá pelo simples fato de que você não conhece a interface desse objeto.

A programação orientada a objetos baseia-se no comportamento das coisas e saber usar esse comportamento se dá, exclusivamente, através da interface dessas coisas.

Se você estiver no escuro sem absolutamente nenhuma fonte de luz e eu colocar alguma coisa em sua mão e disser: "produza algo com essa coisa”, o que você fará?

Como você não vê, você não saberá o que fazer com essa coisa.

Agora, imagine que eu lhe diga:

interface Something {
public function doSomething();
}

class SomeClass implements Something {
public function doSomething() {
echo 'POO é legal';
}
}

Agora que você sabe que SomeClass é, na verdade, Something, você já sabe como trabalhar com aquela instância inicial:

$o = new SomeClass();
$o->doSomething();

De um tempo para cá, temos visto grandes mudanças no PHP, muitas delas interessantes e realmente úteis. Mas muitas delas, apesar de ditas como “OOP”, acabam batendo de frente com orientação a objetos.

É o caso de muitos métodos mágicos como __get, __set, __call e __callStatic.

class SomeMagicThing {
public function __call( $name , array $argv ) {
switch ( $name ) {
case 'fly' :
echo 'flying';
break;
case 'run' :
echo 'running';
break;
default:
echo 'opz...';
}
}
}

$o = new SomeMagicThing();

Se você não ler o código, você não vai saber que esse objeto pode voar, ou seja, esses ditos métodos mágicos não são realmente mágicos, na verdade são feitos para que programadores que possuem poderes mágicos ou uma bola de cristal possam utilizar.

Mas, quando saímos dessas “coisas” e vemos adições no core do PHP como funções anônimas (ou lambdas), traits e outras, devemos ficar realmente preocupados. Não por ser mais uma coisa não OOP, mas pelo fato de o PHP incentivar a falta de design.

Sim, design é tudo e, quando vemos a própria linguagem incentivando um “código largado”, devemos ficar seriamente preocupados.

Utilizamos funções anônimas em códigos procedurais, nos quais precisamos utilizar callbacks para notificar que alguma coisa aconteceu ou que está acontecendo e alguma precisa ocorrer paralelamente.

Callback não é coisa de código orientado a objetos, consequentemente, funções anônimas não têm espaço em um código OOP.

Existem dois design patterns que podemos utilizar para não utilizar funções anônimas:

  1. Observer (GoF - Behavioral), caso um objeto dependa do estado de outro objeto.
  2. Command (GoF - Behavioral), caso uma requisição deva ser encapsulada em um objeto.

O primeiro design pattern, Observer:

interface Observer {
public function update( Subject $s );
}

interface Subject {
public function attach( Observer $o );
public function detach( Observer $o );
public function notify();
}

class SomeClass implements Subject {
private $observers = array();
private $myState = 10;

public function attach( Observer $o ) {
$this->observers[] = $o;
}

/**
* Muda o estado do objeto
*/
public function changeState() {
++$this->myState;
$this->notify();
}

public function detach( Observer $o ) {
foreach ( $this->observers as $offset => $observer ) {
if ( $observer == $o ) {
unset( $this->observers[ $offset ] );
}
}
}

public function getState() {
return $this->myState;
}

public function notify() {
foreach ( $this->observers as $observer ) {
$observer->update( $this );
}
}
}

class SomeOtherClass implements Observer {
/**
* @var SomeClass
*/
private $someClass;

public function __construct( SomeClass $someClass ) {
$this->register( $someClass );
}

private function register( Subject $someClass ) {
$this->someClass = $someClass;
$this->someClass->attach( $this );
}

public function update( Subject $subject ) {
echo 'O estado do objeto observado mudou, o novo estado é:';
echo $this->someClass->getState();
}
}

$subject = new SomeClass();
$observer = new SomeOtherClass( $subject );

$subject->changeState();

O outro design pattern, Command, pode ser chamado como substituição orientada a objetos para callbacks. Mas vai muito além de ser apenas um “oop callback”, tanto é que também é conhecido como Transaction.

interface Command {
public function execute();
}

class ConcreteCommand implements Command {
/**
* @var Receiver;
*/
private $receiver;

public function __construct( Receiver $receiver ) {
$this->receiver = $receiver;
}

public function execute() {
$this->receiver->action();
}
}

class Receiver {
public function action() {
echo 'Ação executada';
}
}

class Invoker {
public function doSomething( Command $callback ) {
echo 'Fazendo alguma coisa....';

$callback->execute();
}
}

$r = new Receiver();
$i = new Invoker();
$c = new ConcreteCommand( $r );

$i->doSomething( $c );

Claro que o exemplo acima é meramente ilustrativo, mas poderíamos ter toda uma estrutura de histórico e rollBack com os comandos executados.

Mas a coisa começa a ficar realmente feia quando nos deparamos com uma nova adição do PHP 5.4, os traits.

Lembra da tirinha lá do início?

Pois bem, todos concordamos que RCP não é nada elegante, mas e quanto aos traits? O que esperar de um recurso cuja descrição do próprio autor é: “It is almost like a language supported and failsafe copy'n'paste mechanism to build classes".

Se não acredita, veja o RFC no wiki do php.net: https://wiki.php.net/rfc/traits

Agora, só porque RCP é suportado pelo core da linguagem, copy'n'paste ficou mais elegante?

Em orientação a objetos, fazer é um verbo bitransitivo: fazemos alguma coisa com alguma outra coisa.

Com isso em mente, podemos utilizar um outro design pattern para adicionar responsabilidades dinamicamente a um objeto e ter um meio flexível à herança para estender funcionalidade:

interface Component {
public function saySomething();
}

class Hello implements Component {
public function saySomething() {
$this->sayHello();
}

public function sayHello() {
echo 'Hello ';
}
}

class World implements Component {
public function saySomething() {
$this->sayWorld();
}

public function sayWorld() {
echo 'World';
}
}

class Decorator implements Component {
private $hello;
private $world;

public function __construct( Hello $hello , World $world ) {
$this->hello = $hello;
$this->world = $world;
}

public function sayExclamationMark() {
echo '!';
}

public function sayHello() {
$this->hello->sayHello();
}

public function sayWorld() {
$this->world->sayWorld();
}

public function saySomething() {
$this->sayHello();
$this->sayWorld();
$this->sayExclamationMark();
}
}

class DecoratorB extends Decorator {
private $component;

public function __construct( Component $component ) {
$this->component = $component;
}

public function saySomething() {
$this->component->saySomething();
$this->sayPogIsBad();
}

public function sayPogIsBad() {
echo PHP_EOL , 'POG is Bad';

$this->sayExclamationMark();
}
}

$decorator = new DecoratorB( new Decorator( new Hello() , new World() ) );
$decorator->saySomething();

Bom, para finalizar, gostaria de deixar uma pergunta:

PHPog é uma questão de design ou a linguagem está apenas se adaptando à falta de design nos códigos PHP escritos por POGramadores?


Comente também

126 Comentários

Igor Carvalho de Paula
Igor Carvalho de Paula

Uma coisa que voce esqueceu eh que o PHP eh uma linguagem dinamica, exigindo mais inteligencia, o melhores programdores documentam suas classes, mas a minoria faz isto...Nao existe uma educacao a cerca de PHP, nao profissional, o nivel dele esta aumentando...nao cuspa no prato em que comeu...

João Batista Neto
João Batista Neto

Talvez eu tenha me perdido em algum ponto da história, provavelmente no momento em que dinamicidade virou justificativa para gambiarra.

Veja, o prato que comi, e que ainda como, é um prato organizado, repleto de recursos suculentos oferecidos pela linguagem PHP e acredite, é extremamente saboroso.

É indiscutível que, devido a essa dinamicidade e também ao fato de ser uma linguagem simples, o PHP tem se tornado cada dia mais popular.

Porém, se PHP fosse realmente manter a linha simplista, melhor seria se mantivesse o pensamento segundo Antoine de Saint Exupéry: "It seems that perfection is reached not when there is nothing left to add, but when there is nothing left to take away".

E sinceramente, traits e Closures são coisas que sequer deveriam ter sido adicionadas.

Por outro lado, tenho visto recursos que seriam realmente valorosos à linguagem sendo vetados por "It's not the PHP way".

Se não é, qual seria então ?

A questão deixada no final é justamente para tentar refletir sobre isso: Qual seria então, na realidade, a forma PHP de se programar ?

Igor Carvalho de Paula
Igor Carvalho de Paula

confesso que venho a pedir desculpas, depois que fui ler e entender realmente o sentido de traits, e tive de concordar com voce...

Wellington Silva Feitosa
Wellington Silva Feitosa

No meu modo de ver o PHP é uma linguagem flexível que permite a os programadores que o utilizam escrever código que nem sempre é de qualidade mas, culpar a linguagem por isso é mesmo que dizer que alguém é mal motorista por causa do carro que dirige. O nível de abstração, elegância, reutilização, segurança ou o que quer que esteja sendo analisado, depende fundamentalmente do desenvolvedor e não da linguagem, alguns podem argumentar coisas do tipo:
"Java faz XXX que o PHP não faz", ou "Ruby tem XXX recursos que PHP não tem", penso que são simplesmente maneiras diferentes de se fazer as coisas e buscar a ferramenta certa para o trabalho certo!
Agora convenhamos quem faz código ruim em PHP, faz código ruim em QUALQUER linguagem, eu já vi excelentes códigos escritos em PHP, Java, C#...
E também já vi muitas porcarias escritas nessas mesmas linguagens, atualmente vejo muitas pessoas falando coisas boas e más a respeito do PHP, o que me leva a acreditar
que se estão falando dele é por que ele é importante sim, tem uma comunidade forte e é amplamente utilizado e tem potencial para se desenvolver cada dia mais.
O que temos que buscar é conhecimento e educar os programadores para que desenvolvam códigos de qualidade e não apenas apontarmos supostos pontos ruins da linguagem.
Código POG só faz quem quer!

João Batista Neto
João Batista Neto

Okay Wellington, 3 pontos para você:

1. "O nível ... depende fundamentalmente do desenvolvedor e não da linguagem"
2. "Agora convenhamos quem faz código ruim ... faz ... em QUALQUER linguagem"
3. "Código POG só faz quem quer!"

O PHP tem se tornado cada dia mais popular, e essas novas adições à linguagem não podem ser ditas como "elegantes", então fica a questão: Qual o sentido delas ?

"Código POG só faz quem quer!", mas não estaria a linguagem facilitando, enquanto deveria dificultar o POG ?

Wellington Silva Feitosa
Wellington Silva Feitosa

João,
além das adições citadas no seu artigo, temos também:
namespaces, garbage collector, PHAR...
que ao meu ver são grandes adições a linguagem, como você disse o PHP tem se tornado cada dia mais popular e ainda paga caro por muitos erros do passado mas, por outro lado esses recursos que citei também não incentivam melhores códigos e praticas?
Linguagens como Ruby, Python, JavaScript etc. Já tem o recurso de utilização de lambdas a certo tempo, e não vejo ninguém dizer que elas incentivam a programação POG, vejo esses comentários apenas com relação a utilização do recurso no PHP, por que?

João Batista Neto
João Batista Neto

Então Wellington, quando eu disse no artigo "muitas delas interessantes e realmente úteis", eu estava me referindo justamente aos namespaces, GC, Phar e outros.

Quando o Phar saiu da PECL e foi incorporado ao core e quando tivemos a adição de namespaces, minha reação foi: "Fantástico !!!"

Agora, sabemos que os pacotes Phar, e outros recursos ainda precisam melhorar muito. Não seria muito melhor se o pessoal do core tivesse trabalhado em melhorar o que temos, em vez de adicionar outros recursos, como os traits ?

Ou então, adicionar tipagem para retornos de métodos nas interfaces para que tivéssemos um design mais sólido ?

Você está correto ao dizer que o PHP paga muito caro por erros do passado, mas então porque continuar repetindo esses erros ?

O que estou vendo é o PHP aumentar o défice e cometendo erros recorrentemente, enquanto deveríamos ver a linguagem procurando corrigir esses erros do passado, novos vem surgindo.

De que adianta dar 1 passo à frente, quando se dá dois para trás ?

Quanto a parte do seu comentário sobre os lambdas, veja minha resposta ao Jean, ela responderá também à sua pergunta.

Andre da Silva Severino
Andre da Silva Severino

Ou então, adicionar tipagem para retornos de métodos nas interfaces para que tivéssemos um design mais sólido ?

Joao, isso sim seria fantastico se um dia acontecer, ja que nao se tipa as var e etc, tipar o retorno dos metodos seria interessante mesmo.

Igor Carvalho de Paula
Igor Carvalho de Paula

Não vejo vantagem em tipar o PHP, ja que o torna fantastico eh seu dinamismo...ha coisa que ele faz que outra linguagem nao faz...

Jean Nascimento
Jean Nascimento

Ótimas considerações, porém como o PHP realmente não é completamente voltado à OO essas novas funcionalidades dão maior poder a scripts que precisem de maior dinamismo e que não sejam OO. Para mim PHP é uma linguagem multiparadigma, provendo grande poder e liberdade ao programador, só depende dele escolher qual o melhor caminho sem que a linguagem o force a tal. Obviamente isso tanto poder ser bom(programadores experientes) como péssimo (programadores iniciantes).

João Batista Neto
João Batista Neto

Jean, de fato o PHP é uma linguagem multiparadigma.

Segundo a Wikipedia, são: imperative, procedural,object-oriented,reflective.

Qual a vantagem que um programador que desenvolve com "orientação a objetos" tem sobre um que desenvolve de forma "procedural" ?

ABSOLUTAMENTE NENHUMA !!!

Todos os paradigmas possuem seus méritos, assim como os desenvolvedores que sabem utilizar adequadamente determinado paradigma.

O problema é misturar as coisas, veja só:

<?php
var_dump( function() {} instanceof Closure ); //bool(true)

Lambdas são um excelente artifício de linguagens procedurais, não há nada errado em utilizá-las, pelo contrário, se utilizado de forma procedural no paradigma procedural, lambdas só trazem vantagens.

O problema é a falta de consistência, só isso. Poderíamos ter lambdas no PHP ?

Claro que poderíamos, o errado é apenas ter misturado as coisas.

Jean Nascimento
Jean Nascimento

Como vc ja havia comentado comigo isso e eu concordo plenamente, o negócio é só não misturar os estilos que todos serão felizes hehehhee

Reinaldo Mendes
Reinaldo Mendes

A propósito, lambda não é recurso procedural e sim funcional.
Lambda é tão ruim que o C# possui que o java pretende incluir também.

Wellington Rodrigues
Wellington Rodrigues

Saudações à todos,

João,

Meus parabéns pelo ótimo artigo. Demorou, mas encontrei alguém que transcreveu uma opinião sobre os método mágicos do PHP em uma comunidade de grande visibilidade.

Acompanho sempre que possível suas mensagens no fórum de programação e só tenho a dizer que apoiou seu texto descrito aqui.

Um grande abraço,

@programmerbr

Eloir Cerchiari
Eloir Cerchiari

Poutz,
Eles bem que podiam deixar de babaquice e criar um suporte a annotations decente.

Augusto Pascutti
Augusto Pascutti

Tem alguma coisa com annotations que vc queria fazer e que não seja possível hoje? Adoraria ajudar.

Raphael de Almeida
Raphael de Almeida

Annotations é OO? Preserva o encapsulamento?

Daniel Lima dos Anjos Pinheiro
Daniel Lima dos Anjos Pinheiro

Olá João,

Primeiramente, ótimo artigo.

Agora vou por meu ponto de vista sobre a sua opinião...

Como o pessoal já disse, o PHP (no geral) evoluiu: novos recursos, comunidade amadurecendo, novos "atalhos" para desenvolvimento e muitas implementações em OOP que não possuía antes (que deveria ter desde o começo) foram criadas, etc...

Sou totalmente a favor do seu pronto de vista em usar soluções escaláveis, reaproveitáveis e legíveis para os problemas que deparamos no desenvolvimento, principalmente se o código será utilizado por uma equipe futura ou até mesmo no desenvolvimento de uma API, mas...

Nem tudo precisa ser dessa forma e há alternativas para descrevermos um contexto, por exemplo: Em PHP não possui herança multipla, se não me engano só Python e C++ que possuem esse recurso, então, os Traits são uma boa alternativa no reaproveitamento de código nessa situação.

Ok, eu posso criar uma interfaceX para classes que utilizam o mesmo método, de mesmo conceito, mas que não tem relacionamento algum. Mas isso chega a ser um pouco cansativo. É legível, claro, elegante, mas é desgostoso fazer isso pra todas essas classes extendidas ou implementadas.

Como o Wellington mesmo disse: "Agora convenhamos quem faz código ruim em PHP, faz código ruim em QUALQUER linguagem".. Isso é um pouco parecido com "Tenho um Iphone só para falar ao telefone".

Enfim, acho que saber usar as coisas é mais importante do que apenas saber o que elas são.

ps: detesto os __methods().... =)

Abs, e continue postando artigos de qualidade como este.

João Batista Neto
João Batista Neto

Legal Daniel,

Já que você mencionou S.R.P....

A herança múltipla quando utilizada para reaproveitamento de código em conjunto com o princípio da segregação de interfaces (I.S.P.) ADEQUADAMENTE, é um recurso poderoso.

O problema é que ela (herança múltipla) além de poderosa, é ao mesmo tempo (e em mesma intensidade) perigosa, quando viola o princípio da responsabilidade única (S.R.P.).

Um bom design é algo fundamental no desenvolvimento de uma aplicação orientada a objetos, principalmente, como você disse, se estivermos desenvolvendo APIs (públicas ou privadas) ou, também como você disse, caso a aplicação venha a ser mantida por terceiros no futuro.

Mas o grande ponto, e isso é importante, é que mudanças sempre vão ocorrer e qualquer aplicação que não tenha sido planejada para mudanças pagará caro por isso quando elas ocorrerem, mesmo que a equipe que fará a manutenção seja a mesma que desenvolveu a aplicação original.

Quanto aos __methods(), os únicos que são relevantes no que se refere à orientação a objetos são: __construct(), __destruct(), __clone() e __toString(), todos os outros são detestáveis.

Evandro Oliveira
Evandro Oliveira

e quanto a __sleep e __wakeup???

João Batista Neto
João Batista Neto

Não gosto deles Evandro, a SPL tem a interface Serializable.

João Nunes Rios
João Nunes Rios

Discordo de um pequeno ponto que, talvez devido ao fato de eu não ser tão experiente, pode ter uma justificativa razoável que eu desconheça.

No exemplo do começo do post, onde vemos uma nova instância de uma classe sendo criada, o autor diz que não é possível saber o que fazer com ele.

Bem, já me deparei com situações semelhantes onde precisava conhecer um objeto e , em um abiente seguro de desenvolvimento na máquina local, tudo o que fiz foi chamar a função print_r($objeto) dentro de uma tag <pre>, o que me permite ver todas as propriedades, métodos, relacionamentos etc que o objeto possui, de uma forma organizada (preformatada). E também uso a função debug_backtrace() para saber o que aconteceu até determinado ponto da aplicação ou pacote.

Claro que não chega aos pés de ter um design pattern, mas os programas que eu lido dificilmente passam por uma análise, que dirá um design pattern (não por opçõa minha, mas sim porque foi outra pessoa que fez).

Enfim, o post é excelente e me deixou intrigado com os recursos tão POGramáveis que o PHP introduziu, mas a parte onde "não é possível saber o que fazer" não me desce....

Isso me lembra o Corel Draw: todo mundo reclama que é uma porcaria, quando não é bem assim. Acontece que, de tão fácil que é de usar, muita gente sem preparo faz qualquer coisa de qualquer jeito para qualquer propósito.

Oscar
Oscar

Sem tipagem não tem como ter orientação a Objeto!

A oop do php é a maior gambiarra que fizeram! assim como seus frameworks!

Glass
Glass

O PHP tem tipagem dinâmica, o que é bem distante de uma linguagem não-tipada como TCL ou alguns LISPs.

Agora, se você quis dizer que uma linguagem precisa de "tipagem estática", então acho melhor estudar um pouco: saiba que o Smalltalk também é tipado dinamicamente, e ele é linguagem que praticamente consolidou os conceitos de OO dos dias de hoje.

Python e Ruby também são dinamicas, e isso não torna seu sistema de classes nem um pouco inferior.

Augusto Pascutti
Augusto Pascutti

Quem disse que PHP não tem tipagem???! Te enganaram feio hein colega!
Ta aí o link pra documentação oficial em português ainda hein: http://www.php.net/manual/pt_BR/language.types.php

Ó que mamata pra sua ignorância. Bênção maior que essa, só rezando e esperando milagre.

Jean Nascimento
Jean Nascimento

Sempre ouço essa besteira por ae!

Oscar
Oscar

Ok! FORTEMENTE tipada!
e a tipagem dinânimica torna SIM o sistema de classes inferior, além de deixar o o mais favorável a gambiarras!

João Nunes Rios
João Nunes Rios

Acho que o que o colega Oscar quis dizer é a tipagem forte de linguagens como Java e C++, por exemplo:

String nome = 'zé';
public static void funcaoTal();

Silvano
Silvano

Ia escrever bastante, mas dá pra resumir tudo com: PHP não tem o objetivo de se tornar 100% orientado a objetos. Live with it.

Decidi não perder muito tempo com meu comentário logo quando li seu primeiro exemplo de POG, o:

$o = new SomeClass();

Com o papo de interface e blablabla. Em Java você consegue fazer a mesma coisa... me pareceu mais falta de argumento mesmo e algo pra "encher linguiça" no texto.

No mais, gostei dos diagramas. Parabéns.

Felipe Nascimento de Moura
Felipe Nascimento de Moura

Desculpe João, provavelmente escreverei um texto grande aqui, mas teu artigo foi bastante inútil, por assim dizer. Não só teu post não acrescentou nada a ninguem pelo fato de atacar sem a menor necessidade uma linguagem de programação(sem isto, teria sido um post otimo sobre design patterns) mas por estar incentivando justamente algo muiro ruim...o uso mandatório e amador de design patterns.
Digo isto por que, sei de gente que programa OO...beleza, dai tem algo gigante pra tratar onde a OO não vai segurar as pontas e SOMENTE algo procedural aguenta...dai eles choram pq a linguagem deles "não deixa"...
Pessoalmente, acho INADIMISSIVEL uma linguagem não te deixar fazer algo...e é esta a ponta que o PHP investe, em possibilidades. Tu quer programar OO...entao tu pega php e programa OO...tu precisa de funções lambda, interfaces que estendam interfaces múltiplas, algoritmos procedurais, biblioteca de funções, foco em performance e outras coisas que ja me deparei, bom...dai tu TAMBEM PODE...e isso muda tudo.
Ja tentou alterar um arquivo .xml de 2 milhões de linhas? sao bem poucas as linguagens que conseguem e não, não sera com OO que tu vai conseguir.
Se tu precisa de algo realmente escalavel, parametrizável, precisarás de namespaces e classes dinâmicas e novas camadas de abstração, coisa que com métodos mágicos e uma linguagem fracamente tipada tu vai conseguir muito facilmente...ou então, com (AÍ SIM) gambiarras feitas por dúzias de classes pesadíssimas. Tecnicamente, eu vejo a propria "sobrecarga de métodos" uma gambiarra feita para aquelas linguagens que não suportam assinaturas dinâmicas para metodos e funções.
Enfim...acho amador alguem achar que uma linguagem, ou uma metodologia, ou um paradigma que seja "a bala de prata"...acredito que não seja este teu ponto de vista, mas para iniciantes que lerem teu texto, isto é o que pode acabar sendo transmitido...daí, quando pegarem projetos grandes de verdade, vão querer fazer apenas aquilo que sabem, e não irá servir.

Pense em Javascript, uma linguagem com MUITO futuro, que é OO prototyped, procedural, funcional...

Achei os exemplos de código, descrições de paradigmas e patterns e diagramas muito legais, e por eles, parabens...só aconselho a ser menos "agressivo" em futuros comentários...pessoas leem o que tu escreve aqui ;)
PS.: desculpe os possíveis erros de portugues e/ou digitação

João Batista Neto
João Batista Neto

O ataque, Felipe, foi deliberado em relação a alguns recursos recém adicionados, entre eles Closure e trait, como especificado no texto, não à linguagem como um todo.

De fato, acho que alcancei o objetivo do texto, porque é preciso pessoas sóbrias, como você e outros que comentaram logo abaixo, para definir o futuro dessa linguagem.

Como você poderá ver no meu comentário ao Jean, eu não acho que um paradigma é superior a outro, pelo contrário.

Quanto ao XML de N milhões de linhas, ai já sai um pouco do escopo da linguagem e entra na metodologia empregada para a leitura desse arquivo. De qualquer forma, DOM, de fato, não é o método adequado.

Mas mesmo que utilizemos uma interpretação desse XML baseada em stream, cada nó do XML ainda será, por definição, uma composição de nós filhos e, independentemente do tamanho, interpretável tanto de forma procedural, como orientada a objetos.

Quanto ao Javascript, de fato é uma linguagem de MUITO futuro, e só é porque é consistente. Quando foi a última adição estrutural feita nessa linguagem ?

Conheço pessoas que programam de forma procedural, escrevem ótimos códigos e aplicações. Conheço também pessoas que programam de forma orientada a objetos, que também escrevem ótimos códigos e aplicações.

Mas recentemente tenho visto pessoas que fazem tantas misturas de conceitos, técnicas que a aplicação fica inconsistente e que, muito provavelmente, terá várias primeiras versões.

Independentemente da linguagem, POG é POG e não deve ser incentivado, seja por outros desenvolvedores, ou pela linguagem.

Jean Nascimento
Jean Nascimento

Sabia q a resposta do Felipe seria meio baseada no JS e ele falou tudo! Tudo vai depender do que o programador precisa como eu tb havia comentado. Mas o João tb está certo em falar que não é legal misturar as coisas. Se quer escrever OO escreve, se quer procedural escreve, se quer "funcional" escreve. Eu PARTICULARMENTE acho feio misturar as coisas, não que seja certo ou errado.

Evandro Oliveira
Evandro Oliveira

"Quanto ao Javascript, de fato é uma linguagem de MUITO futuro, e só é porque é consistente. Quando foi a última adição estrutural feita nessa linguagem ?"

Quase dois anos.

https://mail.mozilla.org/pipermail/es-discuss/2009-December/010215.html

O ano é 2011? Ou será que estou preso no dia da marmota e ainda estou vendo pessoas falarem mal de linguagens?
Se o tempo gasto para escrever esse post, pesquisar, criar diagramas bonitinhos, e bla bla bla, tivesse sido utilizado para criar alguma coisa realmente útil, ai sim eu iria achar produtivo.
;)

João Batista Neto
João Batista Neto

Talvez a releitura do texto possa ser interessante, amigo.

Não falei mal da linguagem. Critiquei a falta de design, mau uso de recursos e incentivo, por parte da linguagem, de códigos insustentáveis.

;)

Augusto Pascutti
Augusto Pascutti

Eu acho que você precisa reler o que escreveu então colega. ;)

Jean Nascimento
Jean Nascimento

O mais engraçado é que o João eh PHPzeiro hehehhe o rapaz gosta e programa muito em PHP.

Marcelio Leal
Marcelio Leal


Deu Pra perceber algumas coisas:
1. Você pensa em Java, por isso é normal nao entenderes alguns conceitos diferentes dos que usas.
2. Nem sempre Design Patterns são as melhores soluções, mesmo sendo aplicáveis. Procure em diversos artigos e em diversos frameworks de mercado.
3. Nao existe nenhuma linguagem, que opere em ambiente web que seja purr no paradigma.
4. Procure saber o conceito Origem dos traits.
5. Uma dúvida, já programaste em Python, Ruby, ou PHP algum sistema razoávelmente médio. Porque pelas colocaçøes me pareceste sem nenhuma experiência interessante nesses tipos de plataforma, ou mesmo, com nenhum desenvolver experiênte nelas.

Acho q de resto o Felipe e o Silvano complementaram

Leonardo Cesar Teixeira
Leonardo Cesar Teixeira

Isso mesmo Marcelio, eu acompanho os posts do João Batista no fórum do iMasters há um bom tempo e já percebi que ele tem alguns "vícios" herdados da linguagem Java.

Tive certeza disso quando vi os scripts que ele publicou no Github do seu curso de MVC no iMasters Pro. Ele organiza a estrutura de diretórios dessa forma: "/application/com/imasters/pro", isso é coisa do Java, eu honestamente nunca vi uma aplicação em PHP organizada de tal maneira, com o nome de domínio ao contrário.

Eu acho válido dominar mais de uma linguagem de programação, só não pode misturar tudo e esquecer que se está trabalhando com linguagens diferentes.

Augusto Pascutti
Augusto Pascutti

Parabéns pela inserção da tirinha do André Noel. Ela salvou seu artigo!

Como odeio críticas somente negativas, acho que vale enumerar onde você foi infeliz (na minha opinião).

* Criticar uma linguagem é a mesma coisa que criticar a existência de um ser ou coisa. Não tem propósito. A existência do crack, não torna todo mundo depende e viciado.
* Programar não é uma ciência exata. Não existe resposta certa. Concordo que "funcionar" não é parâmetro, mas também concordo que dane-se que o que está sendo feito seja procedural ou OO. Desde que atenda o objetivo ao que aquilo foi proposto.
* Traits e Funções Anônimas não são OO? Acho melhor você ir pesquisar um pouco colega.
* A linguagem está se adapatando aos programadores sim. Já viu o Doctrine 2 o Symfony 2?

Não sei, ta na hora de tirar a cabecinha da bunda e realmente correr atrás da verdade. Inventar conclusões qualquer esquizofrenico inventa.

Alex Piaz
Alex Piaz

Artigo fraco. Não chega a conclusão nenhuma, de passagem desinforma, presta um desserviço ao PHP e ainda irrita a comunidade. Lamentável.

Leandro
Leandro

Concordo plenamente.

Raphael C.
Raphael C.

Leia os os comentários.

Douglas Miranda
Douglas Miranda

Uma boa ideia será se você adicionar no artigo que após lerem o artigo é aconselhável ler os comentários, pois aprende-se muito com eles :)

Mas falando sério, pense antes de escrever da próxima vez para não influenciar mal quem é iniciante no assunto.

Discutir temas antigos, sem argumentos com fundamento não é uma boa prática. Talvez tenha lhe faltado bom senso, forma de se expressar ou mesmo leitura. Você abordou tantas coisas ao mesmo tempo e mal conseguiu exemplificar o que realmente quer.

Por fim, seria mais fácil falar: "Ahh é ruim porque eu não gosto!", "Ah um dia eu li isso, não entendi, achei legal e postei :)".

No mais, leia bastante. (Muito mesmo!)

Glass
Glass

Esse artigo demonstra uma falta de conhecimento imensa.

Closures não vieram de programação procedural, e sim de programação funcional. (Não, uma coisa não tem absolutamente nada a ver com a outra, não é tradução)

Uma closure não é simplesmente "só uma função anônima", sem nome. Ela consegue carregar consigo o estado do ambiente de quando ela foi criada, portanto é perfeitamente possível utilizar uma closure para representar uma transformação ou até mesmo uma operação de rollback.

É uma das mais ricas estruturas que temos em linguagens de programação, e é formalizada matematicamente desde a década de 60. Não é uma "gambiarra", longe disso. Na realidade, o padrão "command" é exatamente uma implementação orientada a objetos de uma closure, para linguagens que não a suportam.

O que você tá fazendo é simplesmente simular uma closure em uma linguagem que as suporta.

Aliás, o Command é um exemplo de uma closure "burra". É perfeitamente possível implementar o padrão Memento com uma Closure, já que elas guardam estado. Se ainda quiser ficar nas meras funções-anônimas-que-são-passadas-como-callback, dá pra usa-las pra implementar os padrões Strategy, Visitor, Iterator.

Isso em três linhas. Pra mim isso é design: saber usar a coisa certa no lugar certo.

--

E quanto aos traits? O próprio Smalltalk possuia mixins, que são basicamente uma forma de utilizar composição no lugar de herança.

Aliás, veja só, logo no início do livro do Gang of Four, o livro seminal que definiu os primeiros padrões de projeto, existe uma frase: "Prefer Composition Over Inheritance". É exatamente isto que os Traits fazem.

Herança não existe meramente para se transmitir comportamento. Herança existe para representar hierarquia.

Se você quer implementar interfaces iguais e comportamentos diferentes, use interfaces. Se quer implementar interfaces iguais e comportamentos diferentes, utilize mixins/traits.

Se você não gosta da definição "copy and paste" do PHP, então devia ler mais sobre os mixins do Smalltalk, ou do Ruby, ou dos Traits do Scala pra se informar mais né?

--

Design não é copiar classes de um livro escrito na década de 1990 que tratava de uma linguagens diferente da que você está utilizando.

É completamente possível ter um design limpo e eficiente utilizando programação funcional. Mas primeiro você precisa descobrir que programação funcional não tem nada a ver com programação procedural.

Jean Nascimento
Jean Nascimento

Ai gostei hein!

Augusto Pascutti
Augusto Pascutti

Porra. Virei seu fã.

Jean Nascimento
Jean Nascimento

ps: vc eh Homem ou Mulher?

Filipe La Ruina
Filipe La Ruina

Virei seu fã²! Até tinha pensado em comentar mas esse comentário explicou tudo que tinha pra se explicar.
Ah, e uma informação interessante é que ate o Java teve uma proposal de adição de closures http://mail.openjdk.java.net/pipermail/lambda-dev/attachments/20100212/af8d2cc5/attachment-0001.txt
E tem soluções que são a cara de closure ;) http://en.wikipedia.org/wiki/Closure_(computer_science)#Java

Marcelo Rodrigues
Marcelo Rodrigues

Fiquei só no modo stealth porque comentar esse texto nem vontade dá tamanha a quantidade de besteiras em um texto só.

Enfim, só pra informar que virei seu fã também. Esse comentário merece ser "copiada e colado" (ironia) em qualquer discussão no mesmo naipe desse texto.

wesleyvicthor
wesleyvicthor

porra ! disso que to falando. nem li o post, apenas os comments (: e esse valeu a pena.

João Batista Neto
João Batista Neto

Okay Glass,

De fato, a origem de lambdas é funcional mas, como PHP é imperativa, lambda nunca teve, no PHP, uma implementação de forma funcional.

Talvez eu tenha sido sim, tendencioso no que se refere ao "carregar consigo o estado do ambiente quando ela foi criada", porém Closure ainda não é um recurso de orientação a objetos.

Quanto ao Command, ele não é uma implementação orientada a objetos para "linguagens que não a suportam", e dizer que que Command é uma simulação de uma Closure é tão tendencioso e parcial quanto eu fui ao não mencionar o carregamento de estado.

Alias, tão tendencioso ou talvez, ainda pior, dizer que Command é uma Closure "burra", uma vez que sua responsabilidade, no que se refere à design, é encapsular uma requisição, e faz isso muito bem quando aplicado corretamente.

A menção ao Memento é também totalmente adequada, justamente por este possuir como responsabilidade, ainda me referindo à design, guardar o estado de um objeto.

Saber usar as coisas certas no lugar certo, Glass, é organização, muito longe e diferente de design.

O código abaixo é um *exemplo clássico*, é organizado, porém possui um problema sério de design:

class Rectangle {
private $height;
private $width;

public function getHeight() { return $this->height; }
public function getWidth() { return $this->width; }
public function setHeight( $h ) { $this->height = $h; }
public function setWidth( $w ) { $this->width = $w; }
}

class Square extends Rectangle {
public function setHeight( $h ) {
parent::setHeight( $h );
parent::setWidth( $h );
}

public function setWidth( $w ) {
parent::setWidth( $w );
parent::setHeight( $w );
}
}

Mesmo organizado, a falta de design pode (e possivelmente vai) causar um problema futuro.

Tenho certeza que você, pelo nível que demonstrou possuir no seu comentário, consegue ver claramente o problema e talvez o meu segundo erro nesse texto foi justamente ter tratado de um tema com foco em um público que consegue ver isso, causando (não propositalmente) uma impressão de que um padrão X ou paradigma Y é a melhor solução para um problema. Foi o que o Felipe Nascimento comentou logo acima: "mas para iniciantes que lerem teu texto, isto é o que pode acabar sendo transmitido".

Meu único problema com Closure, especificamente no PHP, é o seguinte:

<?php
var_dump( gettype( function() {} ) ); //string(6) "object"

--

Quanto a frase extraída de GoF:

"This consolidation phase produces many new kinds of objects, often by decomposing existing objects and using object composition instead of inheritance."

Justamente o contrário da proposta dos traits.

De fato, a proposta de traits está mais para um artifício para resolver o problema de colisão da herança múltipla, criando fragmentos de implementações para serem utilizados sem a necessidade de contrato, do que para composição ou agregação de objetos.

Concordo que é possível ter um design limpo e eficiente utilizando programação funcional, concordo também que o mesmo é verdade para a forma procedural e orientada a objetos.

Mas você há de concordar que a programação funcional não possui qualquer relação com a forma procedural de PHP pois, por ser imperativa, se contrapõe à forma funcional de ver as coisas.

Glass
Glass

Er, perdão, mas acho que você não sabe o que um lambda. O PHP possui sim, lambdas. Uma função anônima no PHP é exatamente o que um lambda é no LISP, Haskell, Ruby, Python, C#, Scala ou qualquer linguagem funcional ou que possua construções funcionais. A sintaxe é um apenas um detalhe: o fato de se chamar "lambda", ou não escrevermos "lambda" não é realmente um problema.

É perfeitamente possível implementar cálculo Lambda de forma integral em PHP usando a notação atual e criar até Y-Combinators ou implementar mônadas ou qualquer construção funcional.

Veja a definição da Wikipedia: "lambda is an operator used to denote anonymous functions or closures".

É apenas sintaxe.

--

E não vejo nada de errado em dizer que o padrão command é uma closure "burra". Como você disse, o padrão Command encapsula uma requisição, portanto NÃO necessita carregar consigo o estado. Poderia ser facilmente uma função normal, ou uma função anônima que não fosse uma closure, justamente pois não precisa da funcionalidade inteira desta.

O Java necessita de um Command Pattern. Já no PHP você tem outras opções.

--

E como a proposta do GoF é o contrário dos Traits? Esta frase não é a citada por mim, mas diz justamente algo que os traits fazem: decorar objetos com nova funcionalidade. Perceba o que eu disse: novas funcionalidades. Traits são como herança, mas no lugar de poluir a hierarquia de classes, eles simplesmente adicionam funcionalidade.

--

Quanto ao "você há de concordar", por favor, sem falácias pro meu lado, por favor. Não existe essa de "devemos utilizar X pois sempre foi assim". Ferramentas estão aí pra ser bem utilizadas, mas eu acho que os outros comentários falam bem disso.

O Scala é primariamente imperativo e se dá muito bem com construções funcionais. O Ruby é ainda "mais imperativo" que Java/C++ (até as definições de classe e de função são imperativas no Ruby) e "mais orientado a objetos" que o Java/C++ (ao contrário do Java e do C++, até os primitivos int/string/etc são objetos) e construções funcionais (blocos) são completamente idiomáticas na linguagem. Aliás, os loops em Ruby são mais "funcionais" - utilizam Ranges - não existe uma keyword "for" como no Java. Idem para o Python.

A "forma funcional de ver as coisas" tem, a cada dia, se tornado a melhor maneira de se fazer software. Exemplos?
- A imutabilidade é regra para se utilizar passada de mensagens, hoje praticamente a maneira canônica de fazer um bom sistema distribuido. Ao contrário da orientação por objetos, a programação funcional é thread-safe sem precisar se preocupar com isso.
- Programação funcional é facilmente parelizável, graças a essa imutabilidade. O MapReduce do Google (e do Hadoop) vieram de programação funcional. O Erlang é uma linguagem funcional e provavelmente a mais indicada para programação distribuida.
- A falta de "efeitos colaterais" em programação funcional garante software mais confiável e testável.
- A utilização de sintaxe declarativa é uma ótima opção pois representa melhor a intenção da operação e das ~regras de negócio~.

De que adianta basicamente "fingir" que estamos programando funcionalmente (Padrão Command? Visitor? Iterator?) enquanto temos construções mais apropriadas.

--

Por favor, se informe mais antes de criticar algo que não conhece. Programação funcional ou orientada a objetos são apenas ferramentas. As vezes um deles é a resposta, as vezes não.

Não tente obrigar usuários de PHP a criarem projetos como se estivessem programando em Java.

O engraçado é que não sou programador PHP. Essa não é uma defesa ao PHP, é simplesmente uma defesa ao bom senso.

Glass
Glass

E outra, eu podia muito bem estar aqui criticando programadores Java por não usarem mônadas. Classes que guardam estado? Que loucura! Como fica a transparência referencial, a imutabilidade e a ausencia de efeitos colaterais quando se usa essa linguagem? Oh meu deus!

Mas não o vou fazer. Porque? Porque no Java não é necessário usar mônadas. Simples assim.

Douglas Miranda
Douglas Miranda

Glass, mandou bem! Sem mais a acrescentar.

Felipe Nascimento de Moura
Felipe Nascimento de Moura

Realmente muito bacana a troca de comentários aqui. Pra quem é iniciante, ler estes comentários pode ser uma grande fonte de "o que pesquisar", o que é muito bacana. Eu considero o PHP uma linguagem diferente das outras justamente por me deixar fazer o que eu quiser com ela(claro, salvo algumas excessões, obvio)...bons programadores não descobrirão o que o método doSomething faz por magia, eles lerão nas annotations...é como entregar um martelo a um bom marceneiro, e outro martelo a um psicopata...mas o martelo faz o que se propoem...BATE.
O artigo e os comentarios acabaram formando uma fonte rica para quem estiver pesquisando sobre diversos assuntos muito legais, porém, irá carregar consigo sempre esta imagem negativa no título, algo que realmente não precisava!
Não sei quanto a voces, mas eu tenho visto linguagens "rigidas" começando a ser tratadas como "linguagens velhas"...ou vi MUITA gente nos EUA dizendo que não se escolhe mais Java para projetos a serem iniciados, as opções seriam ruby, phyton ou php...claro, não é algo que reflete a maioria no mundo ou algo assim...mas tenho sentido isto como uma certa tendencia...desenvolvedores(e as nescessidades do mercado) tem buscado soluções mais generalistas, que PERMITAM o seu uso de maneiras diversas.
Glass comentou algo que achei se enquadrar perfeitamente com o assunto:
"Pra mim isso é design: saber usar a coisa certa no lugar certo"
E pra isto, a linguagem/ferramenta/framework/whatever precisam oferecer suporte.

João Batista Neto
João Batista Neto

Felipe,

Acredito que o artigo carregará a imagem negativa, assim como o autor, mas é fato também que, independentemente da imagem, ele cumpriu o que pretendia.

Mesmo que tenhamos tido alguns comentários sem argumentação, MUITOS outros foram muito bem feitos.

Essa discussão com o Glass, por exemplo. Ele argumentou e sustentou um ponto de vista com maestria, é disso que precisamos, é esse o tipo de discussão que contribui.

Qual o rumo da linguagem PHP?

São os desenvolvedores que dirão.

Mas apenas os desenvolvedores sóbrios, pois os apaixonados simplesmente serão levados por inércia.

Rafael Dohms
Rafael Dohms

João, veja bem, é tudo uma questão de como fazer as coisas. Os comentários sem argumentação são fruto de uma péssima escolha de palavras para apontar algo que é no fundo uma opnião pessoal de como se trabalhar com Design Patterns no PHP e em outras linguagens.

Veja, mude: "PHPog: uma questão de design?" para "Design Patterns usando recursos PHP", pronto agora vc tem discussão sem agressão.

Entende? Usar termos como POG, e críticas esnobes citando frases fora de contexto é simplesmente um "flame bait", algo escrito com um intuito, deixar pessoas com raiva, gerar milhares de visita para no final dizer: "olha como fez sucesso"

Eu digo, foi muito visitado, foi, mas trouxe alguma evolução para a linguagem e sua comunidade? não, só piorou a relação entre iMasters e a comunidade PHP. Valeu a pena?

Vamos levar a linguagem a sério e vamos levar nós mesmos a sério. Não quer comentários passionais? não use tirinhas de piada e termos liches como POG, escreva algo que irá trazer algum retorno, sem precisar passar pela "flame".

Augusto Pascutti
Augusto Pascutti

Várias pessoas contribuíram de forma construtiva, acho que vou dar meu pitaco se me permitirem:

- O que é uma função?
É um local de escopo bem definido e isolado do resto da aplicação. O intuito dela é receber um dado e retornar outro dado.

- O que é um objeto?
Um local de escopo bem definido e isolado do resta da aplicação. Obivamente dá pra descrever melhor isso, mas porra, a idéia principal é essa.

- O que é uma lamba?
Basicamente? Uma função!

Se um objeto, segue os mesmos princípios de uma função, e uma lambda é uma função, em que universo eu posso falar que uma lambda não tem função em orientação a objetos?

Quer uma metáfora?
jQuery é do caralho! Mas HTML e jQuery não tem nada a ver. Sacou?

João Batista Neto
João Batista Neto

Olá Augusto, sei que assim como o Rafael, você é um cara que está a frente de grupos de usuários e, exatamente por isso, sua participação aqui é extremamente importante.

Ao contrário da discussão com o Glass, vou focar minha resposta exclusivamente ao PHP, que é justamente o objetivo desse post.

-- O que é uma função ?
-- O que é uma lambda ?

Deixando o aspecto funcional de lambda e focando exclusivamente no PHP (que é imperativa), uma lambda é uma função e, nesse ponto, você está correto.

Funções são passos que devem ser executados, são tarefas às quais passamos uma entrada, processamos, entregamos uma saída. Essas funções possuem um escopo bem definido, mas podem fazer referência ao estado do ambiente, tanto com as lambda quanto nas funções convencionais (em que podemos usar globais ou superblobais) e podem ser reutilizadas em vários pontos da aplicação.

Como muitos aqui mencionaram Javascript, vamos fazer uma comparação direta, na qual tentarei dizer porque Closure é um erro *no* PHP, enquanto é uma solução no Javascript.

No Javascript:
alert( typeof function() {} ); //function

No PHP
var_dump( gettype( function() {} ) ); //string(6) "object"

No Javascript uma função anônima é tratada por função, enquanto no PHP é tratada como objeto.

Por um lado, isso pode ser justificado com o seguinte:

No Javascript:
alert( function() {} instanceof Function ); //true

No PHP:
var_dump( function() {} instanceof Closure ); //bool(true)

Estaria tudo certo, mas veja:

Function.prototype.test = function() { alert( 'ok' ); };
var a = function() {};
a.test(); //ok

Ou seja, no Javascript podemos trabalhar com funções anônimas como funções, mas também podemos trabalhar como instâncias de Function e, assim, podemos criar toda uma hierarquia de novos objetos, utilizar composição e agregação e, ainda, manter estado.

function Test( n ) {
this.state = n;
this.test();
};

Test.prototype = new Function();
Test.prototype.test = function() {
alert( [ 'ok' , this.state ].join( ' ' ) );
};

var a = new Test( 10 );

Por outro lado, o mesmo não se aplica ao PHP: Closure é uma classe final e não instanciável.

Qual a diferença ?

No Javascript:
alert( new Function() instanceof Function ); //true

function Test() {}
Test.prototype = new Function();

alert( new Test() instanceof Function ); //true

No PHP:
var_dump( new Closure() instanceof Closure );
//Catchable fatal error: Instantiation of 'Closure' is not allowed

class Test extends Closure {
}
//Class Test may not inherit from final class (Closure)

Bom, ela não é instanciável, não é extensível e, em termos de design, não possui responsabilidade.

Closure, no PHP, no que diz respeito à orientação a objetos, não passa de uma função.

Utilizando exclusivamente no paradigma procedural, podemos fazer coisas interessantes, eu mesmo já postei no blog do Davi Ferreira um uso de funções anônimas em PHP: http://www.daviferreira.com/posts/php-retornando-todas-as-combinacoes-possiveis-de-um-array-multidimensional

Mas no PHP, Closure não tem espaço na parte de orientação a objeto pelo simples fato de sua implementação não ser, a nível de linguagem, orientada a objeto.

Outro ponto que não podemos esquecer é que PHP é também uma linguagem reflexiva, ou seja:

function a() { echo 'test'; }

$b = 'a';
$b(); //test

Ainda:

function foo( $a ) { $a(); }
function bar() { echo 'test'; }

foo( 'bar' ); //test

Ao meu modo de ver, a implementação de Closure no PHP é um erro.

Quer trabalhar de forma procedural? SHOW, o PHP oferece milhares de funções para isso, inclusive pacotes como MySQLi que também oferece esse meio.

Quer utilizar funções anônimas em conjunto com a forma procedural? Fantástico, elas na forma procedural do PHP são ótimas, não fosse o fato de serem tratadas como objetos (que é um erro).

Quer trabalhar de forma orientada a objetos? SHOW, o PHP oferece mecanismos poderosíssimos para tal, além da SPL e de várias classes já existentes, temos toda uma estrutura para criação de classes, interfaces, empacotamento e separação em namespaces.

Mas tratar a implementação de Closure, NO PHP, como uma implementação orientada a objetos, é o mesmo que tratar o código abaixo como orientado a objetos:

function foo( Closure $a ) {
$b = $a();
$b();
}

foo( function() {
return function() {
echo 'test';
};
} );

João Batista Neto
João Batista Neto

Talvez, em um futuro, se essa implementação de Closure no PHP for ajustada, meu ponto de vista em relação a ela mude. Mas hoje, a saída do fragmento abaixo:

var_dump( gettype( function() {} ) );

Deveria ser: string(8) "function"

E, caso quisesse utilizar type hint, deveria ser:

function foo( function $bar ) {}

Da mesma forma que é utilizada para arrays:

function a( array $b ) {}

O grande erro HOJE no PHP é tratar Closure como um objeto, quando não passa de uma função.

Glass
Glass

Eita frescura!

Você basicamente tá discutindo semântica. São meros detalhes na implementação.

Nenhuma linguagem é pura e perfeita, nem o Haskell!

Quer brincar de reclamar?

Eu sou total fanboy de Ruby, e o Ruby tem um problema de implementação parecido, só que no PHP isso nem me afeta, já no Ruby... Nele, o lance das funções é umas 10x pior: os métodos não são exatamente "primeira classe" e é preciso acrobacias com reflection para transforma-los em variável e vice versa. Já os blocks são objetos, omg!

O Python acerta isso de primeira, de forma linda, assim como o Javascript.

Maaaaaas o Python tem o mesmo problema dos métodos-mágicos do PHP. E tem um monte de funções tipo length(objeto) e não objeto.length() como era de se esperar num OO estilo Java/Ruby/Smalltalk.

Acontece que a comunidade aprendeu a viver com esses detalhes e a tirar vantagem (resumo da história: métodos mágicos são usados como se fossem uma "interface", em vez de herdar de objeto global raiz).

Ahhh e o JavaScript tem o problema dos operadores. O == é cheio de detalhes toscos, o operador de igualdade correto no JavaScript é o === e ponto final. O CoffeeScript acertou isso. O Crockford explicou bem isso tudo.

Falando em CoffeeScript, que diabos é aquele sistema de ~~classes~~? A herança prototipal do JavaScript (estilo Self) é linda, pra que estragar? Classes numa linguagem funcional? Okay, funcional impura, mas lindamente funcional. Tá de zoeira né?

O Haskell é do caralho e a sintaxe de declaração de funções é uma lindeza só, mas a . porcaria . dos . pontinhos . pra . composição . de . função é de traz pra frente! Alguém tem que corrigir aquilo urgentemente, ninguém nunca viu pipes em UNIX?

(Eu queria ter alguém pra fazer piada com Poneis Malditos/Pontos Malditos no Haskell)

O Erlang é uma lindeza de linguagem, meu xodó novo, mas PQP que lerdeza de IO, como aquilo é lento.

E os parenteses do LISP? no fim do programa sempre sobra um ))))))))))))))

Ultimamente a única coisa que realmente me tem deixado feliz é o C#, mas a sintaxe LINQ imitando banco de dados é péssima para leitura. Eu sei ler e escrever SQL enquanto durmo, eu sei programar LINQ usando a interface normal, mas eu não consigo entender absolutamente nada daquele "FROM objeto xyz SELECT sei lá o que WHERE xyz lambda".

E o Java? String e Int por exemplo não são objetos, como no SmallTalk ou Ruby. E as classes anônimas, que são utilizadas como se fossem closures? Mesmo "problema" do PHP (função que vira objeto), só que a sintaxe é beeeem pior - praticamente uma aberração.

E o C, que é a melhor linguagem do universo, que tem uma Standard Library que é horrorosa de ruim, e todo mundo concorda com isso?

E o C++ que já é ruim só de ter existido?

--

Mas eu não tô reclamando. Só tô exemplificando.

Reclamar é fácil, difícil é usar esses detalhes pra evoluir a linguagem e o ecossistema. Sabe os padrões do GoF? Eles simplesmente estavam trabalhando pra superar as limitações das linguagens orientadas a objetos da época.

Limitações.

Mas até hoje tem gente tentando descobrir os limites das linguagens de programação. E estão conseguindo.

Você já viu o Sinatra, framework do Ruby? Se o livro do GoF tivesse sido escrito hoje, aquilo seria um padrão. Estaria logo no começo.

Já viu o SeaSide Framework ou a linguagem OPA (www.opalang.org)? Você cria links, mas no lugar de endereços, você coloca código. Sim, você joga uma closure dentro do <a href=""> e o programa abstrai o mecanismo de chamada pra você. Genial né? Parece uma grande loucura, mas é um novo padrão.

No mundo funcional tem um monte de gente trabalhando com cálculo-pi e reatividade. No mundo da programação concorrente existem os padrões de tolerância falha do Erlang. Existem os Atores, também no Erlang e no Scala.

Estes são todos padrões de design. Linguagens diferentes, limitações diferentes, padrões diferentes.

É só isso que eu vim dizer. Quem só reclama e tenta resolver as coisas colocando objetos quadrados nos buracos redondos fica pra trás. Quem sabe dar a volta por cima e superar os limites das linguagens entra pra história.

Glass
Glass

Apenas corrigindo:

Se você quer implementar interfaces iguais e comportamentos diferentes, use interfaces. Se quer implementar interfaces iguais e comportamentos ----também iguais----, utilize mixins/traits.

William  Bruno
William Bruno

É muito simples apenas virar e dizer para o outro 'vc precisa estudar'.
Estou no meio do caminho e um pouco perdido com esses estudos.

Não conheço a maioria dos que comentaram aqui 'negativamente', e nem nunca li nenhuma publicação de vocês, que tivesse uma única intenção desprovida de retorno: Ajudar a comunidade. Ensinar. Repassar conhecimento.

Somos todos bons, temos nossas próprias verdades, e daí em diante ?
Que tal aproveitar melhor essa força e disposição ?


Muitos desenvolvedores php atuais, não possuem nível de conhecimento sequer para entender o artigo. Alguns como vocês, estão além, e são capazes de criticar com fundamentos. Que tal criarmos algo realmente produtivo disso ?

Silvano
Silvano

William, creio que você não conhece ainda a comunidade PHP e o pessoal que está à frente dos grupos de usuários.

Te convido a participar de algum grupo de usuários do seu estado e de eventos de PHP. Inevitavelmente você vai dar de cara com alguém dos que estão defendendo PHP neste artigo e as chances são ainda maiores de que esta pessoa estará palestrando pra repassar conhecimento da forma adequada :)

Abraço!

Silvano
Silvano

Aqui está uma forma de encontrar os GU's

http://www.php.org.br/

Daniel Lima dos Anjos Pinheiro
Daniel Lima dos Anjos Pinheiro

Não acho que o artigo foi tãooooooo ruim assim. Um pouco tedencioso, é claro. Mas quem amaaaaaaaaaaaa PHP ficou irado com a situação. O autor força muito pra resolver soluções por patterns (o que não acho errado) sendo que a linguagem oferece atalhos para solucionar problemas que o paradigma OOP resolve dificilmente.

Como falei, e o(a) Glass também falou, os traits não são considerados uma gambiarra da linguagem, e sim uma forma de resolver um problema de herança multipla, e resolve de uma forma muito boa através de "composição". Acho que foi aí que o autor pecou mais. Até porque, como alguns aí já falaram, ele parece ter derivado do Java e sua comunidade totalmente fiel aos patterns - consequência das limitações da linguagem.

Para iniciantes ou programadores que estejam aprendendo OOP é um artigo do tipo "pula da ponte que eu também pulo", mas pra quem já tem experiência foi um tanto estranho.

Acho que a gente pode tirar conclusões boas e ruins com o artigo (principalmente nos comentários).

E também faço das palavras do Augusto Pascutti as minhas:
+ Criticar a linguagem é tenso;
+ Doctrine e Symfony 2 são a prova de que o PHP está muito maduro (usam todos os recursos da linguagem);
+ Não é um Phd formado no MIT que inventou um pattern que sempre vai resolver seus problemas, apesar de ser bom usá-los.

João Batista Neto
João Batista Neto

Daniel, concordo contigo, assim como concordei com outros acima, de que apenas "criticar a linguagem é tenso", mas é tão tenso quanto ser fanboy de da mesma linguagem.

Cada linguagem possui pontos altamente positivos, tão como pontos negativos. Adições ao PHP como os namespaces são fantásticas, assim como a adoção de Unicode.

Minha crítica foi especificamente à alguns recursos recém adicionados, não à toda a linguagem.

Não acho que um paradigma é superior a outro, nem que uma linguagem é superior a outra. Como ferramentas, apenas devem ser utilizadas na hora apropriada, da forma apropriada.

O que, no meu ponto de vista, é inapropriado, é a saída abaixo:

var_dump( gettype( function() {} ) ); //string(6) "object"

Justamente o oposto do Javascript:

alert( typeof function() {} ); //function

Nada contra trabalhar de forma funcional, imperativa, procedural, orientada a objetos ou qualquer que seja o paradigma.

Sou contra function() {} ser tratada pela linguagem como "object" e não como "function", como de fato é.

Minha crítica e preocupação é justamente essa, e não à linguagem como um todo.

Os traits, por exemplo, é uma forma de compor classes, reaproveitando código através de fragmentos de implementações reutilizáveis sem a necessidade de contrato, e é totalmente diferente de composição e agregação de objetos.

Reinaldo Mendes
Reinaldo Mendes

Quanta bobagem em um só artigo. Nunca progamou em ruby, python, javascript?
Para começar funções anonimas(callbacks) não são de programação procedural, são de programação funcional.
Você por acaso já utilizou funções anonimas em pascal ou c?
Quanto aos Traits, ele é semelhante aos mixins do ruby que é um recurso muito poderoso para reutilizar código sem ter que ficar utilizando 'design patterns' OO para fazer a mesma coisa.
Aliás RCP não é a mesma coisa que Traits, pois o código não será duplicado, será DRY

Olha sinceramente. Seu artigo é ridículo

Aurélio Saraiva
Aurélio Saraiva

Amigo, foi perda de tempo ter que ler esse artigo.

Você começo um com uma pergunta estranha "O que você fará com isso ?"
$o = new SomeClass();

Se você fizer a mesma coisa com qualquer linguagem nenhuma vai te dizer a interface de cara, o que facilita a vida do programador nessa hora são as IDE que faz um mapeamento dos métodos e atributos e não a linguagem.

--

Eu utilizo programação procedurais, OO e funcional em JS, ela te permite a mesma coisa por que ninguém critica ela? Por que é como foi dito acima bom senso na utilização o recurso esta disponíveis para fazer que quiser desde que o teu problema seja resolvido por que não utilizar?

--

Design Pattern eu estudei praticamente todos e desconheço um projeto que utiliza todos os malditos design e ainda assim não projetos fantásticos.

Existe um problema com o design pattern assim como o livro PMBok.
PMBok é um livro que contém ideias de soluções que funcionaram e server como uma guia de referencia é errado dizer que PMBok é uma metodologia e que você deve seguir a risca, assim funciona com o Design Pattern são soluções, guia referencias não quer dizer que você tenha que executar exatamente como é descristo entenda o problema e adapte a sua necessidade.

PHP não é Java não misture as coisas!!!

O autor sumiu? ficou sem argumentos?

Bruno
Bruno

Caraca!!! Pra ser sincero eu não conheço todos os conceitos que usaram (tanto no post qto nos comentários), não conheço PHP e tão pouco sei como ele evoluiu, mas esse post foi extremamente rico em discussões. Se o objetivo do autor era "não receber críticas" ele foi por água abaixo... mas se o objetivo foi de levantar uma discussão inteligente e bem fundamentada, PARABÉNS!

João Batista Neto
João Batista Neto

Na verdade Bruno, meu objetivo era causar a discussão.

Sei que no Brasil temos desenvolvedores de altíssimo nível, o que eu queria era justamente chamar esses desenvolvedores para a discussão. E pelos conteúdos dos comentários, o objetivo foi alcançado.

Tanto é que, tanto o título, quanto o final do artigo, foram utilizados interrogativas.

Bruno
Bruno

João, nesse caso, só tenho a agradecer pelo seu artigo e pela sua coragem de expor seu ponto de vista!

Uma das coisas mais interessantes, no meu ponto de vista, é ler uma discussão de alto nível e sair cheio de dúvidas!!! Como todos da área sabem (ou deveriam saber) são nossas dúvidas que nos motivam a estudar cada vez mais!!!

Novamente, parabéns pelo post João, rendeu uma excelente discussão.

Rafael Dohms
Rafael Dohms

João,

Se você quer "chamar eles pra discussão", é só usar o twitter ou email. Posts polemicos, posts que tentam fazer do PHP ser o java, ou que são extensamente críticos só tem um efeito negativo no mercado da linguagem, e claro, isso gera mais indignação de pessoas que ganham seu salario com isso.

Mas ok, se vc quer nos chamar para a discussão o primeiro passo agora é abrir o espaço para um post de resposta, e se possivel evite usar o iMasters como "flame bait".

Vamos fazer essa discussão em um lugar feito para discussões. Ou até mesmo fazendo um post em conjunto com a opinião contraria, se vc quer discussao é importante que ambos pontos de vista tenham a mesma atenção, e não que a opiniao contraria fique apenas nos comentários, o que acha?

Se precisar de canais de comunicação com esse publico, me avise fico feliz em te apontar na direção deles.

João Batista Neto
João Batista Neto

Rafael,

A ideia de um post em conjunto com a opinião contrária é simplesmente fantástica, produtiva e tem um grande potencial de contribuição para toda a comunidade.

O problema de se utilizar Twitter é que é uma ferramenta extremamente limitada para esse propósito e via email é extremamente fechado para a comunidade como um todo.

Concordo também contigo que a opinião não deve ficar nos comentários, por três motivos:

1. O espaço é curto e não dá a atenção/visibilidade devida.

2. Percebi que alguns levaram mais para um lado pessoal em vez de fundamentar seus comentários.

3. Normalmente os comentários são feitos por impulso. Um post preparado e planejado tem muito mais valia que comentários inflamados.

Meu objetivo aqui foi o de refletir e sua proposta de um post resposta fundamentado, é tudo o que precisamos. Fique a vontade para sugerir a forma e formato que achar mais adequada para ela. No que depender de mim, meu apoio é integral.

Quanto a canais de comunicação, fiquei curioso agora quanto a direção deles.

Jean Nascimento
Jean Nascimento

Melhor seria um post em seus blogs pessoais ou aqui no fórum de PHP?

Filipe La Ruina
Filipe La Ruina

Concordo com o Jean, esse artigo deveria ter sido escrito no seu blog pessoal.
Querer chamar atenção por fazer um post desse é igual dizer que queria chamar atenção de alguem dando um tiro no pé dela, não faz sentido, mas resolve o assunto.

Jean Nascimento
Jean Nascimento

Melhor debate nos comentários EVER!

Rodrigo
Rodrigo

Parabéns João, ótimo artigo.

Leandro Reis
Leandro Reis

Seguinte, na minha opinião uma linguagem "forçar" um programador a seguir um método de desenvolvimento é dar tiro no pé, totalmente anti-produtivo. Quanto mais flexível, melhor. Aí que entra o conhecimento dos programadores, de saberem utilizar cada recurso da melhor maneira possível e para isso só há uma solução: estudar, estudar e estudar.

Ótima discussão, do ponto de vista do autor que misturou JAVA e PHP em um mesmo pote.

LOL
LOL

O artigo foi ótimo e o debate melhor ainda.

A mim, particulamente, não incomoda tanto a adição de funcionalidades, por mais estranhas que sejam (goto, traits...), mas sim, negar suporte a elementos que o mercado utiliza: PHPUnit, Doctrine, Symfony2 e parece que o Zend 2 necessitam utilizar annotations, e a proposta foi negada, forçando o uso de anotações dentro de comentários!!

Tellys Castro
Tellys Castro

Muitas vezes a ideia de uma polêmica nao é achar a solução e sim causar a discução e ai sim tirar algo novo, esse é o caminho do progresso. Parabens pelo artigo.

No entanto, não espere aprovação dos apaixonados...rs

Falando de pontos-de-vistas técnicos, claro, toda forma límpida vai ser sempre mais valorosa que as outras. Nao levar em conta suas alegações seria uma burrice, afinal todos nós estamos em constante aprendizagem e nada melhor que aprender abservando.

Mas falando de resultados, e partindo do princípio que paixao pura e simples, tanto do seu lado que se esforça para uma estrutura mais pura ou por outros lados que misturam tudo... o importante nesse meio é o resultado.

O cliente quando solicita um programa, ele quer, rapidez, funcionalidade e preço, entao antes de sermos programadores, temos que ser administradores e nisso esta contido nao so uma programação de modo que traga ao programador rapidez para seu manejo e modificação mas tambem os resultados esperados do cliente.

Moral da historia, antes de seu sistema estar dentro de algum padrao ache uma funcionalidade para ele, um cantinho em meio a tudo isso que nos cerca, depois disso o progresso é invevitável, e se nao tiver dentro de algum padrão de facil manejo o sofrimento tambem... rs

João Batista Neto
João Batista Neto

Tellys,

O grande problema da paixão é que ela, normalmente, cega.

Concordo em absoluto contigo que resultado é importante, independentemente de linguagem ou paradigma.

Mas também não podemos, simplesmente, aceitar que os fins justificam os meios pois, do contrário, veremos "goto" na construção de toda uma aplicação como justificativa de resultados.

PHP é uma linguagem fantástica com recursos fantásticos, mas não podemos simplesmente ficar quietos ao ver *alguns* recursos adicionados (goto, entre outros), simplesmente porque somos apaixonados pela linguagem.

O final do seu comentário é perfeito: "Moral da historia, antes de seu sistema estar dentro de algum padrao ache uma funcionalidade para eleel, e se nao tiver dentro de algum padrão de facil manejo o sofrimento tambem... ".

Tellys Castro
Tellys Castro

Isso mesmo João, se encararmos o PHP como uma oficina, quanto mais ferramentas tivermos melhor poderemos executar nossas ações. Antes de ser programador, fui mecanico e já vi nas oficinas ferramentas caríssimas, para execuções muitos simples, ao passo que um araminho fazia o mesmo serviço e era sem valor..rs em fim.. Discutir métodos é extremamente necessário, para o fortalecimento da ferramenta, mas o alicerce da coisa esta na competencia.. e o PHP é competente para muita coisa, exemplo disso... sao os grandes portais que o usam.

"TODA TECNOLOGIA SUFICIENTEMENTE AVANÇADA PARECE MÁGICA."
CARL SAGAN

mas para alguns...

"TODA LINGUAGEM SUFICIENTEMENTE AVANÇADA PARECE POG."

[]'s

Rodrigo Santiago Motta
Rodrigo Santiago Motta

Porra, até Carl Sagan , ufologia RULES !

Caio Costa
Caio Costa

"Glass quebrou!"
Eita mês que nego ta querendo tacar pedra no PHP, desde a forma mais leiga até a meio avnaçada como neste caso!
Os comentários já dizem muito do que deve ser dito ao autor!
Cada linguagem cabe em um custo/prazo/tamanho de um projeto, e mais além, como utilizar a linguagem!
O objetivo do PHP é ser diversificado!
Vamos exemplificar: faça um hotsite de 3 páginas com um simples cadastro em uma delas em Java e em PHP e veja quanto tempo irá levar para cada um!
O único flexível entre bem organizado e com patterns e etc é o PHP!
Além disso, se fizer de forma simples (procedural) qualquer um com pouco experiência pode dar manutenção!
Já com Java se torna mais custoso, simples assim!

Resumindo, tudo depende da finalidade!

Hussani Silva de Oliveira
Hussani Silva de Oliveira

O artigo não acrescentou em nada pelo conteúdo.

Vamos ao debate.

Como muitos falaram por aqui, o PHP é diferente das outras linguagens pela liberdade que ela fornece aos desenvolvedores.
Podemos usar POO, programação procedural, funcional, utilizar os padrões GoF ou simplesmente fazer de outra maneira.
Cabe ao desenvolvedor escolher que estrutura será utilizada. Não tem receita de bolo pra se fazer um projeto.

Sobre as clousures só uma pergunta, como assim elas não tem espaço em OO?
Cara, isso é ridículo.

-

O PHP está crescendo cada vez mais, e adicionando recursos a linguagem.
Mas temos que lembrar que a linguagem é uma ferramenta.
Quem usam são os desenvolvedores, e cabe ao desenvolvedor usá-la da melhor forma (ou não).
Tem muita gente começando agora a programar, e lógico que vão fazer da forma mais difícil algumas vezes, mas a linguagem não influencia ninguem a programar melhor ou pior.
Existem programadores ruins tanto em PHP, quanto Java ou qualquer outra linguagem.

Falar que POG é influenciada pela linguagem é a mesma coisa de falar que não sai gol no futebol por causa da bola.

-

Cuidado com o que voce escreve.
Com certeza os comentários gerados aqui foram mais importantes do que a informação passada pelo artigo.

João Batista Neto
João Batista Neto

Hussani, sobre as Closures, eu acabei de comentar sobre meu ponto de vista, lá em cima para o Augusto.

Diogo
Diogo

Sou desenvolvedor/analista há vários anos, só em PHP já se vão 6 anos.

E por mais que eu goste dela, não me sinto ofendido quando alguém fala mal dela, pelo contrário, vejo que quem "xingou", só o fez por não ter conhecimento da linguagem.

No caso do artigo, concordei em algumas coisas, discordei em outras. Li todos os comentários, e cheguei a uma conclusão.

Aqueles que estão preocupados com "ahhh se os novatos lerem esse artigo, terão uma imagem errada da linguagem"... esqueçam. Isso é problema deles, e se forem estudiosos e interessados, tirarão conclusões próprias.

E parabéns aqueles que criticaram com fundamentos os erros que o autor cometeu. É assim que a discussão enriquece.

Abs

Diogo
Diogo

Só pra complementar o que eu disse.

Não seja fan-boy de nenhuma linguagem ou ferramenta. Saiba criticá-la e elogiá-la, sem fanatismos.

A coisa mais chata é "programador" defendendo só por "gosta" de algo.

Linguagem é ferramenta! Bom programador é aquele que é bom "cuca".

Wellington
Wellington

Penso que a melhor forma de se programar é aquela que me diverte.
Muito bom o artigo, abs!

Adler Medrado
Adler Medrado

Se eu fosse uma pessoa que ainda estivesse nessa de "minha linguagem preferida é melhor do que a sua" eu perguntaria o seguinte: "O que você pensa de uma linguagem que adicionou suporte ao for each apenas na sua versão 1.5?".

Em minha opinião, apesar de respeitar o ponto de vista do autor, este artigo foi péssimo, com título tendencioso e que de fato não acrescentou nada nem ao PHP e nem a quem leu algo aqui, ao contrário de muitos comentários que irão ajudar aqueles que acabaram se sentindo confusos depois da leitura.

Se você acha que a tipagem do PHP é tão ruim, o que me leva a crer que você pensa o mesmo de outras linguagens de script, porque nos últimos tempos surgiram diversas linguagens com características das linguagens dinâmicas que 'rodam em cima' da JVM?
Para mim isso se deve ao fato de o Java NÃO SER EFICIENTE EM TODOS OS CENÁRIOS POSSÍVEIS apesar de algumas pessoas tentarem dizer o contrário, portanto, pelo menos em minha humilde opinião as linguagens devem ser usadas para resolver problemas em cenários onde elas se adaptam melhor e neste ponto o PHP é excelente pois permite ao desenvolvedor escolher usar ou não certas funcionalidades que ele oferece o que significa que o leque de possibilidades para usar a linguagem é maior.

Esses foram apenas meus dois centavos, pois os demais comentários já são suficientes para refutar os pontos principais deste artigo.

Até mais!


Fernando Andre
Fernando Andre

Grande comunidade no Brasil :)

Também não gosto dos magic methods, mas dão jeito, uso __set __get entre outros, e devo concordar que em termos de leitura de código não torna as coisas fáceis por vezes até para o IDE que uso. Em grandes equipas programar desse modo fica dificil mas também se não tiver docs ou os mesmos não forem lidos tudo o que fez vaideixar de ser usado.
Posso é dizer que trabalhei com malta nova em PHP e ter de lidar com alguns "hacks" não foi uma dor de cabeça mas feriu-me as vistas, depois em termos de reaproveitamento de codigo, saber o que chama o quê e onde é feito acaba por consumir tempo em debug e desenvolvimento.
O OOP acaba por servir de controlo a certas loucuras que possam surgir para desenrascar e que depois ficam "coladas" ao projecto. E isto já vi acontecer várias vezes a vantagem é que o cliente gosta da rapidez de resposta!

Ademir Cristiano Gabardo
Ademir Cristiano Gabardo

Como se POG existisse só no PHP, acho que antes de escreverem as primeiras linhas de código fonte já existia o POG.
Da pra fazer POG em qualquer linguagem. Duvida? Deixa um programador novato escrever, e logo vai descobrir que sim.
Mas PHP tem melhorado muito. Ficando OO de verdade.
Se aproximando de linguagens como Java e .NET.
Está mais maduro. E isso que realmente importa.
E de quebra, temos bons frameworks que ajudam a organizar a bagunça.
Ó Deus MVC, salvai estas pobres almas....

Raphael de Almeida
Raphael de Almeida

Tentar se aproximar de uma sintaxe pouco expressiva é uma pena.
Antes o PHP evoluísse para o caminho de linguagens como Ruby ou Groovy (para defender a JVM, mas só a VM, kkkk)

God
God

<?php print "Calma galera" ?>

A maior POG que eu fiz na vida foi um trabalho da faculdade que tinha que fazer um sistema de farmacia em java... e não podia usar nenhum framework ou ORM... bom... eu fiz um framework MVC podre com url´s amigáveis e fiz o sistema.... tiramos 10 com um total "Java POG"... quem quiser:

https://github.com/caferrari/farmatads

[]'s

Felipe Maia
Felipe Maia

Nossa, vocês "Grandes Programadores" ficam perdidos no universo astral de siglas, números e conceitos, filosofias etc... Esquecem que o lugar onde estamos discutindo serve exatamente pra isso. Se grandes pensadores, físicos, matemáticos e toda a "gangue" de caras NERDS não questionassem o que acontecia a volta deles na época deles, nossa discussão aqui, hoje, nunca teria acontecido.

Pra vocês (não digo todos, mas quem se sentiu ofendido por alguém que menosprezou o pouco conhecimento de alguém, sabe quem é) é fácil criticar desconstrutivamente. Porquê não fazem o mesmo que o AUTOR? Acredito que incentivar a discussão não seja pecado algum, ao contrário, como numa área comercial, a concorrência gera a competitividade com qualidade, o que faz melhorar produtos, atendimento, resposta e etc... Aqui não vejo diferente, pra mim essa discussão é de grande importância, sou iniciante na área, e aprendí coisas com vocês que não saberia se não fosse dessa forma, pelo menos não do jeito como foi passado aqui.

Gostei muito disso:

"Não conheço a maioria dos que comentaram aqui 'negativamente', e nem nunca li nenhuma publicação de vocês, que tivesse uma única intenção desprovida de retorno: Ajudar a comunidade. Ensinar. Repassar conhecimento."

O AUTOR foi feliz em levantar esse assunto aqui, talvez os "apaixonados" pelo PHP tenham se irritado com o que foi dito, mas nós, os meros mortais não nos prendemos aos conceitos, apenas queremos saber mais e com isso passar o conhecimento adiante. Não sejam egoístas, se não concordam, ao invés de fazer comparações com esta ou aquela linguagem, dêem uma solução lógica. Mostre que ele está errado e diga exatamente o porquê. Mostra a cara.

Rafael Dohms
Rafael Dohms

Acredito que esta correções foram feitas nos comentários. Porém ao chamar a linguagem toda de POG e usar todos cliches que foram usados, o autor claramente tinha a intenção de causar polemica e ele mesmo atraiu comentário "apaixonados". É tudo uma questão de posicionamento, e tirinhas comicas não ajudam a seriedade de uma discussão.

Édipo Costa Rebouças
Édipo Costa Rebouças

Acho que faz muito tempo que não leio tanta besteira em um único artigo. Para resolvermos problemas práticos não usamos somente teoria, padrões, etc... Usamos os recursos que a linguagem que iremos utilizar. Pergunto ao autor qual o melhor exemplo de encapsulamento, um set mágico do PHP, um set onde o programador sabe que está utilizando um método em Java ou um set em C#? eu classificaria C# em primeiro lugar pela facilidade de implementação de um get, set, PHP em segundo lugarpor não ser tão meio chato fazer os metodos mágicos e em Java em último lugar por vc saber que esta usando um método no que deveria ser uma propriedade.
Um exemplo da utilidade de métodos mágicos, veja a classe http://framework.zend.com/manual/en/zend.db.table.relationships.html e sua implementação com métodos mágicos.
Mais uma coisa, php são é só OOP, então, mesmo que se eu concorda-se com qualquer coisa sobre esse post, não é o proposito dá linguagem ser somente OOP.

Marcos Santos
Marcos Santos

Após ler o artigo (Não fiz leitura de todos os comentários) eu fiquei me perguntando:

A onde esta o moderador do imasters??? (Por isso resolvi fazer um cometário, pois devemos cuidar com a qualidade dos artigos.)

Um indivíduo que se diz : "engenheiro de aplicações e trabalha com ambiente web desde 2000 em diversas linguagens". Posta um artigo para tentar gerar polêmica em algo realmente inútil. O texto escrito é um desperdício de bytes, pois não agrega nada para ninguém!

Por isso vou limpar o nome de nós verdadeiros de engenheiro de software, pois em nosso trabalho diário nós:

1º - Geramos soluções e não polêmicas. As polêmicas deixamos para as conversas do cozinha e não em um artigo!

2º - Engenheiro sabe aproveitar o melhor dos recursos que lhe são oferecido! Não fica chorando por que sua caixa de ferramentas não tem esmalte da cor verde!

3º - Engenheiro usa seu tempo livre para projetos hard ou open, sempre agregando valor para um grupo ou comunidade e não para ficar fazendo artigos inúteis que fazem outras pessoas perderem tempo.

Espero aqui ter limpado a "honra" de todos os verdadeiros engenheiros de software, que trabalham duro todos os dias, muitas vezes fazendo milagres com as tecnologias escolhidas pelos clientes e assim atingir os objetivos do projeto!

return \'NULL by Google\'
return \'NULL by Google\'

Porque não encontrei nada na web com seu nome ? Fazendo seus projetos hard's AND open

Engenheiro dos engenheiros
Engenheiro dos engenheiros

eu me divirto com a soberba de alguns.

Rodrigo
Rodrigo

Só tenho uma coisa a dizer para os fansboy

Para cada sistema, existe uma solução que se adapta melhor.

PHP é uma ótima linguagem sim, concordo, pode se desenvolver grandes sistemas, porém devemos pensar, o que nosso sistema irá fazer, qual o cliente final?
;)

Reinaldo Deprera
Reinaldo Deprera

Nunca vi tanta ignorância incorporada em um único texto.

Imagina se a moda pega nos articulistas programadores C++/PHP

André Manoel Lima da Silva Souza Pereira
André Manoel Lima da Silva Souza Pereira

Acredito que uma linguagem de programação não deve ser focada em um único paradigma...

Linguagens devem disponibilizar a maior quantidade de recursos possíveis para a utilização quando for preciso.

Posso fazer um site com POO, ou com Programação estruturada... Como posso utilizá-la para realizar operações em um servidor...

Gosto de PHP por causa da dinamicidade da linguagem e porque vc não perde tempo aprendendo a configurar vários e vários arquivos xml .config e etcc para atualizar uma página como Java.
Não tenho nada contra Java... mas tudo que é adicionado em uma linguagem deve ser para benefício da comunidade.

Se adicionaram Traits é pq creio que alguém deve usar para alguma coisa... e nem sempre essas coisas são POGS como vc disse.

Abs.

Pedro Neto
Pedro Neto

o quanto aprendi com o artigo:
[][][]

o quanto aprendi com os comentários:
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]

o autor deveria inserir no final de seu texto que as pessoas devem ler os comentários...

lembrando que o fórum e provavelmente o site do próprio iMasters é feito em PHP

Jhonatan Morais
Jhonatan Morais

Caramba Joao Neto, quantos comentarios. vc realmente tocou em um ponto critico.

Mas nao pude conter me com seus ataques ao PHP. assim gostaria registrar algumas coisas.

1º - Amigao PARA, de querer fazer PHP se tornar JAVA, ou outraliguagem semelhante semelhante.
Cada liguagem é destinada ao atendimento da uma solução
especifica, ou selecionada.

2º - Todos adoram comparar a organização de outras liguagens com a liberdade do PHP.
Por gentileza entendam, que no JAVA (por exemplo) vc possui diversas bibliotecas que lhe
obriga a desenvolver de uma maneira especifica e unica, e ainda o que fica fora
disso pode ser resolvido com um pattern especifico.

Agora o que impede impede de isso acontecer no PHP??? nada alem da sua
capacidade de FAZER organização e nao usar uma pronta. Quer usar um patern do
java no PHP? USE!, a mas o php nao tem a classe pra fazer tal coisa... FAÇA UMA.

3º Sobre os Metodos "magicos" do PHP " __NomeDaFunção"

Cara, o php lhe da a opotunidade de utiliza-los, use se quiser. Ha não quer? nao
use! Toma um exemplo:

- Vc nao gosta do __set() ou __get()?
particularmente eu tambem nao gosto nada deles, por isso eu uso a mesma ideia
do java eu crio cada classe com seus respectivos getters e setters e
posteriormente sua DAO. pronto problema resolvido.

- entao vc nao gosta do __Contruct()? eu tambem nao, por isso declaro construtores
como os do java.

- Vc ja leu as classes que o pablo d'oglio escreveu?? são incriveis.
e funcionam perfeitamente.

Viu só SINTA-SE LIVRE, se você for responsavel seu codigo será excelente!.

4º Sobre a tipagem do PHP.

ok ok, php nao é fortemente tipada E DAI!, por isso ele é PHP senao ele seria
outra coisa. A mas pra ser OO tem que ser fortimente tipada e ble ble ble e bla bla
bla. TA BOM. quer tipagem entao cria seus metodos e defina o parametro que ele
deve receber Ex:

public myClass{

private $foo;

public function setFoo(Foo $value){ $this->foo = $value; }


}

Pronto! Agora vc tipou se vc passar qualquer outro parametro que nao seja uma
intância da Classe Foo, este nao será aceito.

Ai vc reclama Ahhh mas e por exemplo se que quero garantir uma String ou um
Integer, amigao faça suas validações existem funções especificas para isso. vc
esta usando PHP ele é assim e pronto, isso nao faz dele nem errado nem certo.


5º A OO do PHP nao existe ela é uma grande POG...

Amigao me responda uma coisa, em uma liguagem que deseje ser realmente OO ela
deve aceitar tipos primitivos????.

Pq herança deixou de ser recomendada devido ao seu forte acoplamento
e agora utilizamos interfaces??? Conceitos mudam né?

Bem essa são alguma considerações. mas o que gostaria mesmo de frisar é:

Parem de buscar a liguagem perfeita, isso nao existe! o
que existem são desenvolvedores que conhecem a fundo ferramentas
e tecnicas de desenvolvimento e buscam constantemente
aprimora-las. ou seja a qualidade do codigo ou produto final nao está
relacionada a liguagem e sim a experiencia de quem o
escreveu.

Valdirene Junior Cruz Neves
Valdirene Junior Cruz Neves

Estou comentando aqui porque concordo plenamente com essa resposta. Valeu Jhonatan!

Agora ao meu amigo João Batista, eu ri muito do ser artigo, sério mesmo, queria ibope? Parabéns, conseguiu, e mais, vou te ajudar comentando aqui.

Meu amigo, você fala que para o cara entender a classe o criador da mesma deve estar ao lado, pois é, programadores Java e C# também não sabem fazer mágica, por isso existe a engenharia de software e os comentários.

Na empresa aqui trabalhavamos com .NET e estamos aos poucos migrando para o PHP, e antes que venha defender o Java, já trabalhamos com Java. Mas apesar da linguagem vou te dizer uma coisa, não existe linguagem POG, existe programador POG, pois o amigo acima lhe mostrou isso em detalhes.

Já ministrei vários cursos de PHP e sempre deixo bem claro para meus alunos: PHP não é orientado a objetos, mas tem suporte. Se você não gosta da linguagem, beleza, cai fora, é melhor para comunidade, pois vai existir menos um para fazer cagada com o nome da linguagem!

Tenho muitos amigos que passaram aqui pela empresa e estão trabalhando em órgãos públicos com .NET e Java e sabe o que eles me falam? Que ficam impressionados com a quantidade de gambiarra nos códigos. Acho que falta mais maturidade da sua parte com relação ao mundo da programação, pois Java não é totalmente OO, eu acho que você deveria saber disso, pois você pode fazer um programa totalmente estruturado com ela. Não sabia? own... Que linguagem você programa mesmo?

Vou deixar uma frase que vi uma vez (não lembro o autor): 'o php é fácil de aprender, logo é fácil do programador fazer cagada'.

Pedro Neto
Pedro Neto

O Jhonatan Morais falou tudo...concordo plenamente...
acho que a principal característica do PHP é dar liberdade...voce pode programar certo, mas voce pode programar errado também...
foi o que vi em outro comentario aqui: se vc dirigi mal o carro, não significa que o carro é ruim, é o motorista que é ruim...
provavelmente o autor do post tava querendo postar no twitter: meu artigo foi o mais comentado!

William  Bruno
William Bruno

Acho que nenhum colunista se orgulha de ter um artigo com vários comentários, qndo a maioria desses, não são "positivos"

Tenho artigos aqui em que fui criticado por 1 pessoa, mas essa unica pessoa, fez uns 15 comentários. Este, talvez eu tenha sido infeliz.

Mas um outro meu, possui mais comentários, e nenhuma menção negativa. Desse sim, eu me orgulho. Inclusive, pq pela movimentação que gerou, a equipe iMasters fez sorteio de 2 livros.

Felipe Maia
Felipe Maia

Não me recordo de ter lido alguma resposta satisfatória nos comentários acima, mas, gostaria que alquém respondesse com soluções práticas pra que nós, que ainda estamos iniciando, saibamos como proceder:

"PHPog é uma questão de design ou a linguagem está apenas se adaptando à falta de design nos códigos PHP escritos por POGramadores?"

Aguardo...

Evandro Oliveira
Evandro Oliveira

Nem um nem outro. PHP está evoluindo seguindo sua filosofia. Programação procedural e programação OO ganharam novas ferramentas. Sei que Design Patterns não dizem respeito exclusivamente a OO, mas a maioria sim. Muitas coisas escritas no Wordpress (que por um acaso mescla OO com Procedural) não seguem implementações documentadas de padrões, nem por isso é uma ferramenta escrita por POGramadores.

Felipe Maia
Felipe Maia

Isso é exatamente o que eu penso. Acredito que caras do tipo que perdem dias, as vezes semanas escrevendo uma biblioteca de código, como as do portal que estamos utilizando agora (que com certeza as têm) não deveriam ser menosprezados. Viva o PHP!!!

Steimntz Machado de Figueiredo
Steimntz Machado de Figueiredo

Artigo muito bem feito, parabéns.

Glass
Glass

C-c-c-c-combo-breaker ;)

Daniel Ribeiro França
Daniel Ribeiro França

Esses comentários estão bem "modinha" mesmo, não pode falar a palavra "preto" que já vem gente falando em racismo.

Excelente artigo João, aprendi, concordo e discordo de alguns pontos. Artigos são feitos por pessoas e o valor dele é a opinião da mesma. Algo além disso é "Tutorial" ou "Manual".

ps.: Eu queria é que o pessoal que postou aqui fosse no manual do PHP e na hora de comentar lá, escrevessem algo importante, manual ta cada dia mais pobre...

Augusto Pascutti
Augusto Pascutti

Eu acho que você não usa o manual do PHP então meu caro. A estrutura de índice interna do manual foi reformulada recentemente, e toda hora tem gente traduzindo ou atualizando conteúdo.

Dá uma olhada em: http://svn.php.net/viewvc/phpdoc/

Daniel Ribeiro França
Daniel Ribeiro França

Respondeu por responder mas vamos lá.

Minha observação foi sobre a quantidade de contribuições( comentários ) na documentação que ao invés de dar um exemplo de como utilizar uma determinada função, por exemplo, mostra uma outra maneira de se fazer a mesma coisa que ela faz usando de outros artifícios. Tô mentindo? Então você que leu pouco...

Por exemplo : http://br.php.net/manual/en/function.array-chunk.php

Os "Evangelistas" estão sendo os mais orgulhosos hoje em dia, curioso isso, tá subindo a cabeça? Costumava ir em palestras de vocês quando estavam começando a palestrar e tinham uma atitude muito diferente da atual.
Posso estar errado com relação a este comportamento, mas não sou o único a perceber isso. Consideramos pessoas como você, Dohms e Guilherme Blanco, nossos guias aqui no Brasil.

Estud@ante
Estud@ante

O Autor me parece um pouco como Hitler, quer formar uma comunidade homogênea onde todos programem da mesma forma as dele. Apesar de ter sido infeliz na escolha do título, ajudou a mim e a outras pessoas as esclarecerem algumas dúvidas devido aos comentários.


Tiago de Assis Gonçalves
Tiago de Assis Gonçalves

O PHP oferece flexibilidade e no final o que importa é entregar valor ao cliente.

Quem faz POG é o programador independente da linguagem ou do paradigma.

Rodrigo Santiago Motta
Rodrigo Santiago Motta

O post realmente foi bem desafiador, e percebi que houve uma trollagem do Neto acima dele. Realmente ele queria provocar a galera porque através disso obteria muitas informações bacanas. Um post que fez até os comments serem valiosos de forma equivalente (ou mais valiosos que o post dependendo do ponto de vista de cada um) !! São poucos assim.

O post sugere DP para "boas práticas". Nem sempre é assim. Mas é uma boa escolha !

Ser for bom no que faz independente da linguagem e do que ela proporciona (seja com Design Patterns, seja com programação funcional etc), terá sempre resultados positivos.

:D

Programador
Programador

"$o = new SomeClass();

Como eu sei que você é um programador que gosta de orientação a objetos, lhe entrego a instância acima e digo para você trabalhar com ela.

O que você fará com isso ?

- A não ser que o desenvolvedor que escreveu SomeClass esteja ao seu lado ou que você tenha poderes mágicos, você não saberá como trabalhar com isso, e não saberá pelo simples fato de que você não conhece a interface desse objeto."

Que lixo de argumentação. Mesma coisa que tentar convencer programadores à não utilizarem métodos mágicos porque estes dificultam code completion. Se você for tentar defender um ponto de vista, utilize argumentos concretos. Talvez do seu ponto de vista toda classe deva implementar uma interface ? Que horrível.

Luciano Pinheiro
Luciano Pinheiro

O PHP é uma linguagem extremamente fácil e flexível. O modelo de programação hoje ainda é extremamente limitado. PHP é uma linguagem que permite que você pegue alguns atalhos, muito úteis. É só usar com responsabilidade.
Eu, particularmente, prefiro um código enxuto a um padrão de projetos. Pra mim, um código bem estruturado, pequeno, fácil de ler, bem dividido e com documentação inline é mais importante que a miríade de padrões, módulos e heranças de classes semanticamente perfeitas.
Eu sei que isso parece uma infâmia a você. Mas é apenas uma questão de gosto pessoal. Não é uma falha da linguagem. É uma forma diferente de trabalhar. A Orientação a Objetos não é o modelo definitivo, principalmente esta OO que usamos hoje. Quando ela foi criada, seu objetivo era fazer com que trabalhássemos com objetos interagindo. Hoje, o que menos existe em um código são objetos da "área-fim" do programa.
O em geral PHP simplifica as coisas, passando por cima de alguns puritanismos.

Qual a sua opinião?

Comentários considerados ofensivos serão moderados.
KingHost

Parceiros

IBM
PagSeguro
Internet Innovation
Dialhost
HostNet
Tecla
KingHost
DotStore
Dinamize