• Nenhum resultado encontrado

• ActionContext - Representa o contexto de execução de uma Action, contendo todos os dados relacionados com a Action e do próprio Framework (ValueStack, Session, Re- quests,etc.).

• ValueStack - Representa a área de armazenamento que mantém todos os dados asso- ciados com o processamento do pedido. Desta forma não é necessário passar os dados de forma individual entre os vários componentes (classes) que estão envolvidos neste processamento.

• Object-Graph Navigation Language - OGNL - É a linguagem de expressões que permite obter e atualizar propriedades dos objetos, permitindo a manipulação de propriedades existentes na ValueStack.

• Results - Cada Action define um ou mais Results. Após a execução de uma Action, o Result indica o template que será responsável pela apresentação dos dados aos utilizados, constituindo a View.

3.4 r u b y o n r a i l s

Ruby on Rails (vulgarmente chamado de apenas Rails) é um excelente exemplo de um pro- jeto open-source bem sucedido. No entanto, não podemos discutir Rails sem antes discutir a linguagem de programação Ruby.

É um equívoco comum pensar que Ruby e Ruby on Rails são a mesma coisa. Embora intimamente relacionados, estes são distintos. Quando alguém diz Ruby, refere-se nor- malmente à linguagem de programação em si. Ruby on Rails é uma full-stack7

para o desenvolvimento de aplicações Web que foi criada com recurso a Ruby.

Rails ajudou a impulsionar movimentos como o Test Driven Development, mais conhe- cido como TDD8

, Pair Programming e outras metodologias ágeis. Desempenhou um papel importante no que diz respeito à adoção de Ruby no que diz respeito à escolha dos progra- madores.

Neste capítulo, pode ler-se uma breve história sobre a linguagem Ruby e aprender algu- mas das características. Em seguida, será apresentado como Rails passou a ser considerada por muitos uma das estruturas mais reconhecidas e emergentes para o desenvolvimento de aplicações web. Depois de apresentar os principais conceitos envolvidos no framework Rails são dedicadas secções à estrutura e componentes do Framework.

7 Full-Stack, é entendido como sendo uma super-Framework, que agrega Frameworks mais pequenas e especifi- cas que permitem assim desenvolver aplicações, sem ter de recorrer a outras fontes externas.

8 Test Driven Development (TDD), é uma técnica de desenvolvimento de software que se baseia num ciclo curto de repetições, primeiro o programador escreve um caso de teste automatizado que define uma melhoria

20 Capítulo 3. estado da arte

3.4.1 Ruby on Rails - Framework

História

Em 2001, David Heinemeier Hansson (o criador de Ruby on Rails) foi contratado por Jason Fried para construir uma ferramenta de gestão de projetos baseado em ambiente web, o que acabou se tornando a 37signals9

software como um serviço denominado por Base-Camp10 . Hansson decidiu iniciar o projeto através do desenvolvimento de uma framework web personalizada usando a linguagem de programação Ruby para evitar o que ele via como codificação repetitiva inerente as plataformas como Java. Ruby era quase desconhecido na época. A framework que Hansson criou mais tarde foi lançada como um projeto open- source, independente da ferramenta de gestão de projetos. O nome deste framework web open-source dado foi Ruby on Rails.

Em 2005, Hansson chamou a atenção da comunidade com um famoso vídeo chamado "Fazer um blog em 15 minutos.", onde mostrava uma introdução sobre desenvolvimento com Rails. No mesmo ano, a sua criação fez com que ganhasse o prémio Google-O’Reilly Best Hacker. O sucesso de Ruby on Rails é considerado por muitos, como o maior respon- sável pela aceitação em massa da linguagem Ruby. Desde então foram criados frameworks direcionados para a programação em linguagem Ruby, dando especial ênfase à framework MERB11

, que dividia alguns dos programadores. No entanto, em 23 dezembro de 2008 , foi anunciado (por Hansson no site de Ruby on Rails) que MERB seria fundida em Rails 3, sendo assim terminada a duplicação desnecessária em ambas as comunidades, e fechando o debate sobre quando escolher um sobre o outro. As melhores ideias, de ambos os la- dos foram escolhidas para criar um projeto melhor e mais forte. Este é um bom exemplo de como funciona a comunidade open-source de Ruby, sendo esta uma vantagem em com- paração com, por exemplo, o mundo Java, onde se pode encontrar dezenas de diferentes frameworks para os mesmos fins. Pela razão de existirem tantas opções, os programadores acabam confusos e por fazerem parte de diferentes comunidades ficam divididos. O apa- rente problema é existir por parte das comunidades, um objetivo comum, mas "remam"em direções opostas e devido a isso, á menos colaboração e o progresso é mais lento. Embora, com uma incrível crescente exponencial nos últimos anos, o que pode levar a novas e dife- rentes formas de pensar, essa grande divisão não parece estar a acontecer na comunidade Rails. [5]

9 37signals é uma empresa de aplicações web privada com sede em Chicago, Illinois. A empresa foi co-fundada em 1999 por Jason Fried, Carlos Segura, e Ernest Kim.

10 Base-Camp é uma ferramenta de gestão de projetos baseado na web desenvolvido pela 37signals e lançado em 2004.

3.4. Ruby on Rails 21

Princípios

A filosofia Rails inclui vários princípios de orientação [6]:

• MVC - Model View Controller: Rails usa a arquitetura MVC destina-se a ser utilizado com uma metodologia de desenvolvimento ágil, oferecendo aos programadores um ambiente de desenvolvimento de aplicações Web rápida.

• CoC - Convetion over Configuration: Através de um boa convenção de nomes dados aos Models, Contollers e Views o Rails ajusta cada pormenor, sem que seja necessário recorrer a extensos arquivos de configuração.

• DRY - Don‘t Repeat Yourself: Escrever o mesmo código várias vezes é uma coisa má, por isso DRY é um princípio de desenvolvimento de software que visa reduzir a repetição de informações de todos os tipos.

• REST - Representational State of Transfer): Um padrão para aplicações Web que permite organizar a aplicação em torno de recursos e normas HTTP descobrindo qual é o caminho mais rápido.

3.4.2 Linguagem de programação Ruby

‘Ruby is simple in appearance, but is very complex inside, just like our human body”

Yukihiro Matsumoto, criador da Linguagem Ruby Ruby é uma linguagem de programação dinâmica e orientada a objetos open-source. Não é apenas livre para usar, mas também de copiar, modificar e distribuir. Ruby foi criado por Yukihiro Matsumoto (também conhecido como Matz) ao abrigo de um projeto do Governo japonês e lançado publicamente em 1995. Ruby obteve uma aceitação em massa por parte dos utilizadores em 2006. O ideal seguido por Matsumoto foi misturar partes de suas lin- guagens favoritas (Perl, Smalltalk, Eiffel, Ada, e Lisp), equilibrando a programação funcional com a programação imperativa para criar uma linguagem multi-paradigma. O objetivo era criar uma linguagem natural. Matsumoto acredita que as pessoas desejam expressar-se quando programam. Os programadores não querem lutar contra a linguagem. As lingua- gens de programação devem fazer-se sentir ao programador de maneira natural. Ruby está baseada no “Princípio da menor surpresa”, o que significa que a linguagem se comporta da maneira que se espera. [7]

Interpretador Ruby

22 Capítulo 3. estado da arte

memória muito complexa, nem características modernas de interpretadores como a com- pilação em tempo de execução (conhecida como JIT12

). Hoje a versão mais difundida é a 2.0, também conhecida como YARV (Yet Another Ruby VM), já baseada em uma máquina virtual com recursos mais avançados.

Com a popularização da linguagem Ruby, principalmente após o surgimento do Ruby on Rails, implementações alternativas da linguagem foram a surgindo. A maioria delas segue uma tendência natural de serem baseados numa Máquina Virtual invés de serem interpretadores simples. Algumas implementações possuem até compiladores completos, que transformam o código Ruby em alguma linguagem intermediária a ser interpretada por uma máquina virtual.

A principal vantagem das máquinas virtuais é facilitar o suporte em diferentes platafor- mas. Além disso, ter código intermediário permite otimização do código em tempo de execução, feito através da JIT.

Alguns dos interpretadores alternativos mais conhecidos são [8]:

• JRuby - Foi a primeira implementação alternativa completa da versão 1.8.6 do Ruby e é a principal implementação da linguagem Java para a JVM. Com o tempo ganhou compatibilidade com as versões 1.8.7 e 1.9.3 na mesma implementação. Como roda na JVM, não é um simples interpretador, já que também opera nos modos de compilação AOT (Ahead Of Time) e JIT (Just In Time). Uma de suas principais vantagens é a interoperabilidade com código Java existente, além de aproveitar todas as vantagens de uma das plataformas de execução de código mais maduras (Garbage Collector, Threads nativas, entre outras).

• IronRuby - A comunidade .Net também não ignorou o sucesso da linguagem e pa- trocinou o projeto IronRuby, que era mantido pela própria Microsoft. IronRuby foi um dos primeiros projetos verdadeiramente de código aberto dentro da Microsoft. Em 2010 a Microsoft parou de manter o projeto e a versão atual do IronRuby, 1.1.3, implementa apenas até o Ruby 1.9.2.

• Rubinius - Criada por Evan Phoenix, Rubinius é um dos projetos que tem recebido mais atenção da comunidade Ruby, por ter o objetivo de criar a implementação de Ruby com a maior parte possível do código em Ruby. Além disso, trouxe ideias de máquinas virtuais do SmallTalk, possuindo um conjunto de instruções (bytecode) pró- prio e implementada em C/C++. O Rubinius está sempre atualizado com as últimas versões do Ruby e roda no MacOS X e em sistemas Unix/Linux. No Windows ainda não é suportada.

• Ruby Enterprise Edition - Foi criada para melhorar a performance de aplicações Rails e diminuir a quantidade de memória utilizada, Ninh Bui, Hongli Lai e Tinco

3.4. Ruby on Rails 23

Andringa, modificaram o interpretador Ruby e lançaram com o nome de Ruby En- terprise Edition. As principais modificações no REE foram no comportamento do Garbage Collector, fazendo com que funcione com o recurso de Copy on Write13

dispo- nível na maioria dos sistemas operativos baseados em UNIX.

Principais características

Em Ruby, tudo são objetos. Mesmo os tipos de dados básicos, como números ou valores booleanos, o que faz com que todas as operações que são realizadas num objeto sejam métodos, e que cada método retorne um objeto.

Ruby é uma linguagem dinâmica com tipagem forte, interpretada em tempo de execução com Duck-Typing14

O Ruby suporta somente a herança simples, mas dispõe da estrutura funcional Module que implementa o conceito de módulos (Modules), que agem como coleções de métodos. As classes podem conter determinados módulos, herdando todos os seus métodos. Desta forma ruby consegue obter a capacidade da herança múltipla.

3.4.3 Componentes

Active Model

Em geral, nas aplicações que são desenvolvidas, pretendemos que as informações sejam guardadas numa base de dados relacional. Sistemas de entrada de dados, guardam enco- mendas, linhas de encomenda, detalhes dos clientes, etc, em tabelas de base de dados. Até mesmo as aplicações que normalmente utilizam texto não estruturado, como web-blogs, frequentemente utilizam bases de dados como sendo o seu back-end para armazenamento de dados.

Embora não seja imediatamente aparente a partir do SQL15

aceder aos dados, os bancos de dados relacionais são concebidos em torno de teoria dos conjuntos matemáticos. Ape- sar disso ser bom do ponto de vista conceptual, torna-se difícil combinar bases de dados relacionais com linguagens de programação orientadas a objetos. Falar de objetos é falar de conjuntos de dados e de operações, e falar de bases de dados é falar de atribuições de

13 Copy on Write é uma estratégia de otimização, que decorre do entendimento que, quando várias tarefas separa- das usam cópias idênticas da mesma informação, ou seja, os dados armazenados na memória do computador ou armazenamento em disco, não é necessário criar cópias separadas das informações de cada processo, em vez disso são atribuídos apontadores para o mesmo recurso.

14 Duck typing, em linguagens de programação orientadas por objetos é um estilo de escrita dinâmica na progra- mação, em que os métodos de objetos e as suas propriedades determinam a validade da semântica, invés de herdar de uma determinada classe ou implementação de uma interface específica.

24 Capítulo 3. estado da arte

valores. Operações que são fáceis de expressar em termos relacionais são por vezes difíceis de codificar num sistema orientado a objetos, sendo que o inverso também é verdadeiro.[9] Com o evolução das programação orientada a objetos, os programadores têm trabalhado na melhor forma de conciliar os pontos de vista relacional e orientados a objetos dos seus dados. O Rails mapeia os dados relacionais em objetos.

Mapeamento Objeto-Relacional - ORM16

As bibliotecas ORM mapeiam as tabelas da base de dados em classes. Se a base de dados tem uma tabela Orders, a aplicação vai ter uma classe chamada Order. As linhas nesta tabela correspondem a objetos da Classe, uma encomenda (order), em particular é representada como um objeto da Classe Order. Dentro desse objeto, os atributos são usados para obter e definir as colunas individuais. O objeto Order possui métodos para obter e definir os valores. As classes Rails que envolvem as tabelas da base de dados fornecem um conjunto de métodos à classe que executam operações ao nível das tabelas. Podemos por exemplo precisar de encontrar a encomenda com um ID em particular, sendo que isto pode ser implementado como um método da classe que retorna o objeto Order correspondente. Em código Ruby pode ser feito como é demonstrado no excerto de código3.1abaixo.

1 order = Order . find (1)

2 puts " Customer #{ order . customer_id }, amount =$ #{ order . amount }"

Código 3.1: Procura utilizando métodos da Classe

Por vezes os métodos de classe podem também devolver coleções de objetos, como pode ser visto no excerto de código3.2.

1 Order . where (: name => 'dave ' ). each do | order | 2 puts order . amount

3 end

Código 3.2: Procura utilizando clausula where

Os objetos que correspondem a linhas individuais de uma tabela têm métodos que atuam sobre essa mesma linha. Um exemplo de um método usualmente utilizado é save(), que é a operação que guarda a linha na base de dados. Um exemplo é demonstrado no excerto de código abaixo.

1 Order . where (: name => 'dave ' ). each do | order | 2 order . pay_type = " Purchase order "

16 Object-Relational Mapping, é uma técnica de desenvolvimento utilizada para reduzir a impedância da pro- gramação orientada aos objetos utilizando bancos de dados relacionais. As tabelas do banco de dados são representadas através de classes e os registos de cada tabela são representados como instâncias das classes correspondentes.

3.4. Ruby on Rails 25

3 order . save 4 end

5 %

Código 3.3: Método do objeto order(linha)

Desta forma a camada ORM mapeia as tabelas em Classes, linhas em objetos, e colunas em atributos desses objetos. Os métodos da Classe são utilizados para executar operações ao nível das tabelas, e os métodos de instância executam operações em linhas das tabelas. Active Record

Active Record é a camada ORM nativa de Rails. Esta segue o modelo ORM padrão (tabelas mapeadas para classes, linhas para objetos, e colunas para atributos de objeto). Difere da maioria das outras bibliotecas ORM na forma como está configurado. O Active Record diminui a quantidade de configuração que o programador necessita de fazer. Active Record alivia-nos das dificuldades de lidar com a base de dados subjacente, deixando-nos livres para trabalhar na lógica de negócio da aplicação.

Action Pack: Action Controller e Action View

A View e o Controller são partes do MVC que estão intimamente ligadas. O Controller fornece os dados à View, e recebe os eventos das páginas geradas pelas Views. Devido a estas interações, o suporte para as Views e para os Controllers são agrupados no mesmo pacote como um componente único. Pensar que Rails baralha o conceito da View com o de Controller devido à combinação dos dois num único componente é errado. Na realidade é o contrário, pois permite ter a separação de que precisamos exatamente para escrever aplicações web com clareza no código de controlo e na lógica de apresentação.

Action View

Em Rails a View é normalmente responsável pela criação de toda ou quase toda a parte da resposta que é exibida no web-browser, processado por uma aplicação, ou até enviada como email. Na sua forma mais simples, a View é um pedaço de código HTML que exibe texto estático. Contudo esta foi desenvolvida essencialmente para se poder incluir conteúdo dinâmico criado por um determinado método de uma ação no controlador. Em Rails, o conteúdo dinâmico é gerado por templates, destes existem três tipos. O esquema de templates mais comum, é o chamado ERB ou Ruby embebido, incorpora pedaços de código Ruby dentro da View, esta é em alguns aspetos semelhante ao modo como é feito noutros frameworks web, como PHP ou JSP. Embora esta abordagem seja muito flexível, alguns

26 Capítulo 3. estado da arte

do MVC. Ao incorporar código na View, corre-se o risco de adicionar lógica que deve ser feita apenas no Model ou no Controller. Como em tudo, enquanto o seu uso for criterioso e com moderação esta é uma boa prática, mas o seu excessivo uso pode tornar-se um problema. A manutenção de uma separação clara das preocupações é parte do trabalho do programador.

Tal como é usado conjuntamente com HTML o ERB pode também ser usado para cons- truir fragmentos de JavaScript17

no servidor, que serão posteriormente executados no web- browser. Desta forma é permido ao programador criar mais facilmente interfaces AJAX18 dinâmicas.

Em Rails é também possível construir documentos XML19

, através do construtor XML fornecido por Rails que utiliza código Ruby. Desta forma a estrutura do código XML gerado segue automaticamente a estrutura do código.

Action Controller

Em Rails o Controller, é o centro lógico da aplicação da aplicação. Coordena a interação entre o utilizador, as views e o model. Contudo Rails trata da maioria das interações, permitindo que o código que o programador escreva se concentre apenas nas funcionalidades ao nível da aplicação. Desta forma o código do controller torna-se bastante fácil de desenvolver e de manter. O controller, é também importante, pelo seu papel no auxilio de outros serviços como encaminhar pedidos externos para ações internas, tratando dos URLs com bastante facilidade. Gere a cache20, o que aumenta a performance substancialmente. Gere módulos auxiliares, que estendem as capacidades dos templates de visualização sem aumentar a complexidade do código. Gere as sessões, dando aos utilizadores a impressão de interação contínua com a aplicação.

Action Mailer

É um Framework para a criação de serviços de e-mail, que pode ser usada para enviar e-mails com base em modelos flexíveis, ou para receber e processar e-mails recebidos.

17 JavaScript é uma linguagem de programação interpretada que foi originalmente implementada como parte dos web-brwosers para que scripts pudessem ser executados do lado do cliente e interagissem com o utilizador sem a necessidade deste script passar pelo servidor.

18 AJAX, Asynchronous Javascript and XML é o uso metodológico de tecnologias como Javascript e XML, pro- vidas por web-browsers, para tornar páginas Web mais interativas com o utilizador, através de solicitações assíncronas de informações.

19 XML: eXtensible Markup Language é uma recomendação da W3C para gerar linguagens de marcação para necessidades especiais.

20 Cache é um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede.

3.4. Ruby on Rails 27

Active Support

Active Support é o componente de Rails responsável pelo fornecimento de extensões de linguagem Ruby e ferramentas de utilizade variada. Através do Active Support é possi- vel oferecer uma linha de fundo mais rica ao nível da linguagem, orientada tanto para o desenvolvimento de aplicações Rails, e ao seu desenvolvimento.

3.4.4 Metodologia

Rails é um Framework Agile21. É difícil ou até talvez impossível encontrar em alguma

comunidade a disponibilizar tutoriais que ensinem outras metodologias que não sejam ágeis. A razão é simples e subtil, pois agilidade é parte da forma como foi desenvolvida o Framework.

Olhando para os valores expressos no manifesto Agile, podemos observar um conjunto de quatro preferências [10]:

• Indivíduos e interações sobre processos e ferramentas

• O Software funciona sobre documentação

• A colaboração com o cliente é mais do que negociação de contratos

• Responder a mudanças é mais importante do que seguir um plano

Rails é sobre os indivíduos e as suas interações, não existindo conjuntos de ferramentas

Documentos relacionados