logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Jul 24

Princípios de Projeto OO – Single Responsibility Principle (SRP)

Escrito por Edgard Davidson em 1, 2.0, 4, 6, Agile, Air, api, AR, BI, blog, Blogs, boolean, C#, camp, class, classe, classes, dados, Design, Design Pattern, Design Patterns, Dica, for, ide, if, image, int, Java, mg, Microsoft, MSDN, O, on, pattern, POO, pt, RIA, Ria’s Geral, S+S, Software, TAT, UI, UML, zend @ 07 24th, 2011 | via http://edgarddavidson.com | Sem comentários
Edgard Davidson
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Princ?pio da ?nica Responsabilidade:

“Nunca deve haver mais de um motivo para uma classe ser alterada”

Cada responsabilidade constitui-se uma dimens?o de mudan?as. Se uma classe tem mais de uma responsabilidade, ent?o haver? mais de uma raz?o para alter?-la. Quanto mais responsabilidades h? numa classe, mais fr?gil (maior risco de para de funcionar) torna-se o projeto.

Viola??o do princ?pio:

Considere a Classe TAD:

import java.util.Vector;

/**
 *
 * @author Edgard Davidson
 */
public class TAD 

    private Vector vector;

    public TAD()
        vector = new Vector();

    public void empilhar(Object element)
        vector.insertElementAt(element, 0);

    public Object desempilhar()
        if (!this.eVazia())
            Object result = vector.firstElement();
            vector.removeElementAt(0);
            return result;
         else
            return null;

    }

    public void enfileirar(Object element)
        vector.add(element);

    public Object desenfileirar()
        if (!this.eVazia())
            Object result = vector.firstElement();
            vector.removeElementAt(0);
            return result;
         else
            return null;

    }

    public int obtemTamanho()
        return vector.size();

    public boolean eVazia()
        return vector.isEmpty();

}

Como pode ser visto, a classe TAD (Tipo Abstrato de Dados) ? uma classe que possui mais de uma responsabilidade. Ela implementa o contrato de um Pilha com os m?todos (empilha e desempilha) e o contrato de uma Fila com os m?todos (enfileira e desenfileira). A classe TAD viola o princ?pio da ?nica responsabilidade. Para se adequar ao princ?pio, ? necess?rio aplicar a refatora??o Extrair Classe. Essa t?cnica de refatora??o ? a mais indicada para o caso da viola??o do SRP. Sempre que houver uma classe fazendo o trabalho que deveria ser feito por duas classes, aplique a referida refatora??o para criar uma nova classe movendo os campos e m?todos pertinentes da classe antiga para a classe nova.

Al?m de aplicar a refatora??o Extrair Classe, na adequa??o ? viola??o do princ?pio, foi renomeado tamb?m a classe TAD, que n?o possuia um nome significativo ao seu contrato. Ap?s aplica??o de Refatora??o temos:

Adequa??o ao princ?pio:

Antes de mostrar a solu??o, a figura abaixo ilustra o contrato de uma Pilha e o contrato de uma Fila. Ambas s?o estruturas de dados com comportamentos diferenciados. A pilha implementa um algoritmo de LIFO (Last In, First Out), o ?ltimo a entrar ? o primeiro a sair. J? a fila implementa um algoritmo de FIFO (First In, First Out), o primeiro a entrar ? o primeiro a sair.

O diagrama de classe original foi refatorado e a classe TAD foi renomeada para Pilha e todos os m?todos referentes ao contrato de uma fila, ap?s aplicado o Extrair Classe e foram movidos para a classe Fila

Implementa??o da classe Pilha

import java.util.Vector;

/**
 *
 * @author Edgard Davidson
 */
public class Pilha 

    private Vector vector;

    public Pilha()
        vector = new Vector();

    public void empilhar(Object element)
        vector.insertElementAt(element, 0);

    public Object desempilhar()
        if (!this.eVazia())
            Object result = vector.firstElement();
            vector.removeElementAt(0);
            return result;
         else
            return null;

    }

    public int obtemTamanho()
        return vector.size();

    public boolean eVazia()
        return vector.isEmpty();

}

Implementa??o da classe Fila

import java.util.Vector;

/**
 *
 * @author Edgard Davidson
 */
public class Fila 

    private Vector vector;

    public Fila()
        vector = new Vector();

    public void enfileirar(Object element)
        vector.add(element);

    public Object desenfileirar()
        if (!this.eVazia())
            Object result = vector.firstElement();
            vector.removeElementAt(0);
            return result;
         else
            return null;

    }

    public int obtemTamanho()
        return vector.size();

    public boolean eVazia()
        return vector.isEmpty();

}

Com essa nova implementa??o, a classe Pilha e a classe Fila s?o extremamente coesas, possuem apenas um prop?sito, uma ?nica responsabilidade e apenas um contrato

Outras refer?ncias

  • http://engenhariadesoftwareagil.com/?p=236
  • http://www.objectmentor.com/resources/articles/srp.pdf
  • http://davidhayden.com/blog/dave/archive/2005/05/29/1066.aspx
  • http://c2.com/cgi/wiki?SingleResponsibilityPrinciple
  • http://msdn.microsoft.com/en-us/magazine/cc546578.aspx
  • http://codebetter.com/blogs/david_laribee/archive/2008/09/09/why-solid-gimme-an-s.aspx
  • Head First Design patterns. pags 185, 336, 339, 367
  • Agile Principles, Patterns, and Practices in C#.
  • UML for Java Programmers
Jun 27

Princípios de Projeto OO

Escrito por Edgard Davidson em 1, 3.5, 4, 6, AR, BI, blog, C#, Curso, Design Patterns, IE, int, interface, O, on, Pessoal, POO, RIA, Ria’s Geral, S+S, Software, UI @ 06 27th, 2011 | via http://edgarddavidson.com | Sem comentários
Edgard Davidson
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Ol? Pessoal.

J? est?o dispon?veis no blog do curso de p?s gradua??o em Engenharia de Software Centrada em M?todos ?geis todos os post referente aos Princ?pios de Projeto OO.

SAP – Stablility and Abstract Principle – Princ?pio da Abstra??o e Estabilidade
CCP – Common Closure Principle
ADP – Acyclic Dependencies Principle – Princ?pio da Depend?ncia Ac?clica
REP – Reuse release equivalence principle – Princ?pio da Equival?ncia de Reuso/Vers?o
OCP – The Open Close Principle – Princ?pio aberto/fechado
SDP –Stable Dependencies Principles – Princ?pios das Depend?ncias Est?veis
CRP – The Common Reuse Principle – Princ?pio da Reutiliza??o Comum
LOD – Law Of Demeter – Lei de Demeter
DIP – The Dependency Inversion Principle – Princ?pio da Invesr?o da Depend?ncia
SRP – Single Responsability Principle – O Princ?pio da Responsabilidade ?nica
LSP – The Liskov Substitution Principle – Princ?pio da Substitui??o de Liskov
ISP – The Interface Segregation Principle – Princ?pio da Segrega??o de Interfaces

Boa leitura!

Jun 20

PHP + BDD

Escrito por Fábio Batista da Silva em 1, 2.0, 4, 6, Air, app, AR, arte, BI, C#, Componente, Componentes, dados, demo, Desenvolvedor, desenvolvedores, Desenvolvimento, Design Patterns, development, Documentação, email, err, Ferramenta, Flex, for, framework, function, git, gmail, html, IE, if, instalação, int, LOB, Mate, mg, O, on, PHP, pt, quick, rails, rest, RIA, Ria’s Geral, S+S, Software, Sun, TAT, Tema, Teste, UI, Ved, zend @ 06 20th, 2011 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Olá,

Nesse Post vou mostrar um pouco de desenvolvimento PHP usando BDD (Behaviour-Driven Development).
O BDD é uma prática ágil que tem como objetivo facilitar o desenvolvimento orientado a testes,
onde o software é direcionados por comportamentos, trazendo para o contexto de destes os casos de uso ou historias da aplicação.

Enquanto em TDD (Test Driven Development) testamos a aplicação de forma granular em um ambiente micro
no BDD os testes são globais voltados para a Funcionalidade, Casos de uso, Comportamentos, etc..

Como se em TDD testamos a aplicação de dentro para fora e já em BDD a aplicação é testada de fora para dentro.
Existe muito material sobre esse assunto p ai e muita gente mais preparada que eu para abordar esse assunto de forma teorica,
Então nesse Post vou mostrar na pratica um pouco de desenvolvimento PHP usando o Behat

Behat

Behat é um framework BDD em PHP 5.3 construindo sobre de componentes do Symfony2.
Behat foi inspirado no Cucumber do Rails e especialmente a parte da sintaxe das features.

A instalação do Behat pode ser feita baixando diretalente pelo git diretamente pelo do git: http://github.com/Behat/Behat
Ou instalando através do pear :

$ pear channel-discover pear.behat.org
$ pear install behat/behat

Se tudo der certo o Behat esta instalado
A versão atualmente disponível no pear é a 1.1.9
Para verificar se esta correto e ver a versão instalada execute :

$ behat -V
Behat version 1.1.9

Depois de concluir a instalação o Behat esta pronto para ser usado.
para isso vamos inicializar o projeto de testes com o Behat

$ cd path-to-my-app
$ behat --init

O comando behat –init vai criara a estruturar de diretórios usada p organizar os teste do Behat

|-- features
   |-- steps            ##Diretório dos arquivos que contem os cenários de testes
       |-- steps.php
   |-- support          ##Configurações, requires e configs de ambiente
       |-- bootstrap.php
       |-- env.php

A definição de um historias e cenários de teste é bem simples.
Utilizando algumas palavras chaves : Feature, Scenario, Given, When, Then, But or And
Os cenários são escritos em arquivos .feature que serão interpretados pelo Behat

features/contacts.feature

Feature: Contacts Registration
    In order to demonstrate the framework
    As a SouDev using BDD
    I want to register contacts

  Scenario: Add new contact
    Given a contact named "Fabio B. Silva" using the email "fabio.bat.silva@gmail.com"
      And the phone "xx xxxx-xxxx"
     When press save
     Then everything will be saved

Com a historia escrita podemos executar o Behat dentro da aplicação
O Behat vai interpretar os arquivos .feature
e mostrar quais funções vc tem que implementar para poder rodas o teste

$ cd path-to-my-app
$ behat
1 scenario (1 undefined)
4 steps (4 undefined)
0m0.03s

You can implement step definitions for undefined steps with these snippets:

$steps->Given('/^a contact named "([^"]*)" using the email "([^"]*)"$/', function($world, $arg1, $arg2) 
    throw new BehatBehatExceptionPending();
);
$steps->And('/^the phone "([^"]*)"$/', function($world, $arg1) 
    throw new BehatBehatExceptionPending();
);
$steps->When('/^press save$/', function($world) 
    throw new BehatBehatExceptionPending();
);
$steps->Then('/^everything will be saved$/', function($world) 
    throw new BehatBehatExceptionPending();
);

Essa definição dos steps que o Behat lançou pode ser copiada para um arquivo de steps.php o que facilita bastante a implementação dos teste..
Porem escrever historias em inglês pode ser meio confuso, mais o tem suporte a i18n oq nos permite escrever as historias em português.
para isso basta adicionar # language: pt_BR no inicio do arquivo .feature
com isso ganhamos as palavras chaves em português : Funcionalidade,Cenario, Scenario, Quando, Então, Entao, Dado, Mas, E

features/contacts.feature

# language: pt_BR
Funcionalidade: Cadastro de contatos
    Para demostrar o funcionamento do framework
    Como SouDev que usa BDD
    Desejo cadastrar contatos

  Cenario: Adicionar um novo contato
    Dado um usuário chamado "Fabio B. Silva" usando o email "fabio.bat.silva@gmail.com"
      E com o telefone "xx xxxx-xxxx"
     Quando pressionar salvar
     Entao os dados serão salvos

E ao executar novamente o Behat a implementação dos teste agora também vem em português :

$ cd path-to-my-app
$ behat
1 scenario (1 undefined)
4 steps (4 undefined)
0m0.03s

You can implement step definitions for undefined steps with these snippets:

$steps->Dado('/^um usuário chamado "([^"]*)" usando o email "([^"]*)"$/', function($world, $arg1, $arg2) 
    throw new BehatBehatExceptionPending();
);
$steps->E('/^com o telefone "([^"]*)"$/', function($world, $arg1) 
    throw new BehatBehatExceptionPending();
);
$steps->Quando('/^pressionar salvar$/', function($world) 
    throw new BehatBehatExceptionPending();
);
$steps->Entao('/^todos os dados serão salvos$/', function($world) 
    throw new BehatBehatExceptionPending();
);

Com essa definição a implementação dos testes para essa feature pode ser feita
features/contacts_steps.php

use AppEntitiesContact, AppEntitiesPhone, AppServicesContactService;

$steps->Dado('/^um usuário chamado "([^"]*)" usando o email "([^"]*)"$/', function($world, $arg1, $arg2) 
    $contact = new Contact();
    $contact->setName($arg1);
    $contact->setEmail($arg2);

    $world->contact = $contact;
);

$steps->E('/^com o telefone "([^"]*)"$/', function($world, $arg1) 
    $world->contact->addPhone(new Phone($arg1));
);

$steps->Quando('/^pressionar salvar$/', function($world) 
    $world->saveReturn = ContactService::getInstance()->save($world->contact);
);

$steps->Entao('/^todos os dados serão salvos$/', function($world) 
     assertTrue($world->saveReturn);
);

O BDD e TDD são ferramentas essenciais para um software bem feito,
Infeliz mente muitos “desenvolvedores” ainda tem resistência a aderir ao teste e por achar perda de tempo, tedioso, etc..
O fato é que uma suite de testes bem feita vai tornar sua aplicação muito mais estável e vai lhe economizar tempo e cabelos ao longo do projeto. rsrs

Gostei bastante do Behat é um projeto muito bem estruturado e em constante evolução a versão 2.0 esta prestes a sair
Vale apena dar uma conferida na Documentação do Behat

E Para quem tiver o interesse deixei a app no git
https://github.com/FabioBatSilva/bdd-php-behat

Abraço e até a próxima….

Mai 13

JavaScriptMVC

Escrito por Fábio Batista da Silva em 1, 2.0, 6, action, Ajax, Aplicativos, app, AR, back, backend, BI, C#, class, classe, classes, código, Componente, Componentes, configuração, control, CRUD, css, dados, demo, Desenvolvimento, Design Patterns, development, Dica, dispatchEvent, Download, email, err, erro, error, Estilo, event, Evento, Eventos, Ferramenta, Flex, fonte, for, Formulário, formulario de contato, framework, function, gestão, git, Google, html, html5, IE, if, image, int, Java, Javascript, JQuery, label, labs, lista, map, mg, mvc, O, on, padrão, PHP, Plugin, pt, rails, RIA, Ria’s Geral, RoR, S+S, serviço, Serviços, string, tag, TAT, Tecnologia, template, Teste, tv, UI, uint, update, UX, web @ 05 13th, 2011 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Olá,

Com a chegada eminente do HTML5 e outras tecnologias baseadas em javascript como MongoDB e node.js
tenho deixado o Flex o meio de lado e me dedicado um pouco mais ao javascript.
Porem fica a questão, Como ter um front-end com a mesma performance, escalabilidade e desacoplamento que o flex permite ?
Realmente nesses termos ainda não encontrei nada que me proporcione o que o Flex proporciona.

Nesse Post vou falar um pouco sobre Framework JavaScriptMVC
Me perece uma das melhores alternativas para manter um frond-end JavaScript/HTML

JavaScriptMVC é formado por uma seria de ferramentas para construção de aplicativos JavaScript e consiste nos seguintes componentes:

  • StealJS -Gestão de Dependência
  • FuncUnit – Testes Unitários
  • jQueryMX – Biblioteca de Componentes
  • DocumentJS – Geração de JSDoc

O JavaScriptMVC pode ser utilizado com qualquer back-end , java,php,rails, etc…
Ele pode ser instalado baixando diretamente aqui ou instalando cada componente individualmente atreves do github.

Os componentes devem ficar nas raiz do diretório web da sua aplicação, nesse caso a pasta public.
Então as estrutura da aplicação fica assim.

public
  /documentjs
  /funcunit
  /jquery
  /steal
  /js

O JavaScriptMVC tem ferramentas de geração de código para auxiliar na criação da aplicação.
Vamos começar criando a aplicação pelo terminal, então o JavaScriptMVC vai gerar toda a estrutura do projeto.

    cd path-to-application/public/
   ./js jquery/generate/app contacts

Assim como o rails o JavaScriptMVC possui scaffolds que podem gerar seu CRUD.
Para isso basta executar o comando scaffold passando como parâmetro o nome do modelo.
Os nomes das classes seguem o seguinte padrão : ..
então temos o model “Contacts.Models.Contact”

     ./js jquery/generate/scaffold Contacts.Models.Contact

O JavaScriptMVC vai gerar o controlador, modelos, views e testes unitários da aplicação.
Porem o único arquivo que sera incluído na aplicação é o steal.js ele é responsável por gerenciar as dependências da aplicação.
No ambiente de desenvolvimento ele vai incluir individualmente todos os controladores, modelos, etc..

 type='text/javascript'  src='../steal/steal.js?contacts,development'>>

O parâmetro “?contacts” na tag de inclusão indica o nome do arquivo de configuração que tem o mesmo nome da aplicação nesse caso contacts.js
nele ficam mapeados todas dependências do projeto que serão gerenciadas pelo StealJS
contacts/contacts.js – Arquivo de configuração

steal.plugins(
    'jquery/controller',
    'jquery/controller/subscribe',
    'jquery/view/ejs',
    'jquery/controller/view',
    'jquery/model',
    'jquery/lang/json',
    'jquery/dom/form_params')

.css('contacts')

.resources()
.models('contact')
.controllers('contact')
.views();

Depois de fazer uma refatoração a aplicação ficou assim :

contacts/view/contact/contacts.html – Tela inicial da aplicação

>
    >
        >JS - MVC>
         type='text/javascript'  src='../steal/steal.production.js?contacts'>>
    >
    >
        
 id='contacts'>
            
>Contacts>
            
 id='contact'>>
        >
    >
>

contacts/view/contact/list_view.ejs – Template para a listagem de contatos


 class="link">
     href="javascript://" class='text_button create' >Create>
    
/>
>

 class="table">
    
>
        
>
            
>Name>
            
>E-Mail>
            
> >
        >
    >
    
>
        <%for(var i = 0; i < contacts.length ; i++)%>
        
 <%= contacts[i]%>>
            
><%= contacts[i].name%>>
            
><%= contacts[i].email%>>
            
 class="last">
                 href='javascript://' class='edit'>edit>%>
    >
>

contacts/view/contact/list_view.ejs – Template para o formulario de contatos


 <%= contact%> >
    
 action="#" class="form">
        
>
             class="label">Name>
            
 type="text" class="text_field" id="name" name="name" value="<%= contact.name%>" />
             class="label">E-Mail>
            
 type="text" class="text_field" id="email" name="email" value="<%= contact.email%>" />
        >
        
 class="link">
             href="javascript://" class="text_button save">Save>
             href="javascript://" class="text_button cancel">Cancel>
        >
    >
>

contacts/models/contact.js – Classe ‘Contacts.Models.Contact’ Reponsavel pela abstração do acesso aos serviços

$.Model.extend('Application.Models.Contact',
/* @Static */

    /**
     * Service url.
     */
    url: 'http://localhost/patho-to-app/contacts/',

    /**
     * Recupera os dados dos contacts do serviço no backend.
     * @param Object params
     * @param Function success
     * @param Function error
     */
    findAll: function( params, success, error )
        $.ajax(
            url     : this.url,
            type    : 'get',
            dataType: 'json',
            data    : params,
            success : this.callback(['wrapMany',success]),
            error   : error
        );
    },
    /**
     * Cria um novo contacto
     * @param Object attrs
     * @param Function success
     * @param Function error
     */
    create: function( attrs, success, error )
        $.ajax(
            url     : this.url + 'save',
            type    : 'post',
            dataType: 'json',
            error   : error,
            success : success,
            data    : contact:attrs
        });
    }
    /**
     * Altera os dados de um contacto
     * @param String id
     * @param Object attrs
     * @param Function success
     * @param Function error
    */
    update: function( id, attrs, success, error )
        $.ajax(
            url     : this.url + 'save',
            type    : 'post',
            dataType: 'json',
            data    : contact:attrs,
            success : success,
            error   : error
        });
    },
    /**
     * Remove um contacto
     * @param String id
     * @param Function success
     * @param Function error
     */
    destroy: function( id, success, error )
        $.ajax(
            url     : this.url + 'destroy/id/'+id,
            type    : 'post',
            dataType: 'json',
            error   : error,
            success : success
        );
    },
},
);

contacts/controllers/contact_controller.js – Classe ‘Contacts.Controllers.Contact’ Responde a eventos da view e do modelo

$.Controller.extend('Contacts.Controllers.Contact',onDocument: true,

     /**
     * Função chamada quando a página é carregada
     */
     load: function()
        this.findAll();
     ,

     /**
     * Função que renderiza a listagem de contatos apartir do template /contacts/views/list_view.ejs
     * @param Array contacts
     */
     listView: function( contacts )
        $('#contact').html(this.view('list_view', contacts:contacts ));
     },

     /**
     * Função que renderiza o formulario de contatos apartir do template /contacts/views/form_view.ejs
     * @param Contacts.Models.Contact contact
     */
     formView: function(contact)
        $('#contact').html(this.view('form_view', contact:contact));
     },

     /**
     * Função que lista os contatos atraves do model e renderiza a tela quando obtem resultado
     */
     findAll: function(){
        Contacts.Models.Contact.findAll(, this.callback('listView'));
     },

    /**
     * Listener para o evento 'click' no link create
     */
    '.create click': function()
        // cria um novo contato e monta o formulario
        var contact = new Contacts.Models.Contact();
        this.formView(contact);
    ,

     /**
     * Listener para o evento 'click' no link edit
     * @param jQuery el
     */
    '.edit click': function( el )
        // Recupera o contato selecionado e monta o formulario
        var contact = el.closest('.contact').model();
        this.formView(contact);
    ,

     /**
     * Listener para o evento 'click' no link destroy
     * @param jQuery el
     */
    '.destroy click': function( el )
        if(confirm("Are you sure you want to destroy?"))
            // Recupera o contato selecionado e o remove
            var contact = el.closest('.contact').model();
            contact.destroy();
        
     },

    /**
     * Listener para o evento 'click' no link save
     * @param jQuery el
     */
    '.save click': function(el)
        // Recupera o contato selecionado
        var contact = el.closest('.contact').model();
        // Recupera os dados do formulario
        var attrs   = $('.form').formParams();
        // Atualiza os dados no "objeto"
        contact.attrs(attrs);
        // Salva
        contact.save();      	// a função save é erdada do objeto Model
                               // ela verifica se o objeto ja existe e chama o metodo create ou update
    ,

    /**
     * Listener para o evento 'click' no link cancel
     */
    '.cancel click': function()
        this.findAll();
    ,

    /**
     * Listener para o evento 'created' disparado pelo "objeto" Contacts.Models.Contact
     * @param String called
     * @param Event contact
     */
    'contact.created subscribe': function( called, contact )
        this.findAll();
    ,

    /**
     * Listener para o evento 'updated' disparado pelo "objeto" Contacts.Models.Contact
     * @param String called
     * @param Event contact
     */
    'contact.updated subscribe': function( called, contact )
        this.findAll();
    ,

     /**
     * Listener para o evento 'destroyed' disparado pelo "objeto" Contacts.Models.Contact
     * @param String called
     * @param Event contact
     */
    "contact.destroyed subscribe": function(called, contact)
        this.findAll();
     
});

Agora antes de colocar a aplicação em ambiente de produção podemos compactar todos os arquivos .js e .css gerando uma versão final.

 ./js contacts/scripts/build.js

O StealJS utiliza o Google Closure para compactar todos os arquivos
e gerar arquivos compactados/concatenados que serão usados em produção contacts/production.js e contacts/production.css .

Com isso reduzimos todos os arquivos da aplicação, estilos, plugins, etc.. são reduzidos a apenas um arquivo .js e um arquivo .css.
E para mudar as configuração do ambiente temos apelas que mudar o tag de inclusão do StealJS

<script type='text/javascript'  src='../steal/steal.production.js?contacts'>script>

Esse foi apenas uma pequena amostra do JavaScriptMVC.
Com essa estrutura ele nos permite construir grandes aplicações de forma modular
com um bom ambiente de teste, velocidade no desenvolvimento e performance no ambiente de produção.

Essa aplicação esta rodando aqui : http://flexria.com.br/labs/js-mvc/
E os fontes estão disponíveis no github : https://github.com/FabioBatSilva/js-mvc

Abraço e até a próxima…. ;-)

Mar 29

Pattern Delegate e os Mocks

Escrito por Janderson Cardoso em Adobe Flex, Blazeds, Design Patterns, Ria’s Geral, Swiz Framework @ 03 29th, 2011 | via http://www.jandersonfc.com/ | Sem comentários
Janderson Cardoso
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »


 Pattern Delegate e os Mocks

Hoje vou falar sobre um pattern muito importante e que é muito usado no Flex(client) chamado de Delegate. Para quem nunca ouviu falar vou resumir da seguinte forma:

“Delegate é o pattern que indica a comunicação do cliente com as regras de negócio sem a necessidade do cliente conhecer as regras de negócio.”

Explicação Abstrata – Todo sistema possui suas regras de negócio, que normalmente são expostas através de serviços. o Delegate tem justamente esse papel, centralizar um local no cliente(aplicação frontend) para essa chamada ao serviço que expôe as regras de negócio do sistema. Uma coisa muito importante nesse pattern é que ele não deve conhecer as regras de negócio em si, normalmente consomem serviços mas não sabem o que realmente eles fazem.

Explicação Concreta - Em 90% dos projetos em que trabalho cujo o frontend é em Flex o backend é em Java, toda a lógica do sistema(Regras de Negócio) ficam no java. No Java possuo um Serviço que via Blazeds é disponibilizado para ser consumido no Flex. Com esse cenário costumo ter uma classe Delegate no lado do flex que consome o serviço disponibilizado pelo blazeds através de RemoteObject.

Na teoria é tudo muito funcional e faz sentido, porém na prática sempre existe a dúvida se realmente vale a pena ter mais esse nível de conceito e organização no flex, então vou colocar 2 pontos positivos para estimular essa boa prática:

Definição de uma padrão na comunicação com backend – a partir de hoje quando você analisar um código em flex que possui um classe com parte do seu nome Delegate você terá a certeza que toda a comunicação com o backend se encontra ali, não precisa que ninguém te mostre ou que desenhe pra você icon smile Pattern Delegate e os Mocks

Grande Facilidade para usar os Mocks – Outro ponto positivo que está diretamente ligado a minha opinião é o uso de Mocks, para quem não sabe o que é Mocks precisa de um tapa na orelha..rs brincadeira icon razz Pattern Delegate e os Mocks . Mocks são dados que são gerados de forma “falsa” para testar ou simular uma parte de um sistema, normalmente uso muito no flex para simular uma chamada ao serviço do backend, isso é bom porque não preciso de um servidor rodando para testar(me refiro a teste funcional) se o client(flex) está funcionando corretamente.

Vou terminar com 2 exemplos práticos de como o uso do Delegate me ajudou a padronizar meu projetos e a usar os mocks:

Flex 4 + Swiz – neste Tutorial Básico Swiz Framework 1.0 uso o conceito de Delegate como pode ser analisado nesse pacote e Também os Mocks(no caso dos Mocks uso o utilitário do próprio swiz para criar mocks) que é justamente a classe ContactDelegateFake.as.

Flex 4 + Springas – neste Tutorial Spring ActionScript uso o conceito de Delegate como pode ser analisado nesse pacote e também os Mocks(No caso dos Mocks uso o utilitário do springas para criar mocks) que é justamente a classe ContactDelegateFake.as.

Em ambos os casos acima na controller(que é onde fica a classe que faz referência ao delegate) é feito apenas referência a uma interface IContactDelegate, então fica fácil mudar de mock para o Delegate que realmente invoca o backend, se a comunicação com backend já fosse feita no controller essa mudança de mock para o real ficaria muito mais difícil.

Bem, bons estudos e espero ter justificado o porque que em meus exemplos aqui no blog costumo usar o pattern delegate icon wink Pattern Delegate e os Mocks

Cumps.


 Pattern Delegate e os Mocks

Similar Posts:

  • TUTORIAL JAVA + FLEX NA PRÁTICA 4/6
  • Swiz não é mais Framework MVC!
  • MVC da teoria para a prática
  • Tutorial Spring ActionScript
  • TUTORIAL JAVA + FLEX NA PRÁTICA 5/6

Jan 11

Dica Flex – O padrão Factory Method

Escrito por Pablo Souza em 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Adobe, app, AR, Arquitetura, bar, blog, botão, C#, class, classe, classes, cliente, código, Componente, Componentes, control, dados, Design Patterns, Dica, Dicas, err, erro, error, event, exemplo, Flex, fonte, fonts, for, framework, Frameworks, function, handle, ide, IE, if, image, int, interface, Java, label, library, Mac, mg, monitor, MXML, O, on, override, padrão, problema, problemas, Projetos, pt, RIA, Ria’s Geral, RoR, singleton, spark, string, tag, template, UI, XML @ 01 11th, 2011 | via http://rectius.com.br/blog | Sem comentários
Pablo Souza
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Quando passamos algum tempo modelando aplicações, é fato que vamos nos deparar com um mesmo problema várias e várias vezes. Ao longo do tempo também vamos encontrar maneiras de resolvê-los. A solução para esses problemas recorrentes é a chave para os padrões de projetos. Padrões de projetos não são métodos, frameworks ou componentes, são dicas de como resolver problemas conhecidos de forma eficaz.

Aqui no blog nós já falamos de alguns padrões de projetos como o Singleton, Transfer Object e o Typesafe Enum. Na dica Flex de hoje, vamos mostrar como implementar o padrão de projeto Factory Meythod que, assim como os citados anteriormente, tem papel arquitetural importante nas suas aplicações.

O padrão Factory provê uma abstração ou uma interface e permite que a subclasse ou a classe de implementação decida qual classe ou método deve ser instanciado ou chamado, baseado nas condições ou parâmetros informados.

Algumas de suas características são:

- Esconde as classes concretas do cliente.
- Junta duas ou mais hierarquias de classes separadas porém relacionadas.
- O objeto retornado pode ser tanto um objeto concreto quanto abstrato.
- As subclasses são quem especificam os objetos.

Para ilustrar esses conceitos utilizaremos um exemplo simples, vamos criar uma aplicação que informa a condição do tráfego nas estradas do RJ e SP.

Então mãos a obra.

Crie sua aplicação “FactoryMethodExample”:

Em seguida modifique sua Application conforme o código a seguir:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   minWidth="955" minHeight="600">
?
	<s:controlBarContent>
		<s:Label text="CONDIÇÕES DO TRÁFEGO NAS ESTRADAS"  fontWeight="bold" fontSize="16"/>
		<s:Button id="btTrafegoSP" label="Obtêm condições do tráfego em SP" />
	s:controlBarContent>
?
	<s:TextArea id="report" left="50" right="50" bottom="50" top="50"/>
?
s:Application>

Basicamente, nossa aplicação deverá passar por três passos antes de informar as condições do tráfego ao usuário:

1. Obter as informações do tráfego.
2. Tratar o retorno dessas informações.
3. Retornar as informações formatadas.

Vamos criar um classe abstrata com um método Template Method que irá garantir que os três passos anteriores sejam respeitados.
Diferentemente do C# e do Java, o ActionScript 3.0 não suporta nativamente a criação de classes ou métodos abstratos. A classe abstrata é uma classe que sempre é estendida e nunca pode ser instanciada diretamente. Os métodos abstratos devem ser implementados pela subclasse e, como o ActionScript 3.0 não provê suporte para a palavra-chave “abstract”, vamos garantir esse comportamento lançando uma exceção.

Veja a classe abstrata “AbstractTrafego”:

package
{
	public class AbstractTrafego
	{
		public final function inicializa():String
		{
			obtemInformacoes();
			trataInformacoes();
			return retornaInformacoes();
		}
?
		public function obtemInformacoes():void
		{
			throw new Error("Método Abstrato");
		}
?
		public function trataInformacoes():void
		{
			throw new Error("Método Abstrato");
		}
?
		public function retornaInformacoes():String
		{
			throw new Error("Método Abstrato");
		}
?
	}
}

Agora vamos criar a classe SPTrafego que estende nossa classe abstrata AbstractTrafego. Essa subclasse implementa os métodos chamados pelo Template Method Inicializa:

package
{
	public class SPTrafego extends AbstractTrafego
	{
		private var condicoesTrafego:String = "";
		private var arrCondicoesTrafego:Array = [];
?
		public override function obtemInformacoes():void
		{
			var trafego_1:Object = new Object();
			trafego_1.rodovia = "Marginal Pinheiros";
			trafego_1.condicao = "Congestionada em 6 km";
?
			var trafego_2:Object = new Object();
			trafego_2.rodovia = "Marginal Tietê";
			trafego_2.condicao = "Congestionada em 8 km";
?
			arrCondicoesTrafego.push(trafego_1);
			arrCondicoesTrafego.push(trafego_2);
?
			trace("Obtem as informações do tráfego em SP");
		}
?
		public override function trataInformacoes():void
		{
			condicoesTrafego += "Última atualização: " + new Date() + "n";
			condicoesTrafego += "Condições do Tráfego em SPn";
			for each (var informe:Object in arrCondicoesTrafego)
			{
				condicoesTrafego += informe.rodovia + ": ";
				condicoesTrafego += informe.condicao + "n";
			}
			condicoesTrafego += "r";
?
			trace("Trata as informações do tráfego em SP");
		}
?
		public override function retornaInformacoes():String
		{
			trace("Retorna as informações do tráfego em SP");
?
			return condicoesTrafego;
		}
	}
}

Agora vamos testar nossa implementação. Insira o código a seguir no clique do botão btTrafegoSP:

	<fx:Script>
		[CDATA[
?
			protected function btTrafegoSP_clickHandler(event:MouseEvent):void
			{
				// Cria uma instância de SPTrafego
				var trafego:SPTrafego = new SPTrafego();
				// Chama o Template Method definido na classe abstrata
				report.text += trafego.inicializa();
			}
		]]>
	fx:Script>

Rode o código e veja o resultado.

Nesse momento nossa aplicação está implementando apenas o Template Method. Para entendermos as vantagens de se utilizar o Factory Method, digamos agora que vamos passar também a monitorar o tráfego das estradas do RJ e para isso vamos precisar nos conectar a uma fonte de dados diferente daquela usada para obter as informações de SP. Como teremos agora diferentes fontes de dados, vamos refatorar nosso código. O método ObtemInformacao não retorna nada atualmente, então vamos modificá-lo para que ele passe a retornar um objeto que represente as condições do tráfego.

Crie uma interface chamada ICondicao, que deverá ser implementada por todos esses objetos.

package
{
	public interface ICondicao
	{
		function obtemDados():void;
	}
}

Agora vamos criar as classes que implementam a interface ICondicao:

package
{
	public class SPCondicao implements ICondicao
	{
		public function obtemDados():Array
		{
			trace("Obtem dados do tráfego em SP");
?
			var trafego_1:Object = new Object();
			trafego_1.rodovia = "Marginal Pinheiros";
			trafego_1.condicao = "Congestionada em 6 km";
?
			var trafego_2:Object = new Object();
			trafego_2.rodovia = "Marginal Tietê";
			trafego_2.condicao = "Congestionada em 8 km";
?
			var arrCondicoesTrafego:Array = [];
?
			arrCondicoesTrafego.push(trafego_1);
			arrCondicoesTrafego.push(trafego_2);
?
			return arrCondicoesTrafego;
		}
	}
}

Agora a classe que obtem os dados das estradas do RJ. Repare que as informações estão num formato diferente.

package
{
	public class RJCondicao implements ICondicao
	{
		public function obtemDados():Array
		{
			trace("Obtem dados do tráfego no RJ");
?
			arrCondicoesTrafego.push("Avenida Brasil: Congestionada em 5 km");
			arrCondicoesTrafego.push("Ponte Rio-Niterói: Congestionada em 2 km");
?
			return arrCondicoesTrafego;
		}
	}
}

Em seguida refatore a classe abstrata AbstractTrafego. Perceba que agora o método obtemInformacoes retorna um objeto do tipo ICondicao, que pode ser tanto um objeto relacionado às condições das estradas do RJ quanto de SP ou de qualquer outra cidade que venha a ser adicionada posteriormente:

package
{
	public class AbstractTrafego
	{
		public final function inicializa():String
		{
			var condicao:ICondicao = obtemInformacoes();
			trataInformacoes(condicao.obtemDados());
			return retornaInformacoes();
		}
?
		// Método Factory
		public function obtemInformacoes():ICondicao
		{
			throw new Error("Método Abstrato");
		}
?
		public function trataInformacoes(arrCondicoesTrafego:Array):void
		{
			throw new Error("Método Abstrato");
		}
?
		public function retornaInformacoes():String
		{
			throw new Error("Método Abstrato");
		}
?
	}
}

Refatore agora a implementação da classe abstrata SPTrafego:

package
{
	public class SPTrafego extends AbstractTrafego
	{
		private var condicoesTrafego:String = "";
?
		public override function obtemInformacoes():ICondicao
		{
			return new SPCondicao();
		}
?
		public override function trataInformacoes(arrCondicoesTrafego:Array):void
		{
			condicoesTrafego += "Última atualização: " + new Date() + "n";
			condicoesTrafego += "Condições do Tráfego em SPn";
			for each (var informe:Object in arrCondicoesTrafego)
			{
				condicoesTrafego += informe.rodovia + ": ";
				condicoesTrafego += informe.condicao + "n";
			}
			condicoesTrafego += "r";
?
			trace("Trata as informações do tráfego em SP");
		}
?
		public override function retornaInformacoes():String
		{
			trace("Retorna as informações do tráfego em SP");
?
			return condicoesTrafego;
		}
	}
}

E crie a classe RJTrafego:

package
{
	public class RJTrafego extends AbstractTrafego
	{
		private var condicoesTrafego:String = "";
?
		public override function obtemInformacoes():ICondicao
		{
			return new RJCondicao();
		}
?
		public override function trataInformacoes(arrCondicoesTrafego:Array):void
		{
			condicoesTrafego += "Última atualização: " + new Date() + "n";
			condicoesTrafego += "Condições do Tráfego no RJn";
			for each (var informe:String in arrCondicoesTrafego)
			{
				condicoesTrafego += informe + "n";
			}
			condicoesTrafego += "r";
?
			trace("Trata as informações do tráfego no RJ");
		}
?
		public override function retornaInformacoes():String
		{
			trace("Retorna as informações do tráfego no RJ");
?
			return condicoesTrafego;
		}
	}
}

E por último mas não menos importante, vamos refatorar nossa Application:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   minWidth="955" minHeight="600">
?
	<fx:Script>
		[CDATA[
?
			protected function btTrafegoSP_clickHandler(event:MouseEvent):void
			{
				// Cria uma instância de SPTrafego
				var trafego:SPTrafego = new SPTrafego();
				// Chama o Template Method definido na classe abstrata
				adicionaInforme( trafego );
			}
?
			protected function btTrafegoRJ_clickHandler(event:MouseEvent):void
			{
				// Cria uma instância de SPTrafego
				var trafego:RJTrafego = new RJTrafego();
				// Chama o Template Method definido na classe abstrata
				adicionaInforme( trafego );
			}
?
			private function adicionaInforme(trafego:AbstractTrafego):void
			{
				report.text += trafego.inicializa();
?
			}
?
		]]>
	fx:Script>
?
	<s:controlBarContent>
		<s:Label text="CONDIÇÕES DO TRÁFEGO NAS ESTRADAS"  fontWeight="bold" fontSize="16"/>
		<s:Button id="btTrafegoSP" label="Obtêm condições do tráfego em SP"
				  click="btTrafegoSP_clickHandler(event)" />
?
		<s:Button id="btTrafegoRJ" label="Obtêm condições do tráfego no RJ"
				  click="btTrafegoRJ_clickHandler(event)" />
	s:controlBarContent>
?
	<s:TextArea id="report" left="50" right="50" bottom="50" top="50"/>
?
s:Application>

Espero que tenham gostado. Baixe aqui o projeto de exemplo.

Até a próxima!

Dez 28

Adobe Certified Expert!

Escrito por Mauro Martins em .NET, 1, 3d, 4, 6, Adobe, Adobe Certified Expert, AR, bar, BI, Blazeds, blog, certificação, class, Componente, Desenvolvimento, Design, Design Pattern, Design Patterns, development, email, event, Experiências, facebook, Flash / Flex, Flex, Flex 2, Flex 4, Flex4, for, framework, gmail, Google, html, ide, IE, if, image, linkedin, Links e sugestões, live, map, mg, O, on, Partilha, pattern, PHP, Ria’s Geral, Software, TAT, Twitter, UI, XP @ 12 28th, 2010 | via http://imauro.com/blog/ | Sem comentários
Mauro Martins
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

ACE Flex 2 Adobe Certified Expert!

Olá a todos!

Para os mais distraídos, há cerca de uma semana coloquei, do lado direito do blog, um logótipo do qual me orgulho muito. É o logótipo que é atribuído a todos os profissionais que possuem o título de Adobe Certified Expert.

Esta certificação deu-se, depois de ter completado, com sucesso, o exame da Pearson Vue sobre Flex 4.

Em termos de partilha de experiência, posso-vos dizer que o exame é difícil e que toca em bastantes pontos do desenvolvimento nesta plataforma.

As questões que nos são colocadas no exame vão desde o simples nome de uma propriedade de um componente, passando por casos de utilização ou não de certos tipos de design patterns, até a questões sobre BlazeDS, Adobe Live Cycle e consequentemente questões sobre model-driven development.

No meu caso, quando achei que estava na hora de obter a certificação, marquei logo o exame e dediquei cerca de dois meses a estudar a plataforma / framework e todos os seus pequenos detalhes. De forma a estar mais confortável no exame, comprei o software Attest 3 que tenta simular o ambiente de exame real e que se revelou essencial para o resultado final.

Esta foi, sem dúvida, a forma ideal de acabar 2010 icon smile Adobe Certified Expert!

Qualquer dúvida que tenham e esclarecimento que precisem sobre as certificações de Adobe Certified Expert, coloquem-nas aqui que tentarei responder o melhor que sei!

Bom 2011, Mauro.

  • Blog this on Blogger
  • Subscribe to the comments for this post?
  • Digg this!
  • Share this on Facebook
  • Email this via Gmail
  • Share this on LinkedIn
  • Email this to a friend?
  • Stumble upon something good? Share it on StumbleUpon
  • Tweet This!



Ago 9

.NET Magazine 76 – Silverlight Toolkit

Escrito por Robson Fernandes em .NET, .Net Magazine, 1, 4, 6, AR, arte, Artigo, Artigos, blog, Blogs, class, Componente, Componentes, control, Controles, dados, Desenvolvedor, desenvolvedores, Design, Design Pattern, Design Patterns, DRE, Excel, exemplo, Exemplos, git, IE, image, kit, lista, mg, Microsoft, Microsoft Silverlight, NaN, noticia, O, on, pattern, Pessoal, RIA, Ria’s Geral, silverlight, Silverlight - Charts, Silverlight - Core, Silverlight - Dicas, SilverLight - News, Silverlight - Tools, Silverlight 3, Silverlight 4, skins, Software, Tema, tool, toolkit, UI, Vários, Ved, XP @ 08 9th, 2010 | via http://www.riasoftware.com.br/blog/ | Sem comentários
Robson Fernandes
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Boa noite pessoal!

Mais uma excelente noticia!
Foi lançado a edição número 76 da revista .NET Magazine, no qual tive o grande prazer de colaborar com o Alexandre Tadashi Sato (Silverlight Experience), na escrita de mais um artigo, sendo que o tema proposto foi sobre Silverlight Toolkit!

O Silverlight Toolkit proporciona aos desenvolvedores uma gama de controles extras ao Microsoft Silverlight, que vão desde componentes para dashboards, skins, controles de navegação, visualização de dados e muito mais. Você encontrará vários exemplos práticos de alguns dos principais componentes, e muito mais!

.NET Magazine 76

Lista de artigos desta edição:

• Silverlight Toolkit
• Design Patterns na prática – Parte 1
• Design Patterns
• Code Contracts
• Estimando seus Requisitos
• Pesquisa de objetos na memória
• É possível ganhar dinheiro com licença GPL?(Artigo Exclusivo Digital)

Grande Abs.

Robson Fernandes

Ago 9

Silverlight Toolkit .net Magazine 76

Escrito por Alexandre Tadashi em .NET, .Net Magazine, 1, 4, 6, Aplicativos, AR, arte, Artigo, Artigos, blog, Blogs, class, Componente, Componentes, Design, Design Pattern, Design Patterns, Destaque, DevMedia, err, exemplo, Exemplos, Ferramenta, git, Google, IE, if, image, kit, lista, mg, NaN, O, on, pattern, programação, Revista .net Magazine, RIA, Ria’s Geral, silverlight, Software, Tecnologia, tool, toolkit, UI, XP @ 08 9th, 2010 | via http://alexandretadashi.net/ | Sem comentários
Alexandre Tadashi
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Acaba de ser lançada a nova edição da revista .net Magazine, a edição de número 76, o destaque é a programação com Design Patterns.

Segue a lista de artigos:

• Silverlight Toolkit
• Design Patterns na prática – Parte 1
• Design Patterns
• Code Contracts
• Estimando seus Requisitos
• Pesquisa de objetos na memória
• É possível ganhar dinheiro com licença GPL?(Artigo Exclusivo Digital)

O Robson Fernandes (RIA Software) escreveu junto comigo um artigo sobre o Silverlight Toolkit que está nesta edição da .net Magazine, o Silverlight Toolkit é um conjunto de componentes que enriquece os aplicativos desenvolvidos com a tecnologia Silverlight. Além de conhecer a ferramenta, durante o artigo criamos exemplos práticos de alguns dos principais componentes.

Jun 29

Quince – UX Pattern Explorer – Silverlight

Escrito por Robson Fernandes em .NET, 1, AR, Desenvolvedor, Design, Design Pattern, Design Patterns, Desktop, exemplo, Exemplos, for, IE, if, int, internet, Microsoft, Microsoft Silverlight, O, on, on-line, padrão, pattern, Pessoal, problema, RIA, Ria’s Geral, silverlight, Silverlight - Core, SilverLight - Design, Silverlight - Dicas, SilverLight - News, Silverlight - XAML, Silverlight 3, Silverlight 4, UI, user experience, UX, Ved, web, XP @ 06 29th, 2010 | via http://www.riasoftware.com.br/blog/ | Sem comentários
Robson Fernandes
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



Boa noite Pessoal!

Galera, vejam que massa! Eu estava a pesquisar na internet sobre UX (User eXperience), e me deparo com esta aplicação desenvolvida em Microsoft Silverlight, o Quince.

O Quince, é um diretório on-line de UX – design patterns, criado pela Infragistics. Nele você encontrará mais de 100 exemplos de padrões de UX, utilizados em aplicações Web, Desktop e outras. O mais interessante, até mesmo para fins didáticos, é que este aplicativo aborda cada padrão, informando ao desenvolvedor qual a melhor situação em usá-lo, narrando de forma a exemplificar um “Problema encontrado”, a “Solução, através do padrão”, “Contexto de aplicação.”

Fantástico!

Segue o link Quince : http://quince.infragistics.com

« Entradas anteriores |

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2755 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com