2007-11-22 01:44:13
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 20)

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 20)

Para ver os artigos anteriores desta série, clique aqui.

Olá pessoALL. Estamos aqui mais uma vez pra falar de Orientação a Objetos de um jeito bem prático, utilizando o pattern MVC para exemplificar conceitos importantes. A linguagem escolhida, você provavelmente já sabe, é PHP. Então sinta-se à vontade, sente mais perto da fogueira que já vamos começar nosso papo.

Chegamos a um momento importante de nossa série. Vamos falar hoje do último vértice da tríade MVC, mais especificamente a classe View. Você lembra que deixamos a classe View por último por se tratar do conceito mais simples dos três? Muito bem, chegou a hora de ver se a coisa é tão simples quanto falamos.

Nossa classe base View terá a responsabilidade de imprimir nossas páginas HTML, juntando o conteúdo dinâmico obtido por nossos Controllers ao código que colocamos nos templates que criamos. Portanto, primeiro precisamos definir direitinho o que é um template dentro de nosso framework, já que existem inúmeras definições por aí.

Nossos templates serão páginas php especiais, contendo basicamente html, que vão ser utilizadas por nossa classe View para imprimir as páginas de nossas aplicações MVC na tela. Normalmente nestes templates vão conter todo o html básico da página e comandos PHP para imprimir as informações dinâmicas provenientes do controller, normalmente usando só algumas poucas funções do PHP como echo, print e foreach.

Um exemplo de template talvez deixe isso tudo mais claro. Imagine que já temos tudo pronto em nosso sistema de gerenciamento de blogs, e chegou a hora de fazer o template que mostra um post. O código deste template (muito simplificado, claro) seria algo assim:
<h1><?php echo $this->data['BlogPost']['title'] ?></h1>
<div class="post"><?php echo $this->data['BlogPost']['text'] ?>
</div>

Reparem que não precisamos incluir no template nenhuma informação de tipo de documento (DOCTYPE) ou mesmo a seção <head>. Nossa classe View vai colocar tudo isso automaticamente pra nós, de acordo com definições gerais que vamos colocar em outros arquivos, chamados de layouts. Os layouts são basicamente arquivos HTML sem a seção <body> do html, e servem justamente para que não precisemos ficar repetindo estas informações toda hora. A classe View vai combinar layouts e templates para construir a página. De forma simplificada, portanto, podemos dizer que nossos templates são o corpo do documento html (<body>), e os layouts são o resto. Deu pra sacar?

O que os templates têm de especial? Nada, sinceramente. Especial é o acordo que fazemos para só utilizar html e funções de apresentação dentro deles. Isso é fundamental para que não misturemos lógica (que deve estar toda no controller) e apresentação (que deve estar toda no template). Se você começar a usar outras funções que não echo, print ou foreach (ou alguma outra função de formatação, tipo printf ou number_format) dentro dos templates você vai voltar imediatamente pro inferno.

Alguns caras levaram isso tão a sério que chegaram a criar linguagens especiais só para não usar PHP dentro dos templates. O Smarty, um dos mais poderosos sistemas de template já escritos em php, faz exatamente isso.  Eles criaram tags especiais para cada uma das funções PHP de apresentação, além de terem bolado uma série de outras interessantes. Ao invés de escrever algo tipo


<h1><?php echo $nome ?></h1>


no Smarty você escreveria

 

<h1>{$nome}</h1>

Bem interessante, não? Isso força o programador a utilizar somente os comandos do Smarty, que são somente de apresentação.

Mas veja que desenvolver uma solução como essa dá bastante trabalho: no fundo, toda essa codificação especial precisa ser transformada novamente em PHP alguma hora. Os críticos dizem que isso é desnecessário e prejudica a performance, já que o PHP oferece todas essas funções nativamente. Bem, os caras do Smarty (e de outros template engines que existem por aí) contra-atacam dizendo que todos os templates são compilados e cacheados em PHP, de forma que a diferença de performance é mínima.

Nós não temos aqui a pretensão de escrever um Smarty; o caminho mais simples é usar PHP puro. Este, portanto, é o caminho que vamos seguir.

Vamos à nossa descrição genérica da classe View:

Class View
Propriedades

$data

Array associativo contendo todas as informações dinâmicas de modelos e coleções.

$url

String com a url que está sendo acessada.

$layout

String com o nome do layout a ser utilizado. O Default é nulo, o que irá fazer com que a classe View utilize um layout padrão.

$baseurl

String com a url base do site para facilitar a montagem de links e caminhos de arquivos.

 $variables

Array associativo que pode conter outras variaveis genéricas definidas pelo controller.

 

Métodos

render($action,$layout)

Imprime a ação $action usando o layout $layout. Os defaults são a ação corrente e o layout default.

setVariable($variablename,$value)

Define uma variável para uso no view.

setPageTitle

Define o título da página a ser impressa (na tag <title>)

renderError($error)

Imprime uma página de erro utilizando o layout default para erros.

 


2006-11-18 03:25:25
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 7)

Olá pessoal, depois de mais um longo e tenebroso outono(?!) de muito, muito trabalho estamos de volta. Muito obrigado por todos os comentários e emails, mesmo estando totalmente atolado de trabalho na 32Bits™ eu tento ler todos e respondê-los o mais rapidamente possível. Pra quem tá chegando agora no blog, meu email é danilo[arroba]digitalminds.com.br e você pode ver todos os artigos dessa série clicando no título deste post, ok?

Bom, muitos escreveram perguntando sobre os gnomos. Quando eles vão aparecer nessa tão complexa trama? Qual é sua verdadeira identidade? O máximo que posso dizer é que eles tem contrato para 7 temporadas, e que talvez as respostas ainda demorem um pouco a vir... (funciona pro Lost, não? ;-)

Mas voltando ao que realmente interessa, OOP, ou object-oriented programming, hoje quero preparar o terreno para os próximos episódios. Agora que os conceitos principais já foram apresentados a vocês (se você ainda não sabe o que são classes, subclasses, interfaces, etc, talvez seja bom dar uma olhadinha nos artigos anteriores) gostaria de começar a parte Zen de nossa série. Como nossa marca registrada é gastar metade do artigo falando sobre coisas que são apenas marginalmente relacionadas ao assunto principal, vou tentar explicar o que é Zen em apenas uma palavra, sem nenhum compromisso de conseguir. Vamos lá:

Prática.

Talvez seja mais simples enumerar tudo o que o Zen não é. Zen não significa calma. A frase "Fulaninho é Zen, não se irrita com nada" basicamente não significa nada. Zen não é um conceito esotérico. Zen não é magia, tampouco feitiçaria.

Prática. Contar diariamente de um até dez. Koan. Tornar-se um com o arco. Concentração. Mente de principiante. Buda. E por aí vai.

E o que tudo isso tem a ver com OOP? Bem, caros leitores, a experiência de programação em oop só pode ser totalmente vivida na prática diária. Ler sobre oop é ótimo, mas é como olhar para o dedo que aponta para a Lua, e não olhar a Lua propriamente dita. Como verdadeiramente aprender estes conceitos? Vivendo-os. Como quebrar os Koans das classes, interfaces e patterns?

Recebi alguns emails pedindo que desse exemplos do uso da OOP em situações do dia-a-dia. Muito bem, então vamos começar uma nova etapa dessa série: Digitalminds 2.0.

Já faz tempo que quero refazer o Digitalminds Blogging Engine, que mesmo tendo esse nome bastante pomposo é um script muito furreca, todo remendado, escrito na correria entre trabalhos. Então, vamos nessa? Vamos refazer juntos o DBE, usando os conceitos que falamos, e, ao final do projeto, lançamos o DBE como um produto open source para livre download?

Acho que é uma idéia legal. Tudo bem que já existe o WordPress, etc e tal, mas... se a gente for por aí, TUDO já existe. A idéia é aprender e curtir o processo. Quem se habilita?

Até a próxima. Não percam o próximo artigo, vamos listar nossas premissas para o projeto e quero as opiniões de vocês. Abraço.

2006-09-17 05:34:55
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 6)

(Para ver todas as partes desta série clique aqui)

Olá, pessoal, já estamos aqui de volta para falar mais um pouquinho sobre OOP, PHP, e outras siglas igualmente ininteligíveis. Hoje quero falar sobre um tema que sempre gera muita confusão: interfaces. E, é claro, não podemos falar de interface sem olhar a etimologia dessa palavra.

O prefixo inter- vem da preposição latina inter, que significa "entre, no meio de". A palavra face, também de origem latina (fascia), significa "camada externa". Juntando as duas coisas, temos um termo genérico que significa praticamente qualquer coisa em tecnologia. Temos interfaces gráficas, interfaces com o usuário, interfaces RS232, interfaces usb, e por aí vai.

O conceito denominado de interface em OOP é bastante diferente disso tudo. No nosso mundo imaginário de carros, superpoderes, gnomos e outras criaturas fantásticas orientadas a objeto, interfaces são simplesmente definições padronizadas de acesso a funções que estão dentro das classes que as implementam. Falando assim parece bem complicado, mas não é não. Na verdade, na verdade, se a gente olhar com muito cuidado, nós de fato já usamos o conceito de interface aqui mesmo nos artigos anteriores.

Explico: quando nós criamos uma classe, estamos criando também uma interface. Lembra que nós construímos dois carros, um FiatUno e uma FerrariF1, e ambos podiam ->acelerar() ? Justamente! Ajoelhe-se diante do poder das interfaces!

Ao estender a classe Automovel para criar a classe FiatUno e a classe FerrariF1 nós estamos automaticamente implementando a interface usada na classe automóvel nas duas. Assim, temos absoluta certeza que todas as classes-filhas da classe Automovel vão poder ->acelerar(). Esse é exatamente o conceito de interface: a padronização do acesso aos dados e funções de uma classe ou objeto.

Mas o que é realmente interessante é que algum desses gênios malucos que inventaram os conceitos de OOP acordou um belo dia e teve uma idéia brilhante: "Perai, mas eu não preciso ter que criar classes-filhas toda hora pra usar uma interface!". Nasciam as palavras-chave interface e implements, que permitem a criação de interfaces que podem ser usadas entre classes que não tem nenhum parentesco entre si.

E eu estou aqui para provar tudo isso implementando Superpoderes em Automóveis! Você há de concordar que um Automovel não tem nada a ver com um SerHumano, já que eles não têm nenhum parentesco. Como ter certeza que essas classes e todos os seus filhos possam usar objetos da classe SuperPoder de forma padronizada? É fácil:

Primeiro, criamos a interface SuperHeroi:

 interface SuperHeroi {
    public function ativar(SuperPoder $superpoder);
} 

Bom, como você pode notar, a função ativar só vai funcionar se você mandar pra ela o SuperPoder desejado durante a chamada da função. Se mandar texto, número ou qualquer outra coisa vai ganhar um erro de presente.

Agora vamos alterar nossas classes Automovel e SerHumano para implementar a interface SuperHeroi:

Class SerHumano implements SuperHeroi { 	
    public $nome;
    public $vivo; 	
    public function __construct($nome) {
        $this->nome = $nome;
        $this->vivo = true;  	
    }
    public function taVivo() { 
        if($this->vivo == true) {             		
            print "Sim, eu estou vivo, e meu nome é $this->nome!"; 	
        } else {             	
            print "..."; 	
        }  	
    }
    public function ativar(SuperPoder $superpoder){
        $superpoder->ativar()
    }
} 

e agora a classe Automovel:

 abstract class Automovel implements SuperHeroi {
     public $aceleracao;
     public $velocidade_atual;
     public $cor;

     public function acelerar() {
        $this->velocidade_atual = $this->velocidade_atual + $this->aceleracao;
        print "Acelerando! Agora a velocidade é de " . $this->velocidade_atual . "Km/h!";
     }    
    public function ativar(SuperPoder $superpoder){
        $superpoder->ativar();
    }
 }

 

Agora, tanto os objetos SerHumano quanto objetos da classe Automovel (incluindo aqueles das classes FiatUno e FerrariF1, já que pela herança um FiatUno ou uma FerrariF1 sempre têm todas as propriedades e funções da classe Automovel) já podem ->ativar() um SuperPoder. Como a classe SuperPoder é abstrata e ninguém consegue ativar um SuperPoder abstrato, vou ativar a SuperForca:

$meucarro = new FerrariF1('vermelha'); 
$meucarro->ativar(new SuperForca);
// Meu deus, posso levantar um caminhão! 

E os gnomos, você deve estar se perguntando. Eles virão... Eles virão...

2006-09-04 20:22:05
tags: 

TinyMCE

Se você ainda não conhece o TinyMCE, não deixe de dar uma olhadinha.
2005-11-21 11:35:56
tags: 

SAJAX - Simple Ajax Toolkit by ModernMethod

... e taí a parte que estava faltando: uma biblioteca ajax para php bem simples de usar.
2005-11-21 11:27:47
tags: 

Drag and Drop em JavaScript

A biblioteca do Walter Zorn é mais um exemplo dos recursos disponíveis nos browsers atuais. Junte uma pitada de Ajax, e não temos mais nenhuma desculpa pra não inovar em interfaces na web...
2005-11-02 10:59:40
tags: 

Brand Game está de volta

Brand Game, o blog da Mônica Sabino, está de volta com força total analisando a (falta de?) estratégia de marca do Google. Obrigatória leitura pra quem curte pensar branding e experiência do consumidor.
2005-10-25 23:21:52
tags: 

Macworld faz review do Flash Professional 8

O Flash 8, que meu amigo Daniel Morena não cansa de elogiar, foi analisado pelo pessoal da Macworld e ganhou quase a nota máxima.
2005-10-23 04:41:19
tags: 

Flock - até agora nada empolgante | BrunoTorres.net

Primeiras impressões do Bruno Torres sobre o Flock...
2005-10-23 03:07:37
tags: 

Flock, Under Those Feathers at PaulStamatiou.com

Excelente review do Flock, o novo browser que eu ainda tô com preguiça de instalar.
2005-10-21 18:01:04
tags: 

Video iPod Review - ArsTechnica

Review bem completo do novo iPod com vídeo... Vale a leitura.
2005-10-20 16:37:22
tags: 

Exporting a movie from iMovie HD to iPod

Want to put your own movies on your iPod? You can with iMovie HD and an iPod with video compatibility (currently Fifth Generation iPod). You also need to have QuickTime 7.0.3 or later and iTunes 6 or later installed - they're both free downloads!
2005-10-16 14:52:32
tags: 

How to Build a Universe That Doesn't Fall Apart Two Days Later

Science fiction writers, I am sorry to say, really do not know anything. We can't talk about science, because our knowledge of it is limited and unofficial, and usually our fiction is dreadful. A few years ago, no college or university would ever have considered inviting one of us to speak. We were mercifully confined to lurid pulp magazines, impressing no one. In those days, friends would say me, "But are you writing anything serious?" meaning "Are you writing anything other than science fiction?" We longed to be accepted. We yearned to be noticed. Then, suddenly, the academic world noticed us, we were invited to give speeches and appear on panels and immediately we made idiots of ourselves. The problem is simply this: What does a science fiction writer know about? On what topic is he an authority?
Phillip K. Dick, um dos maiores escritores de ficção científica do mundo, autor dos contos e histórias que deram origem a filmes como Blade Runner, Total Recall, Minority Report, Paycheck, entre outros, fala sobre o ofício. Vale a pena conferir.
2005-10-13 15:47:33
tags: 

Microsoft wants WebDesigners to de-hack their CSS - Forever Geek

In a recent entry on the IE Blog Microsoft appeals to web designers asking them to remove their CSS fixes for IE.
2005-10-05 06:28:23
tags: 

Peter Jackson Directing Halo - Forever Geek

ABCNews is reporting that Microsoft has tapped the same team responsible for The Lord Of The Rings Trilogy, including director Peter Jackson, to oversee production of the 'Halo' movie.
Isso vai ser muito interessante... quem conhece Halo sabe que o forte é o background, a costura da história. E Peter Jackson, bom, se você ainda não viu a trilogia, veja.
2005-09-22 23:12:42
tags: 

Smart Mobs: How do we hear music?

Mary Farbood,a Ph.D. student at the MIT Media Lab,and Josh McDermott,a Ph.D. student in MIT's Brain and Cognitive Sciences Department,have been at work for the past year on a study designed to measure the degree to which perceptions of music vary from culture to culture, MIT news reports.
2005-08-24 19:02:43
tags: 

Behold Google Talk! A Mini-Review

Google Talk has launched, and I'll give you my mini-review right now. Welcome to the Stone Age of instant messaging!
2005-07-28 11:40:38
tags: 

Boing Boing: New way to read on Mobile Devices

When I first tried RSVP reading, I felt overwhelmed. The words flashed on the screen to the beat of an unheard drum. I felt out of control. I couldn\'t pause and reflect after reading a sentence. But after five minutes or so, I got used to the ocular assault, and my mind seemed to shift into a different gear. By letting go, the words started flowing smoothly into my head. Because my eyes weren\'t shifting back and forth as they normally do when reading, everything but the words themselves faded away, and I found that I was actually enjoying the experience.
2005-07-15 07:08:20
tags: 

Siemens Ronaldo Limited Edition CX65 - Engadget - www.engadget.com

This is the either some of the best or some of the worst niche marketing ever: Siemens is doing a new limited Ronaldo (as in Ronaldo the Brazilian soccer player) version of their CX65 cellphone that will reportedly only be sold at a couple of chains in the United Arab Emirates (as in not in Brazil).
2005-07-09 06:59:16
tags: 

Boing Boing: Pixar artists launch indie comix company, blogs at Comic Con

Several artists from Pixar are joining forces to create comic book titles as E-Ville Press (short for Emeryville, where Pixar headquarters are located). Their work debuts at Comic Con in San Diego, July 13-17. Several titles will have corresponding blogs. Most of the artwork was digitally generated.
2005-06-03 03:55:10
tags: 

Star Wars Episode 3 Easter Eggs at Forever Geek

Apparently Revenge of the Sith has a number of \"easter eggs\" in the film. Basically, just little bits and pieces that you may not notice after watching it the first few times. Some of them you may not notice at all.

Starwars.com has compiled a pretty comprehensive list of what to watch and listen for. The most popular easter egg so far seems to be the appearance of the Millenium Falcon easing into one of the docking bays at the Senate.
2005-05-24 15:21:05
tags: 

A History of the GUI : Ars Technica

In what follows, I'll be presenting a brief introduction to the history of the GUI. The topic, as you might expect, is broad, and very deep. This article will touch on the high points, while giving an overview of GUI development.
2005-05-20 11:34:36
tags: 

OpD2d - Direct to disk audio recorder

This is a very simple little audio recording application. It can be used to easily record anything you can get into your soundcard direct onto your hard disk. You might also have noticed that it's got a bit of an odd interface
Uma opção pra quem não curtir o All2Wav...
2005-05-18 05:49:37
tags: 

A Queda! As últimas horas de Hitler

Que filmaço. A brilhante interpretação de Bruno Ganz mostra um lado de Hitler que finalmente me fez entender porque tantas pessoas amavam esse homem a ponto de cometer as atrocidades que cometeram. Imperdível.
2005-05-12 15:59:58
tags: 

Client Quotes

This is a collection of clients' quotes, unadulterated (except for formatting), from an old Dreamless thread, right up until Dreamless died and this thread was lost.

Dica do Bruno Torres.
2005-04-27 11:18:36
tags: 

Mp3 Gain

Se você é chato como eu e detesta a diferença de volume na masterização dos discos que estão no seu iTunes, seus problemas acabaram! O Mp3 Gain analisa seus arquivos e nivela o volume de todos eles. E o melhor é que a informação nos arquivos originais não é alterada.
2005-03-29 09:47:37
tags: 

Urban Pranksters

Fascinante o que um monte de gente desocupada pode fazer, especialmente em Nova Iorque.
2005-01-27 02:44:45
tags: 

Placa de TV/Rádio

Pessoal, algum de vocês pode indicar uma placa de captura de tv e rádio boa e baratinha? Tô pensando em começar a gravar umas coisas de tv e rádio direto no computador... quem puder indicar, por favor manda um email pra danilo@digitalminds.com.br. valeu.