2008-01-09 11:15:42
tags: 

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

                

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

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

Olá amigos. Estamos de volta depois de muita farofa, bacalhau, doce de leite, maionese, pamonha, queijo cavalinha, uma nova geladeira que não chega, livros e muita alegria. Espero que todos tenham passado dias maravilhosos nesse fim-de-ano e que possam ter aproveitado esses dias pra curtir a família e os amigos!

Mas chegou a hora de voltar para o batente. Antes que vocês comecem a mandar os já tradicionais emails "Cadê o 22! Queremos o 22!" eu já estou escrevendo mais um capítulo desta série singela, que procura explicar os conceitos mais enrolados de orientação a objetos em uma linguagem que todos aqui possam facilmente entender. E, pra ser bem honesto, os emails cobrando o 22 na verdade já começaram a chegar, então a hora é essa. Não estou reclamando de vocês de forma alguma, caros leitores! A pressão ajuda! Obrigado a todos que cobram, que agradecem, que mandam correções e puxões de orelha, sua contribuição faz disso aqui um lugar melhor.

Ah, o Natal. Que loucura que é o Natal. Falar sobre oop aqui no Digitalminds sempre é divertido porque eu tenho que bolar metáforas interessantes pra que o assunto não fique chato no primeiro parágrafo.  Então, como não poderia deixar de ser, o artigo de hoje está em clima de Natal. Não, eu não estou maluco, eu sei que o Natal já passou. Mas a segunda semana de janeiro não tem muita coisa interessante pra nos oferecer, a não ser que você conte o Dia de Reis.

O DIA DE REIS! É isso! Meu Deus como pude esquecer! Muito bem, senhores, esqueçam o natal. É hora de falar de Belchior (ou Melchior), Gaspar e Baltazar.
Não, senhores, não estamos falando de Belchior, nem de Gaspar, ou mesmo de Baltazar. Estamos falando de três magos persas, sacerdotes de Zaratrustra, homens sábios que conheciam profundamente a astrologia e que vislumbraram um sinal - na noite do dia 25 de dezembro do ano 1, souberam pelo brilho da estrela de Belém que um Rei nascera. E para comprovar que a wikipedia é sempre uma diversão, veja este parágrafo:

A melhor descrição dos reis magos foi feita por São Beda, o Venerável (673-735), que no seu tratado “Excerpta et Colletanea” assim relata: “Melchior era velho de setenta anos, de cabelos e barbas brancas, tendo partido de Ur, terra dos Caldeus. Gaspar era moço, de vinte anos, robusto e partira de uma distante região montanhosa, perto do Mar Cáspio. E Baltazar era mouro, de barba cerrada e com quarenta anos, partira do Golfo Pérsico, na Arábia Feliz”.

Uau. Sábios, caldeus, Ur, Pérsia. Agora que consegui a atenção total e irrestrita de vocês, futuros reis magos da OOP, e cobri todos de Incenso e Mirra, é hora de falar de uma classe importantíssima que ficou faltando no nosso grande esquema das coisas: a venerável classe ModelCollection.

Lembram que optamos por simplificar as funcionalidades da classe Model, fazendo com que ela realizasse operações somente em registros únicos no banco de dados? Muito bem, senhores, a classe ModelCollection aparece para nos salvar nos casos em que precisamos trabalhar com conjuntos de registros. Aqui é bom repetir o aviso: esta implementação é diferente da utilizada nos frameworks que utilizam o pattern ActiveRecord, como o Cake. Nestes frameworks todas as operações com registros e conjuntos de registros são feitas pela classe Model e suas subclasses. Assim, um objeto da classe model típico destes frameworks tem funções tanto para buscar, editar, salvar e deletar um registro quanto para buscar conjuntos de registros. Isso faz com que o objeto da classe que estamos usando não tenha um mapeamento direto com os dados que estão no banco. Isso me incomoda muito, pois eu gosto de pensar no objeto como uma coisa, uma representação virtual dos dados que estão no banco. Pra mim é estranho usar o modelo para retornar uma lista de registros. A nossa implementação vai claramente mapear um registro no banco a um objeto da classe correspondente, e um conjunto de registros a uma coleção de objetos da classe correspondente. Exemplo: nossa classe Post. Teremos no banco a tabela Posts, com os campos title e text, por exemplo. Para acessar e alterar  o campo de título de um post em nosso framework vamos seguir os seguintes passos:

  1. Criar um novo objeto da classe Post fazendo $post = new Post();
  2. Carregar os dados do registro que queremos alterar com id número $id  usando $post->loadById($id);
  3. Mudar o título usando $post->setTitle("Novo Título!");
  4. Salvar o post com $post->save();
Para criar um novo post, é simples:
  1. Criar um novo objeto da classe Post fazendo $post = new Post();
  2. Mudar o título usando $post->setTitle("Título do Novo Post!");
  3. Mudar o texto usando $post->setText("Texto do Post!");
  4. Salvar o post com $post->save();
Nessa implementação vamos poder acessar as variáveis do objeto usando getters normalmente, por exemplo, $post->getTitle(); Podemos também criar vários atalhos: o construtor do Post pode receber  o Id diretamente e já carregar os dados automaticamente. Podemos implementar a interface ArrayAccess para permitr coisas como print $post['title'] sem nenhuma dificuldade. Enfim. A coisa é boa. Aguardem que vem coisa ótima por aí.
Mas até aí, nenhuma novidade. O que muda é a forma de trabalhar com conjuntos de dados. No Cake, esse trabalho seria feito por funções na classe Post que retornariam Arrays contendo vários ítens. E isso deixa tudo confuso, no final das contas. O que proponho é o seguinte:
  1. Criar um novo objeto da classe PostCollection fazendo $collection = new PostCollection();
  2. Carregar o conjunto de registros usando uma das várias funções disponíveis, por exemplo $collection->loadAll();
Muito simples. E agora temos um objeto da classe PostCollection carregado de registros, com métodos super úteis para manipular os dados, paginar, enfim, uma belezinha. E vamos implementar uma coisa sensacional: a interface iterator, disponível na fantástica biblioteca SPL, proveniente de UR, na Pérsia! Mas isso já é assunto para o próximo episódio. Até lá!


2007-12-04 02:20:34
tags: 

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

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

Olá amigos. Em nosso último encontro finalizamos nossa primeira análise das classes principais do MVC: Model, View e Controller. Sei que muitos de vocês estão ansiosos para começar a codificar mas ainda temos bastante mufa pra queimar antes de começar a digitar código php!

Bom, pra começar, um pouco da história do cinema: quem não se lembra de Sean Connery como o policial irlandês em Os Intocáveis ? E de Kevin Spacey, como o bobalhão "Verbal" em Os Suspeitos ? E de Gene Hackman como o xerife mau, muito mal de Os Imperdoáveis ? Muito bem, o que esses três papéis interpretados por estes grandes atores têm em comum? As três interpretações foram premiadas com Oscars de melhor ator coadjuvante. E por quê todo este papo cinematográfico? É que hoje vamos falar de uma classe coadjuvante que é fundamental em nosso quase-framework: nosso amigo Dispatcher.

Muito bem, como já falamos algumas vezes, nosso framework é bastante esperto: ele vai permitir que acessemos métodos de nossos controllers simplesmente interpretando uma URL. Por exemplo, para acessar o método view() do controller BlogPost para ver o post com o id 19 nossa url seria

http://nossoblog.com.br/blogpost/view/19

Ok, mas quem transforma uma coisa na outra? Quem chama o que? Como isso funciona na prática?

Senhores, eu vos apresento a classe Dispatcher, encarregada de interpretar as urls de nossa aplicação e executar os métodos apropriados nos controllers corretos. Ela também vai checar se o controller e o método requisitados realmente existem, e vai apresentar mensagens de erro em caso negativo. Por fim, a classe vai separar corretamente os parametros do request, enviando um array já certinho para o método que foi chamado.


Uma outra função muito interessante de nossa classe Dispatcher vai ser interpretar extensões; sim, amigos, vamos fazer com que a extensão definida na url defina o layout e o template a ser utilizado, seguindo uma estrutura de arquivos pré-determinada. Exemplo: se ao invés da url acima tivessemos alguma coisa como

http://nossoblog.com.br/blogpost/view/19.xml

Nosso framework, ao invés de utilizar o layout em /layouts/default/blogpost/view.php e o template /templates/default/blogpost/view.php utilizaria o layout /layouts/xml/blogpost/view.php e o template /templates/xml/blogpost/view.php. Deu pra sacar o poder? Assim vc pode criar outputs diferentes pra toda a sua aplicação sem nenhum estresse. Bonito demais. Pra colocar o sistema disponível em wap, bastaria fazer um layout e um template, no caso /templates/wml/view.php e /layouts/wml/view.php e utilizar os códigos wml ao invés de html dentro deles. Eu adoro isso.

Você acaba de perceber a beleza de uma solução MVC. A lógica fica totalmente separada da apresentação, o que faz com que seja fácil fazer apresentações totalmente diferentes com o mesmo conteúdo. Sweet!

Vamos então à descrição da classe?

Class Dispatcher


Propriedades

$url

String. Propriedade que irá conter a url requisitada.


$controller

Objeto do tipo Controller. Esta propriedade irá conter uma nova instância do controller requisitado. No nosso exemplo, BlogPost.

$method

String. Método a ser executado no controller requisitado. O método será view(), no nosso exemplo.


$parameters

Array com os parâmetros enviados na requisição via get ou post. No exemplo acima, ele teria uma entrada $parameters["default"]=>"19" já que não nomeamos este parâmetro no request. Poderíamos, se nós fossemos chatos, ter montado a url assim:

http://nossoblog.com.br/blogpost/view/id/19


e aí nosso array seria montado na forma $parameters["id"]=>"19"

O framework vai ser esperto o suficiente pra perceber quando temos só o valor ou o par nome/valor e vai resolver tudo isso pra nós.

Métodos


parseURL()

O método parseURL() interpreta uma URL segundo os padrões combinados e popula as propriedades do nosso Dispatcher. Na prática, ele vai separar os pedacinhos da url, dividindo a string em partes. Em primeiro lugar, ele remove a string relativa ao protocolo (http:// ou https://). Depois, o domínio. Ficamos então com a estrutura

controller/método/parametros.extensao

Aí fica facil separar tudo, não?


parseParams()
O método parseParams() faz o mesmo que a função acima, só que para os parâmetros enviados por get e post. Tudo o que estiver entre um ? e o ponto da extensão será considerado parâmetro get. Também será considerado parâmetro get tudo o que vier depois da action requisitada, no caso de nossos exemplos acima "19" e "id"=>"19". Tudo o que vier no $_POST vai ser incluído também em nosso array $parameters.

Repare que pra simplificar as coisas não vamos considerar a diferença entre get e post em nosso array $parameters; será igual fazer um request por get e post. Juntaremos tudo no array, sem distinção.

2005-11-29 04:31:59
tags: 

Mais um show do pessoal da 32bits

O Morena e o Ney, meus amigos da 32bits e flash warriors, dão mais um show no novo site da Sandpiper. Reparem os detalhes. Blurs dinâmicos, fotos da tela instantâneas, um fundo totalmente orgânico... Ah se o logo da Sandpiper fosse um pouquinho mais maneiro...
2005-11-21 11:48:05
tags: 

Como consertar o que não está quebrado?

Larry Tesler tem um dos melhores empregos do mundo: acaba de ser contratado como vice-presidente de user experience pelo Yahoo. Mas como melhorar a experiência de uso de produtos que são considerados os melhores da web?
2005-11-20 13:41:46
tags: 

A sua Home Page é imatura?

Interessante análise do pessoal da Adaptive Path sobre o porquê da confusão existente nas home pages de corporações e alguns portais.
2005-11-17 13:25:56
tags: 

Simplicidade

A beleza das coisas simples.
2005-11-13 12:57:15
tags: 

Design Eye for the Usability Guy

Designers fazem uma plástica no site de Jakob Nielsen, o Useit.com - e o resultado é simplesmente maravilhoso.
2005-11-08 14:48:38
tags: 

Gates, Jobs, & the Zen aesthetic

Um brilhante artigo comparando apresentações de Steve Jobs e Bill Gates, e de quebra dando informações valiosíssimas sobre atributos zen no design. Leitura obrigatória.
2005-11-08 01:44:29
tags: 

REVOLUÇÃO ETC...

Vale a pena visitar o belo site do Henrique Costa Pereira, o Revolução Etc.
2005-11-05 21:29:20
tags: 

Interface Design Tip: Find the Epicenter

Post bem interessante do Jason Fried (Basecamp) sobre como ele projeta suas aplicações web.
2005-11-03 18:55:42
tags: 

Novo Yahoo! Maps mostra que beleza é fundamental

O novo Yahoo! maps mostra que na briga com o google o yahoo! vai investir na interface com o usuário e no design. Vale uma olhada.
2005-10-25 04:22:38
tags: 

A maioria dos designers não pensam sobre design

Não sou eu que tô dizendo, antes que os designers xiitas venham me atacar aqui...
2005-10-24 07:00:13
tags: 

O Dia Online

É uma pena. Mais uma chance desperdiçada de fazer um projeto inovador no mercado brasileiro.
2005-10-19 17:32:45
tags: 

aleluia!

By the way, there's no Save command in Aperture. As you make changes, those changes are recorded in a SQL database.
Pra que botão save meu deus! Até que enfim! É o fim da ditadura do save! O Aperture simplesmente grava todas as tuas ações de forma não-destrutiva. Infinitos undos. Você nunca perde nada. Parabéns, Apple!
2005-10-11 04:40:28
tags: 

The evolution of gaming: computers, consoles, and arcade : Page 1

Gaming today is a widely recognized part of our cultural landscape. But those of us over thirty are just old enough to remember a time before gaming, before digital entertainment invaded the arcades, our computers and our homes.
2005-10-10 15:25:50
tags: 

The New Microsoft Office User Interface Overview

When planning the next release of the Microsoft Office system of products, we took on the challenge of making the core Microsoft Office applications easier to work with. Taking into account extensive usability data and recent advancements in hardware and software, the team has delivered the most significant update to the Microsoft Office user interface (UI) in more than a decade.
Tenha medo. Tenha muito medo. Via USEIT.COM.
2005-09-26 02:24:41
tags: 

Programming for the kids | geekBlue.net

Computer programmer Igor Kholodov has created a game that he says can entertain kids while at the same time teach the basics of programming languages like Java. After six years of development, Kholodov has finished making the game, called "c-jump." The board game turns players into skiers, who must race down a mountain in the quickest way possible. With every roll of the die, players must follow instructions that resemble computer program codes.
2005-09-25 19:26:41
tags: 

Subvert from Within: a user-focused employee guide

It's one thing to talk about--and execute--a user-focused approach when you're a small company or an independent contractor. But what if you are, in fact, a fish in a sea as vast as, say, Microsoft? Can you hope to make a difference? Or does working at the "DarkStar" suck the soul from any employee with a passionate users bent?
2005-09-22 16:27:06
tags: 

John Porcaro: mktg@msft: What Women Gamers Want

"Women gamers are very social, very strategic. They like to work together to solve problems", says Charlotte Stuyvenberg, director of global communications for Xbox.
2005-07-24 07:54:34
tags: 

The Fold n' Drop, New User Interface | geekBlue.net

You really have to see it in action before you can see how amazingly useful this is. The Fold N' Drop interface lets you manage your windows as if they were stacks of papers on a desk. You first grab the file you want to move, and then you can lift corners and peek under, you can leaf through them, one by one, until you find the window you want and drop your file right in.
2005-07-24 07:53:09
tags: 

O menor web site do mundo | geekBlue.net

Smallest website in the world. You might want to change your screen resolution in order to read the page. Enjoy!
2005-07-24 07:25:42
tags: 

Slashdot | So You Want To Be a Game Designer?

Gamespot is running a feature which talks to designers such as CliffyB and Akira Yamaoka on the subject of what it means to be a game designer
2005-07-13 11:12:22
tags: 

Boing Boing: Glowing temperature-sensitive sink-fixtures

These sink-fixtures from Germany\'s Hansa have temperature-sensors that light up different LEDs to indicate the water temp, and replace the traditional tube-shaped spout with a trough that exposes the water as it courses out.
2005-07-13 06:13:59
tags: 

Don´t click it.

Dica do Morena.
2005-07-13 06:10:14
tags: 

OK/Cancel » About OK/Cancel

OK/Cancel is a comic strip collaboration co-written and co-illustrated by Kevin Cheng and Tom Chi. Our subject matter focuses on interfaces, good and bad and the people behind the industry of building interfaces - usability specialists, interaction designers, human-computer interaction (HCI) experts, industrial designers, etc.

Dica do Hans.
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-03-24 18:14:21
tags: 

Todo designer do mundo queria trabalhar na Apple...

Maneiro. Mas sempre falta aquele toquezinho.