GWT usando o Padrão MVP
|
|
- Wilson Carlos Salgado
- 8 Há anos
- Visualizações:
Transcrição
1 a r t i g o Fábio Miranda (fabio@airframes.com.br) é engenheiro de computação, graduado pelo ITA em Programa em Java SE desde 2002, e desenvolve sistemas web desde Trabalha na Airframes Engenharia & Estratégia ( desde 2005, onde atua em projetos na área de aviação civil (controle de manutenção de aeronaves e auditorias de segurança de voo). Participa do fórum RioJUG e mantém o blog Uma Arquitetura de Aplicação GWT usando o Padrão MVP Diferentemente da maioria dos frameworks Web existentes, o GWT não estabelece uma forma rígida de trabalho. Pelo contrário, pode ser integrado a qualquer tecnologia server-side inclusive tecnologias não- Java! Porém, existem boas práticas que permitem que o desenvolvimento GWT seja mais organizado, testável e de fácil manutenção. Este artigo ilustra o desenvolvimento de aplicações GWT usando o padrão MVP, à luz da apresentação GWT App Architecture Best Practices, realizada no Google I/O No artigo Hello GWT!, publicado na edição anterior da revista Mundoj, a aplicação de exemplo criada automaticamente pelo Google Plugin for Eclipse (GPE) foi destrinchada passo a passo, mostrando o funcionamento básico do GWT. Foram apresentados conceitos suficientes para programar aplicações simples. Entretanto, é fundamental estabelecer uma arquitetura-base, que possa ser adotada em aplicações mais complexas. A comunidade GWT vem adotando o MVP (Model-View-Presenter) como padrão elementar em suas arquiteturas. Uma discussão mais abrangente sobre este padrão e suas diferenças em relação ao MVC (Model-View- Controller) pode ser encontrada no blog Mind Share e em artigos facilmente encontrados pela Web. Neste artigo, será adotada uma abordagem prática, através da refatoração do código do artigo Hello GWT!, de modo a alcançar os objetivos propostos pelo MVP. À medida que os objetivos forem alcançados, serão apresentados os conceitos relevantes. 48
2 Refatoração da camada de apresentação A principal responsabilidade da View é exibir a Interface Gráfica para o usuário (User Interface ou UI). Na classe Artigo (em grande parte gerada automaticamente pelo plugin do Eclipse, GPE, e trabalhada no primeiro artigo desta série, Hello GWT! ) é relativamente fácil identificar e separar o código que lida exclusivamente com a construção da UI, conforme mostrado na Listagem 1. Listagem 1. ArtigoView.java. public abstract class ArtigoAbstractView { public static interface Messages extends GreetingMessages, ServerMessages { final Messages messages = GWT.create(Messages.class); final TextBox namefield = new TextBox(); final Button sendbutton = new Button(messages.sendButtonLabel()); public void render() { Window.setTitle(messages.heading()); RootPanel.get( heading ).add(new HTML(messages.heading())); RootPanel.get( textboxlabel ).add(new Label(messages.textboxLabel())); RootPanel.get( namefieldcontainer ).add(namefield); RootPanel.get( sendbuttoncontainer ).add(sendbutton); namefield.settext(messages.defaulttextvalue()); namefield.setfocus(true); namefield.selectall(); sendbutton.addstylename( sendbutton ); insertimages(); inserttemporaryimages(); protected abstract String greet(string text, String serverinfo, String useragent); // por conveniência, foi omitido o código que lidava com imagens e i18n No primeiro artigo foi suposto que a aplicação poderia ter dois tipos de view, uma na qual a resposta seria exibida em um alert e outra na qual a resposta seria exibida em uma caixa de diálogo. A classe da Listagem 1 é abstrata e encapsula o código comum aos dois tipos de view, mostrados nas Listagens 2 e 3. Depois dessa separação forçada, o código que restou em Artigo.java deve aparecer na IDE com indicações de erros de compilação, pois o código que comandava a lógica da apresentação estava altamente acoplado aos widgets da View. Para desacoplar esta lógica, cria-se um Presenter (Listagem 4). Ele possui internamente uma interface chamada Display: uma abstração da view que ele poderá manipular, para poder alterar diretamente a exibição da Listagem 2. View utilizando Alert. public class ArtigoAlertView extends ArtigoAbstractView protected String greet(string text, String serverinfo, String useragent) { return messages.greeting(text) +!\n\n + messages.serverinfogreeting(serverinfo) + \n\n + messages.useragentgreeting() + \n + useragent; Listagem 3. View utilizando caixa de diálogo. public class ArtigoDialogView extends ArtigoAbstractView { final DialogBox dialogbox = new DialogBox(); final Label texttoserverlabel = new Label(); final HTML serverresponselabel = new HTML(); final Button closebutton = new Button(messages.closeButtonLabel()); public ArtigoDialogView() { VerticalPanel dialogvpanel = new VerticalPanel(); dialogvpanel.addstylename( dialogvpanel ); dialogvpanel.sethorizontalalignment(verticalpanel.align_right); dialogvpanel.add(new HTML( <b> + messages.sendmessage() + </b> )); dialogvpanel.add(texttoserverlabel); dialogvpanel.add(new HTML( <br><b> + messages.replymessage() + </b> )); dialogvpanel.add(serverresponselabel); closebutton.getelement().setid( closebutton ); dialogvpanel.add(closebutton); dialogbox.settext(messages.rpclabel()); dialogbox.setanimationenabled(true); dialogbox.setwidget(dialogvpanel); closebutton.addclickhandler(new ClickHandler() { public void onclick(clickevent event) { dialogbox.hide(); sendbutton.setenabled(true); sendbutton.setfocus(true); protected String greet(string text, String serverinfo, String useragent) { return messages.greeting(text) +!<br><br> + messages.serverinfogreeting(serverinfo) + <br><br> + messages.useragentgreeting() + <br> + useragent; UI, bem como para poder responder aos eventos disparados por ela. Note que o presenter não faz referência a nenhum widget concreto (baixo acoplamento com a view), todas as interações com a view são realizadas através de chamadas da interface Display. Note também que o código ficou muito mais limpo e legível, com as responsabilidades melhores organizadas, com a view encapsulando todos os widgets e o presenter lidando com as interações entre a view e o modelo. 49
3 Listagem 4. Presenter registra um handler aos eventos do Display, o qual encapsula os widgets da View. public class ArtigoPresenter { public interface Display { HasValue<String> namefield(); HasKeyUpHandlers namefieldhandler(); HasClickHandlers sendbutton(); void onsend(greetingaction action); void showfailure(); void showgreeting(greetingaction action, GreetingResponse response); private final Display display; private final GreetingServiceAsync service; public ArtigoPresenter(Display display, GreetingServiceAsync service) { this.display = display; this.service = service; binddisplay(); private void binddisplay() { Interactor handler = new Interactor(); display.sendbutton().addclickhandler(handler); display.namefieldhandler().addkeyuphandler(handler); class Interactor implements ClickHandler, KeyUpHandler { public void onclick(clickevent event) { sendnametoserver(); public void onkeyup(keyupevent event) { if (event.getnativekeycode()==keycodes.key_enter) sendnametoserver(); private void sendnametoserver() { String texttoserver = display.namefield().getvalue(); final GreetingAction action = new GreetingAction(textToServer); display.onsend(action); service.execute(action, new AsyncCallback<GreetingResponse>() { public void onfailure(throwable caught) { display.showfailure(); public void onsuccess(greetingresponse response) { display.showgreeting(action, response); ); Obviamente, ArtigoAbstractView (Listagem 1) terá que implementar a interface ArtigoPresenter.Display (Listagem 5). Nas classes das Listagens 2 e 3, é necessário implementar os métodos da interface responsáveis por lidar com a resposta do usuário, seja com alert ou caixa de diálogo, o que é mostrado nas Listagens 6 e 7. Listagem 5. AbstractArtigoView implementa os métodos da interface Presenter.Display que dão acesso aos widgets da tela que disparam eventos. public abstract class ArtigoAbstractView implements ArtigoPresenter.Display { final TextBox namefield = new TextBox(); final Button sendbutton = new Button(messages.sendButtonLabel()); // HasValue<String> namefield() { return namefield; HasKeyUpHandlers namefieldhandler() { return namefield; HasClickHandlers sendbutton() { return sendbutton; void onsend(greetingaction action) { sendbutton.setenabled(false);... Listagem 6. ArtigoDialogView implementa os métodos da interface que o Presenter utiliza para atualizar a tela, ao receber a resposta do serviço. public class ArtigoDialogView extends ArtigoAbstractView { // void onsend(greetingaction action) { super.onsend(action); texttoserverlabel.settext(action.gettexttoserver()); serverresponselabel.settext( ); void showfailure() { dialogbox.settext(messages.rpcfailure()); serverresponselabel.addstylename( serverresponselabelerror ); serverresponselabel.sethtml(messages.servererror()); closebutton.setfocus(true); void showgreeting(greetingaction action, GreetingResponse response) { dialogbox.settext(messages.rpclabel()); serverresponselabel.removestylename( serverresponselabelerror ); String text = action.gettexttoserver(); String serverinfo = response.getserverinfo(); String useragent = response.getuseragent(); serverresponselabel.sethtml(greet(text, serverinfo, useragent)); closebutton.setfocus(true); 50
4 Listagem 7. ArtigoAlertView implementa os métodos da interface que o Presenter utiliza para atualizar a tela, ao receber a resposta do serviço. public class ArtigoAlertView extends ArtigoAbstractView { //... void showfailure() { Window.alert(messages.rpcFailure() + \n\n + messages.servererror()); void showgreeting(greetingaction action, GreetingResponse response) { String text = action.gettexttoserver(); String serverinfo = response.getserverinfo(); String useragent = response.getuseragent(); Window.alert(greet(text, serverinfo, useragent)); sendbutton.setenabled(true); Listagem 8. EntryPoint, que constrói a aplicação GWT. public class Artigo implements EntryPoint { private final GreetingServiceAsync greetingservice = GWT. create(greetingservice.class); private final Display display = new ArtigoDialogView(); // private final Display display = new ArtigoAlertView(); private final ArtigoPresenter presenter = new new ArtigoPresenter(display, greetingservice); public void onmoduleload() { presenter.display.render(); Figura 1. Diagrama de componentes. Pronto! Veja o que restou ao EntryPoint (Listagem 8): ficou enxuto, encarregado apenas de construir a aplicação e conectar os elementos do MVP entre si. O presenter responde aos eventos da view e comanda o modelo, representado pelo serviço. Para alternar entre as implementações da view (escolher se a aplicação responderá ao usuário utilizando caixa de diálogo ou alert), basta comentar a linha apropriada. A troca de uma view por outra não afeta em nada a lógica do presenter! Esta aplicação é bem simples, mas é importante frisar que, em aplicações complexas, o EntryPoint é um dos possíveis lugares onde pode ser montada a aplicação, agregando seus componentes. A figura 1 mostra o Diagrama de Componentes atual da aplicação. Note que o presenter está desacoplado da view, graças à abstração obtida com a interface Display; o presenter liga (binds) um interactor aos widgets da view utilizando esta abstração; através do interactor, o presenter consegue responder aos eventos da view, comandando a contraparte assíncrona do serviço; esta deixa um AsyncCallback aguardando a resposta do servidor; e, por fim, quando a resposta chega, o presenter atualiza a view. Note que o MVP é um padrão da Camada de Apresentação. Todo código desta camada deve estar presente em source packages, os quais são compilados para JavaScript. Por padrão, todo package de prefixo client é um source package, sendo possível adicionar outros prefixos de source packages através do descritor GWT. A figura 2 mostra um modelo geral do MVP, publicado no blog Design Codes, evidenciando que o modelo pode possuir uma parte residindo no lado cliente e outra parte residindo no lado servidor. É fácil correlacionar os elementos das figuras 1 e 2, observando apenas que, no código mostrado neste artigo, a seta que aponta para o elemento Model (Client) da figura 2 é bidirecional: a view está com acesso direto aos objetos GreetingAction e GreetingReponse, que pertencem ao Model; e o modelo consegue notificar as suas mudanças para a view, ainda que indiretamente, através do AsyncCallback. Esta variação do MVP foi catalogada por Martin Fowler como Supervising Controller (figura 3). 51
5 Presenter Command Interaction Selection WEB Model Client View Model Server Database Figura 2. Diagrama MVP (retirado do blog Design Codes ) Only for complex loigc Presenter Command User Action Triggered Update display Model Query (event) View State Changed Figura 3. Supervising Controller Design Pattern (retirado do blog Design Codes ). 52
6 Desacoplamento usando Application Events Analisando a Listagem 4 e a figura 1, pode-se notar um grande esforço para desacoplar o Presenter e a View. Isto é alcançado apenas parcialmente: apesar de o presenter ter deixado de conhecer boa parte dos detalhes da view, a interface Display ainda revela muito: ela força a realização da UI através de widgets que implementam as interfaces HasValue, HasKeyUpHandler e HasClickHandler, pertencentes à biblioteca-base GWT. Isto impede, por exemplo, a construção de UIs que utilizam widgets de outras bibliotecas baseadas no GWT (por exemplo: GXT e Smart GWT), mas que não obrigatoriamente estendem as interfaces da biblioteca-base. É necessário que o presenter desempenhe seu papel de comandar a View sem estar tão fortemente acoplado à API GWT. Para contornar o problema, pode-se deslocar o interactor para a view, onde sua responsabilidade será traduzir estímulos da view em application events, eventos da aplicação. O presenter, ao invés de registrar interactors para widgets, passará a registrar tratadores ou handlers para eventos. Note, na Listagem 10, que a interface Display deixa de dar acesso aos widgets, e passa apenas a fornecer os métodos necessários para o presenter registrar os handlers. A Listagem 9 mostra como criar eventos, que devem implementar a interface GwtEvent. Também é necessário declarar uma interface que estende EventHandler para definir o contrato que os tratadores desse evento deverão realizar. A realização da interface GreetingEvent.Handler é uma classe anônima dentro do método binddisplay() na Listagem 10. A Listagem 11 mostra parte do novo código da view, implementando o método addhandler(), o que permite ao presenter registrar tratadores de application events. Em resumo: teractor: o Cria um application event GreetingEvent populado com os dados aplicáveis. o Aciona o método handler.ongreeting do tratador de eventos. do pelo presenter (Listagem 10) em uma classe anônima que realiza a interface GreetingEvent.Handler. Listagem 9. GreetingEvent e GreetingEvent.Handler estendem GwtEvent e EventHandler, pertencentes à API base do GWT. public class GreetingEvent extends GwtEvent<GreetingEvent.Handler> { public static interface Handler extends EventHandler { public void ongreeting(greetingevent event); public final String message; public GreetingEvent(String message) { this.message = message; // campo estático usado para registrar eventos em um HandlerManager public static final GwtEvent.Type<Handler> TYPE = new GwtEvent.Type<Handler>(); GwtEvent.Type<Handler> getassociatedtype() { return TYPE; // protegido, pois só deve ser invocado por HandlerManagers void dispatch(handler handler) { handler.ongreeting(this); Listagem 10. Presenter registra um Application Handler no display. public class ArtigoPresenter { public interface Display { void addhandler(greetingevent.handler handler); void render(); void showfailure(); void showgreeting(greetingaction action, GreetingResponse response); // private void binddisplay() { display.addhandler(new GreetingEvent.Handler() { void ongreeting(greetingevent event) { final GreetingAction action = new GreetingAction(event.message); service.greet(action, new AsyncCallback<GreetingResponse>() public void onfailure(throwable caught) { public void onsuccess(greetingresponse response) { display.showgreeting(action, response); ); ); 53
7 Figura 4. Diagrama de Componentes, adicionando GreetingEvent e GreetingEvent.Handler, e deslocando o Interactor para a View. Listagem 11. Na View, o método addhandler faz uso de interactors para reagir aos widget events e notificar os application handlers. public void addhandler(greetingevent.handler handler) { Interactor interactor = new Interactor(handler); namefield.addkeyuphandler(interactor); sendbutton.addclickhandler(interactor); class Interactor implements ClickHandler, KeyUpHandler { private final GreetingEvent.Handler handler; Interactor(GreetingEvent.Handler handler) { this.handler = handler; public void onclick(clickevent event) { notifyhandler(); public void onkeyup(keyupevent event) { if (event.getnativekeycode()==keycodes.key_enter) notifyhandler(); private void notifyhandler() { String texttoserver = namefield.getvalue(); handler.ongreeting(new GreetingEvent(textToServer)); Event Bus (barramento de eventos) É possível generalizar ainda mais o conceito dos application events. Eles podem ser utilizados não apenas como um meio mais adequado para o presenter reagir aos eventos da view, como também para prover um meio global de comunicação na aplicação. A esse meio global dá-se o nome de barramento de eventos (event bus). Esta técnica é ilustrada nos slides 35 a 42 da apresentação de best practices do GWT de Ray Ryani. Para exemplificar, será adicionado mais um par view/presenter à aplicação, cuja responsabilidade será listar na tela todas as mensagens enviadas pelos usuários. Portanto, o envio de mensagem deve ser capaz não só de mostrar a resposta do servidor na tela, como também atualizar a lista as mensagens. O event bus ajudará a realizar esta comunicação, mantendo desacoplados os subsistemas ou módulos da aplicação. Para implementar o barramento de eventos, pode-se utilizar a classe HandlerManager, da API GWT. Quando a aplicação necessitar notificar vários presenters para atualizarem suas views, cada presenter terá que adicionar um handler no barramento, informando o tipo de evento (application event) no qual está interessado, e o respectivo tratador (handler), que atualizará a sua view. A figura 5 ilustra o mecanismo. A Listagem 12 mostra a classe MessagesPresenter, responsável por listar as mensagens. O método initbus registra dois handlers no barramento, um para quando a aplicação é iniciada, outro para responder a notificações de novas mensagens do usuário. Quando um evento ocorre, o barramento informa a todos os tratadores registrados para o tipo do evento disparado, e cada tratador pode então atuar sobre a sua respectiva view. 54
8 Figura 5. Através do barramento, um módulo consegue notificar os demais para atualizarem seu estado em resposta a eventos da aplicação. Listagem 12. MessagesPresenter registra handlers para StartupEvent e NewMessageEvent. public class MessagesPresenter { public interface Display { void list(listgreetingresponse greetings); void fail(); void render(); public final Display display; public final GreetingServiceAsync service; public final HandlerManager eventbus; public MessagesPresenter(Display d, GreetingServiceAsync s, HandlerManager bus) { this.display = d; this.service = s; this.eventbus = bus; initbus(); private void initbus() { final AsyncCallback cb = new AsyncCallback<MessageListResponse>() { void onfailure(throwable caught) { display.fail(); void onsuccess(messagelistresponse result) { display.list(result); ; eventbus.addhandler(startupevent.type, new StartupEvent.Handler() { void onstartup() { service.list(cb); ); eventbus.addhandler(newmessageevent.type, new NewMessageEvent.Handler() { void ongreetingresponse(newmessageevent event) { service.list(cb); ); Listagem 13. ArtigoPresenter agora notifica o barramento de eventos quando o servidor responde que recebeu uma nova mensagem. public class ArtigoPresenter { //... public ArtigoPresenter(Display display, GreetingServiceAsync service, HandlerManager bus) { this.display = display; this.service = service; this.eventbus = bus; binddisplay(); private void binddisplay() { display.addhandler(new GreetingEvent.Handler() { ); void ongreeting(greetingevent event) { final GreetingAction action = new GreetingAction(event.message); service.greet(action, new AsyncCallback<GreetingResponse>() { ); public void onsuccess(greetingresponse response) { display.showgreeting(action, response); eventbus.fireevent(new NewMessageEvent()); 55
9 Listagem 14. EntryPoint, SEM Injeção de Dependências. public class Artigo implements EntryPoint { final HandlerManager eventbus = new HandlerManager(null); final GreetingServiceAsync greetservice = GWT.create(GreetingService.class); final ArtigoPresenter.Display greetdisplay = new ArtigoDialogDeclarativeView(); final MessagesPresenter.Display messagesdisplay = new MessagesView(); private final ArtigoPresenter greetpresenter = new ArtigoPresenter(greetDisplay, greetservice, eventbus); private final MessagesPresenter messagespresenter = new MessagesPresenter(messagesDisplay, greetservice, eventbus); public void onmoduleload() { greetpresenter.display.render(); messagespresenter.display.render(); eventbus.fireevent(new StartupEvent()); É necessário atualizar também a classe ArtigoPresenter (Listagem 13), para notificar o barramento quando o servidor informar o recebimento de novas mensagens. Por fim, atualiza-se o EntryPoint (Listagem 14), sem esquecer de disparar um StartupEvent no barramento de eventos quando a aplicação é iniciada. Perceba na Listagem 14 que o eventbus é injetado nos presenters através de seus respectivos construtores (assim como os displays e serviços concretos). É desejável também tornar o barramento único e global, o que pode ser realizado através do padrão Singleton. Porém, a forma mais elegante e poderosa é utilizar um container de injeção de dependências. Dependency Injection na camada de apresentação A aplicação só tem duas telas, mas a Listagem 14 já mostra que começa a ficar trabalhoso criar manualmente os objetos da aplicação, bem como gerenciar seus ciclos de vida. Para criar ArtigoPresenter e MessagesPresenter, o EntryPoint da aplicação precisa criar também as suas várias dependências: ArtigoDisplay, MessagesDisplay, GreetigServiceAsync e HandlerManager. Além de instanciá-las, é preciso passá-las como argumentos nos construtores dos respectivos presenters. Listagem 15. Interface utilizada para obter objetos com dependências injetadas pelo public interface Injector extends Ginjector { HandlerManager eventbus(); ArtigoPresenter sendmessagepresenter(); Listagem 16. Módulo que configura as dependências. EventBus marcado como Singleton. public class ArtigoModule extends AbstractGinModule { void configure() { bind(artigopresenter.display.class).to(artigodialogview.class); bind(messagespresenter.display.class).to(messagesview.class); bind(handlermanager.class).toprovider(handlermanagerprovider.class). in(singleton.class); public static class HandlerManagerProvider implements Provider<HandlerManager> { public HandlerManager get() { return new HandlerManager(null); O barramento de eventos, HandlerManager, oferece dificuldade adicional: precisa ser um Singleton, permitindo que todos os módulos tenham uma forma global, homogênea e desacoplada para se comunicarem. Todo este esforço de configuração é cansativo e muito suscetível a erros. "Entra em cena" o padrão Dependency Injection, e a biblioteca GIN GWT INjection implementação client-side da biblioteca Google Guice, para ser utilizada com o GWT. Trabalhar com GIN é semelhante a usar a API ClientBundle: clarados métodos para obter os objetos já com as suas dependências injetadas. cias (Listagem 16). se o construtor As dependências são configuradas em classes especiais chamadas módulos. Os métodos bind informam para o GIN: ao criar um objeto, caso o construtor dele tenha um argumento da interface X, injete um objeto da classe Y. É possível também pedir ao GIN para não criar os objetos, ao invés disso obtê-los em providers. Desta forma, pode-se ter controle sobre a criação do objeto. Este recurso é utilizado para criar o HandlerManager usado como barramento de eventos da aplicação. Note que também foi informado ao GIN que o barramento é um singleton, ou seja, deve criá-lo uma única vez e injetar o mesmo barramento em todos os objetos que dele dependam. Trata-se, portanto, com uma forma simples e confiável de garantir a globalidade do barramento. Por fim, não é necessário configurar os serviços no módulo. Quando uma dependência não é explicitamente configurada, o GIN tenta automaticamente criar um objeto usando chamadas GWT.create(...) neste caso, o Gin executou a chamada GWT.create(GreetingServiceAsync.class) para poder injetar o serviço no presenter. MessagesPresenter listmessagespresenter(); 56
10 Listagem 17. Dependências de ArtigoPresenter serão injetadas, via construtor, pelo // Construtor de ArtigoPresenter public ArtigoPresenter(Display display, GreetingServiceAsync service, HandlerManager bus) { this.display = display; this.service = service; this.eventbus = bus; binddisplay(); Listagem 18. Dependências de MessagesPresenter injetadas, via construtor, pelo // Construtor de MessagesPresenter public MessagesPresenter(Display display, GreetingServiceAsync service, HandlerManager bus) { this.display = display; this.service = service; this.eventbus = bus; initbus(); Compare a Listagem 14 com a Listagem 19. Quando não é usada a Injeção de Dependências, o código do EntryPoint tende a ficar cada vez mais complexo. Delegando para o GIN a responsabilidade de criar os objetos com suas respectivas dependências, a aplicação fica bem mais organizada, e menos trabalhosa de escrever/manter. Listagem 19. EntryPoint, COM Injeção de Dependências. public class Artigo implements EntryPoint { final Injector injector = GWT.create(Injector.class); public void onmoduleload() { injector.sendmessagepresenter().display.render(); injector.listmessagespresenter().display.render(); injector.eventbus().fireevent(new StartupEvent()); Conclusão Este artigo começou a ser escrito a partir da apresentação de Best Practices de Ray Ryan (Google I/O 2009), da aplicação de exemplo no Blog Hive Development e de algum entendimento sobre MVP, baseado nos conceitos apresentados no Blog Design Codes. Mesmo em posse destas fontes, materializar os conceitos teóricos em uma arquitetura prática não foi nada fácil. Até mesmo a interpretação de todo esse material, sob o prisma da teoria e dos padrões de projeto, não foi nem um pouco trivial. O grande insight ocorreu após o primeiro passo amputar, na força bruta, todo o código de View que permeava a aplicação de exemplo. A única certeza que havia era que aquele código NÃO podia estar ali. A partir daí, com mais e mais tentativas e releituras, as coisas começaram a convergir para seu devido lugar: o papel do padrão MVP na Camada de Apresentação ficou mais claro; a elegância e a flexibilidade em se trabalhar com eventos e com um barramento de notificações; o poder de usar Dependency Injection na camada de apresentação. O GWT pode ser ainda mais produtivo no cenário oposto: tendo em posse apenas os requisitos, aplicar TDD Test Driven Development para desenvolver a aplicação. Esta forma de trabalhar é bem interessante, e será abordada no próximo artigo desta série. Este artigo NÃO apresentou uma forma única de trabalhar, e possivelmente pode não ser a melhor. Pelo contrário, foi fruto de tentativas, ao longo de um árduo processo de aprendizado, no qual a única certeza era que o GWT parecia ser uma ferramenta poderosa para a criação da camada de apresentação de aplicações Web, uma forma interessante de usar todo o poder de AJAX, sem precisar lidar com Javascript. Ainda há vários caminhos para se explorar: testes unitários da camada de apresentação, criação declarativa de UIs usando UiBinder; geração de código client-side (uma espécie de instrumentação, para compensar a inexistência da API de reflection no lado cliente); experimentação das extensões do GWT (entre as quais o GXT e o Smart GWT), comparando suas APIs, seus prós e contras, modelos de licença etc.; e também um exemplo mais abrangente, simulando aplicações CRUD. Estes serão abordados em artigos futuros. Happy GWTing! Referências 57
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE PÓS-GRADUAÇÃO EM SISTEMAS E COMPUTAÇÃO TÓPICOS AVANÇADOS EM SISTEMAS INTEGRADOS E DISTRIBUÍDOS II
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE PÓS-GRADUAÇÃO EM SISTEMAS E COMPUTAÇÃO TÓPICOS AVANÇADOS EM SISTEMAS INTEGRADOS E DISTRIBUÍDOS II RELATÓRIO TÉCNICO ADORILSON BEZERRA DE ARAÚJO ANDRÉ GUSTAVO
Leia maisUniversidade Federal de Campina Grande Departamento de Sistemas e Computação Ciência da Computação. alyssonfm@lcc.ufcg.edu.br
Universidade Federal de Campina Grande Departamento de Sistemas e Computação Ciência da Computação alyssonfm@lcc.ufcg.edu.br Maio - 2010 Agenda GWT Vantagens Desvantagens Exemplificação de códigos GWT
Leia maisPadrões de Interação com o Usuário
Padrões de Interação com o Usuário Granularidade dos Padrões Padrões estão relacionados a 3 elementos: Contexto ocorre Problema resolve Solução Problemas e Soluções podem ser observados em diferentes níveis
Leia maisComo criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse
Como criar um EJB Criando um projeto EJB com um cliente WEB no Eclipse Gabriel Novais Amorim Abril/2014 Este tutorial apresenta o passo a passo para se criar um projeto EJB no Eclipse com um cliente web
Leia maisProgramação Web. Professor: Diego Oliveira. Conteúdo 02: JSP e Servlets
Programação Web Professor: Diego Oliveira Conteúdo 02: JSP e Servlets JSP JSP é um template de uma página Web que usa Java para gerar HTML dinamicamente JSP é considerado server-side e roda em um objeto
Leia maisUm objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;
um objeto; é definido; Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo; class ClasseBase{ é instanciado; $objetobase = new ClasseBase; Caso queira,
Leia maisGuia de utilização da notação BPMN
1 Guia de utilização da notação BPMN Agosto 2011 2 Sumário de Informações do Documento Documento: Guia_de_utilização_da_notação_BPMN.odt Número de páginas: 31 Versão Data Mudanças Autor 1.0 15/09/11 Criação
Leia maisparadigma WBC Public - compra direta Guia do Fornecedor paradigma WBC Public v6.0 g1.0
paradigma WBC Public - compra direta Guia do Fornecedor paradigma WBC Public v6.0 g1.0 agosto de 2007 As informações contidas neste documento, incluíndo quaisquer URLs e outras possíveis referências a
Leia maisUNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 14 PROFª BRUNO CALEGARO
UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 14 PROFª BRUNO CALEGARO Santa Maria, 01 de Novembro de 2013. Revisão aula passada Projeto de Arquitetura Decisões de projeto de Arquitetura
Leia maisUM ESTUDO SOBRE OS FRAMEWORKS JSF E PRIMEFACES NO DESENVOLVIMENTO DE SOFTWARE WEB
UM ESTUDO SOBRE OS FRAMEWORKS JSF E PRIMEFACES NO DESENVOLVIMENTO DE SOFTWARE WEB Adriano Schulter Moenster 1, Tiago Piperno Bonetti 1 ¹Universidade Paranaense (Unipar) Paranavaí PR Brasil adrmoenster@gmail.com,
Leia maisExercícios de Revisão Java Básico
Exercícios de Revisão Java Básico (i) Programação básica (estruturada) 1) Faça um programa para calcular o valor das seguintes expressões: S 1 = 1 1 3 2 5 3 7 99... 4 50 S 2 = 21 50 22 49 23 48...250 1
Leia maisUML: Diagrama de Casos de Uso, Diagrama de Classes
UML: Diagrama de Casos de Uso, Diagrama de Classes Diagrama de Casos de Uso O modelo de casos de uso visa responder a pergunta: Que usos (funcionalidades) o sistema terá? ou Para que aplicações o sistema
Leia maisSCE-557. Técnicas de Programação para WEB. Rodrigo Fernandes de Mello http://www.icmc.usp.br/~mello mello@icmc.usp.br
SCE-557 Técnicas de Programação para WEB Rodrigo Fernandes de Mello http://www.icmc.usp.br/~mello mello@icmc.usp.br 1 Cronograma Fundamentos sobre servidores e clientes Linguagens Server e Client side
Leia maisDESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES
DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES Alexandre Egleilton Araújo, Jaime Willian Dias Universidade Paranaense (Unipar) Paranavaí PR Brasil araujo.ale01@gmail.com, jaime@unipar.br Resumo.
Leia maisDELPHI 7 LINGUAGEM DE PROGRAMAÇÃO AMBIENTE CLIENTE SERVIDOR
DELPHI 7 LINGUAGEM DE PROGRAMAÇÃO AMBIENTE CLIENTE SERVIDOR Fortaleza - CE Introdução ao ambiente de desenvolvimento delphi e preparação da interface basíca O ambiente delphi foi criado pela Borland Software
Leia maisSistemas Operacionais. Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com
Sistemas Operacionais Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com Estruturas de Sistemas Operacionais Um sistema operacional fornece o ambiente no qual os programas são executados. Internamente,
Leia maisESTENDENDO A UML PARA REPRESENTAR RESTRIÇÕES DE INTEGRIDADE
ESTENDENDO A UML PARA REPRESENTAR RESTRIÇÕES DE INTEGRIDADE Fabiana Gomes Marinho Faculdade Lourenço Filho Resumo: Na UML, a modelagem conceitual dos dados é descrita pelo diagrama de classes, que através
Leia maisImplementando uma Classe e Criando Objetos a partir dela
Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 04 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 2 Prof. Cristóvão Cunha Implementando uma Classe
Leia maisMAPEAMENTO OBJETO RELACIONAL: UM ESTUDO DE CASO
MAPEAMENTO OBJETO RELACIONAL: UM ESTUDO DE CASO UTILIZANDO O HIBERNATE Rafael Laurino GUERRA, Dra. Luciana Aparecida Martinez ZAINA Faculdade de Tecnologia de Indaiatuba FATEC-ID 1 RESUMO Este artigo apresenta
Leia maisPROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS
PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Ciclo de Vida de uma Aplicação Android Professor: Danilo Giacobo OBJETIVOS DA AULA Entender o ciclo de vida de uma aplicação Android. Conhecer algumas dicas para tirar
Leia maisCapítulo 2. Processos de Software. 2011 Pearson Prentice Hall. Todos os direitos reservados. slide 1
Capítulo 2 Processos de Software slide 1 Tópicos apresentados Modelos de processo de software. Atividades de processo. Lidando com mudanças. Rational Unified Process (RUP). Um exemplo de um processo de
Leia maisExemplo: Na figura 1, abaixo, temos: Clique aqui para continuar, que é a primeira atividade que você precisa realizar para iniciar seus estudos.
Visão Geral VISÃO GERAL Esse material abordará o acesso ao AVA (Ambiente Virtual de Aprendizagem) da Proativa do Pará, com intenção de ilustrar os aspectos na visão do Aprendiz. Essa abordagem dedica-se
Leia maisApesar de existirem diversas implementações de MVC, em linhas gerais, o fluxo funciona geralmente da seguinte forma:
1 Introdução A utilização de frameworks como base para a construção de aplicativos tem sido adotada pelos desenvolvedores com três objetivos básicos. Primeiramente para adotar um padrão de projeto que
Leia maisExemplo 1. Um programa que cria uma instância de uma classe que herda da classe Frame
6. Como aplicações gráficas funcionam em Java? Todas as aplicações gráficas em Java usam instâncias de classes existentes, que por serem parte da linguagem podem ser executadas em todas as versões de Java
Leia maisUsando o do-file editor Automatizando o Stata
Usando o do-file editor Automatizando o Stata 1 O QUE É O EDITOR DE DO-FILE O Stata vem com um editor de texto integrado, o do-file editor (editor de do-files, em português), que pode ser usado para executar
Leia maisMANUAL DA SECRETARIA
MANUAL DA SECRETARIA Conteúdo Tela de acesso... 2 Liberação de acesso ao sistema... 3 Funcionários... 3 Secretaria... 5 Tutores... 7 Autores... 8 Configuração dos cursos da Instituição de Ensino... 9 Novo
Leia maisEngenharia de Software e Gerência de Projetos Prof. Esp. André Luís Belini Bacharel em Sistemas de Informações MBA em Gestão Estratégica de Negócios
Engenharia de Software e Gerência de Projetos Prof. Esp. André Luís Belini Bacharel em Sistemas de Informações MBA em Gestão Estratégica de Negócios Cronograma das Aulas. Hoje você está na aula Semana
Leia maisORIENTAÇÕES PARA O PREENCHIMENTO DO QUESTIONÁRIO POR MEIO DA WEB
ORIENTAÇÕES PARA O PREENCHIMENTO DO QUESTIONÁRIO POR MEIO DA WEB 1 Com finalidade de auxiliar nas respostas às perguntas formuladas ou de esclarecer alguma dúvida sobre questões que não foram expressas
Leia maisUFG - Instituto de Informática
UFG - Instituto de Informática Especialização em Desenvolvimento de Aplicações Web com Interfaces Ricas EJB 3.0 Prof.: Fabrízzio A A M N Soares professor.fabrizzio@gmail.com Aula 6 EJB Enterprise Java
Leia maisUNICE Ensino Superior Linguagem de Programação Ambiente Cliente Servidor.
UNICE Ensino Superior Linguagem de Programação Ambiente Cliente Servidor. Modelo Cliente/Servidor Por HIARLY ALVES Fortaleza - CE Apresentação. O mais famoso tipo de arquitetura utilizada em redes de computadores
Leia maisJava para Desenvolvimento Web
Java para Desenvolvimento Web Servlets A tecnologia Servlet foi introduzida pela Sun Microsystems em 1996, aprimorando e estendendo a funcionalidade e capacidade de servidores Web. Servlets é uma API para
Leia maisPrototype, um Design Patterns de Criação
Prototype, um Design Patterns de Criação José Anízio Pantoja Maia Este artigo tem como finalidade compreender o funcionamento do padrão de projeto prototype, serão abordados os participantes que compõe
Leia maisCapítulo 8. Introdução UML
Capítulo 8. Introdução UML 1/42 Índice Indice 8.1 - Introdução UML 8.2 - Modelação estrutural 8.2.1 - Representação de classes e objectos 8.2.2 - Relações entre objectos 8.2-3 - Relações de associação
Leia maisagility made possible
RESUMO DA SOLUÇÃO Utilitário ConfigXpress no CA IdentityMinder a minha solução de gerenciamento de identidades pode se adaptar rapidamente aos requisitos e processos de negócio em constante mudança? agility
Leia maisCurso de Aprendizado Industrial Desenvolvedor WEB
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos II Professor: Cheli dos S. Mendes da Costa Modelo Cliente- Servidor Modelo de Aplicação Cliente-servidor Os
Leia maisPrática da Disciplina de Sistemas Distribuídos Serviços Web IFMA DAI Professor Mauro Lopes C. Silva
1. O que são Serviços Web (Web Services)? Prática da Disciplina de Sistemas Distribuídos Serviços Web IFMA DAI Professor Mauro Lopes C. Silva A ideia central dos Web Services parte da antiga necessidade
Leia maisConectar diferentes pesquisas na internet por um menu
Conectar diferentes pesquisas na internet por um menu Pré requisitos: Elaboração de questionário Formulário multimídia Publicação na internet Uso de senhas na Web Visualização condicionada ao perfil A
Leia maisOrientação a Objetos
1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou
Leia maisLÓGICA DE PROGRAMAÇÃO. Professor Celso Masotti http://ead.celsomasotti.com.br
LÓGICA DE PROGRAMAÇÃO Professor Celso Masotti http://ead.celsomasotti.com.br Ano: 2015 1 HTML & PHP em Ambiente Web PARTE II Sumário I Decisão... 4 Operadores de Comparação... 6 II IF ELSEIF ELSE... 7
Leia maisUse a Cabeça! FREEMAN, Eric e Elisabeth. HTML com CSS e XHTML BASHMAN, Brian / SIERRA Kathy / BATES, Bert. Servlets & JSP
Use a Cabeça! FREEMAN, Eric e Elisabeth. HTML com CSS e XHTML BASHMAN, Brian / SIERRA Kathy / BATES, Bert. Servlets & JSP Software cliente: browser e outros Protocolo HTTP Infraestrutura de transporte
Leia maisManual de Comunidades RIPALC
Manual de Comunidades RIPALC Última atualização 13 de março de 2012 1 Sumário 1. Como se autenticar no site?...3 2. Como funcionam as comunidades?...4 3. Como participar de um Fórum (Painel de Discussão)?...6
Leia maisNotas da Aula 6 - Fundamentos de Sistemas Operacionais
1. Monitores Notas da Aula 6 - Fundamentos de Sistemas Operacionais Embora os semáforos sejam uma boa solução para o problema da exclusão mútua, sua utilização não é trivial. O programador é obrigado a
Leia maisABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE
ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE Amarildo Aparecido Ferreira Junior 1, Ricardo Ribeiro Rufino 1 ¹Universidade Paranaense (Unipar) Paranavaí PR Brasil aapfjr@gmail.com
Leia maisAnálise e Projeto Orientados por Objetos
Análise e Projeto Orientados por Objetos Aula 01 Orientação a Objetos Edirlei Soares de Lima Paradigmas de Programação Um paradigma de programação consiste na filosofia adotada na
Leia maisProjeto ECA na Escola - Plataforma de Educação à Distância
Página1 Apresentação Projeto ECA na Escola - Plataforma de Educação à Distância Olá Participante do Projeto ECA na Escola, Este tutorial pretende auxiliá-lo na navegação na Plataforma de Educação à Distância
Leia maisATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS
ATRIBUTOS PRIVADOS Podemos usar o modificador private, para tornar um atributo privado, obtendo um controle centralizado Definimos métodos para implementar todas as lógicas que utilizam ou modificam o
Leia maisPESQUISA EM INFORMÁTICA -ESTILOS DE PESQUISA EM COMPUTAÇÃO. Prof. Angelo Augusto Frozza, M.Sc.
PESQUISA EM INFORMÁTICA -ESTILOS DE PESQUISA EM COMPUTAÇÃO Prof. Angelo Augusto Frozza, M.Sc. O TRABALHO DE CONCLUSÃO Introdução O texto que segue resume os Capítulo 2 e 8, do livro Metodologia de Pesquisa
Leia maisComputação II Orientação a Objetos
Computação II Orientação a Objetos Fabio Mascarenhas - 2014.1 http://www.dcc.ufrj.br/~fabiom/java Introdução Esse não é um curso de Java! O objetivo é aprender os conceitos da programação orientada a objetos,
Leia maisAutor: Tiago Lone Nível: Básico Criação: 19/12/2005 Última versão: 18/12/2006. PdP. Pesquisa e Desenvolvimento de Produtos
TUTORIAL Barra de LEDs Autor: Tiago Lone Nível: Básico Criação: 19/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br contato@maxwellbohr.com.br
Leia maisMódulo 07 Características Avançadas de Classes
Módulo 07 Características Avançadas de Classes Última Atualização: 15/06/2010 1 Objetivos Descrever variáveis, métodos e iniciadores static Descrever a semântica do modificador final em classes, métodos
Leia maisCriando um script simples
Criando um script simples As ferramentas de script Diferente de muitas linguagens de programação, você não precisará de quaisquer softwares especiais para criar scripts de JavaScript. A primeira coisa
Leia maisMVC e Camadas - Fragmental Bliki
1 de 5 20-03-2012 18:32 MVC e Camadas From Fragmental Bliki Conteúdo 1 Introdução 2 Camadas: Separação Entre Componentes 3 MVC: Interação Entre Componentes 4 Conclusão 5 Referências Introdução A Arquitetura
Leia maisMINISTÉRIO DO DESENVOLVIMENTO AGRÁRIO SUBSECRETARIA DE PLANEJAMENTO, ORÇAMENTO E ADMINISTRAÇÃO COORDENAÇÃO GERAL DE MODERNIZAÇÃO E INFORMÁTICA SISAU
MINISTÉRIO DO DESENVOLVIMENTO AGRÁRIO SUBSECRETARIA DE PLANEJAMENTO, ORÇAMENTO E ADMINISTRAÇÃO COORDENAÇÃO GERAL DE MODERNIZAÇÃO E INFORMÁTICA SISAU SISTEMA DE ATENDIMENTO AO USUÁRIO MANUAL DO USUÁRIO
Leia maisAula 03 - Projeto Java Web
Aula 03 - Projeto Java Web Para criação de um projeto java web, vá em File/New. Escolha o projeto: Em seguida, na caixa Categorias selecione Java Web. Feito isso, na caixa à direita selecione Aplicação
Leia maisAleph. Entre Bibliotecas. Reunião da REJE 09 de novembro de 2011
Aleph Empréstimo Entre Bibliotecas Reunião da REJE 09 de novembro de 2011 1. Conceitos e definições 2 Para que serve o módulo de EEB? Para que a Biblioteca possa receber solicitações de seus usuários de
Leia maisEngenharia de Software II
Engenharia de Software II Aula 28 Revisão para a Prova 2 http://www.ic.uff.br/~bianca/engsoft2/ Aula 28-28/07/2006 1 Matéria para a Prova 2 Gestão de projetos de software Conceitos (Cap. 21) Métricas (Cap.
Leia maisPADRÕES DE PROJETO. Prof.: Jean Carlo Mendes carlomendes@yahoo.com.br http://www.jeancarlomendes.com.br
PADRÕES DE PROJETO Prof.: Jean Carlo Mendes carlomendes@yahoo.com.br http://www.jeancarlomendes.com.br Implementação Padrões Factory Vamos utilizar o exemplo do livro Head First! Design Patterns e implementá-lo
Leia maisIntrodução a Banco de Dados Aula 03. Prof. Silvestri www.eduardosilvestri.com.br
Introdução a Banco de Dados Aula 03 Prof. Silvestri www.eduardosilvestri.com.br Arquiteturas de Banco de Dados Arquiteturas de BD - Introdução Atualmente, devem-se considerar alguns aspectos relevantes
Leia mais2 Ferramentas Utilizadas
2 Ferramentas Utilizadas Esta dissertação utiliza vários outros trabalhos para implementar os mecanismos de adaptação abordados. Essas ferramentas são descritas nas seções seguintes. 2.1 Lua Lua [7, 8]
Leia maisMOCKITO - - Alexandre Gazola (alexandregazola@gmail.com / Twitter: @alexandregazola)
cinto de utilidades mocks_ CRIAÇÃO DE MOCKS COM MOCKITO No último artigo desta coluna, falamos de uma forma geral sobre diversas ferramentas para suporte a testes automatizados. Dentre as ferramentas mencionadas,
Leia mais3 Qualidade de Software
3 Qualidade de Software Este capítulo tem como objetivo esclarecer conceitos relacionados à qualidade de software; conceitos estes muito importantes para o entendimento do presente trabalho, cujo objetivo
Leia maisComo o FIT funciona. FIT: Framework for Integrated Tests FIT. http://fit.c2.com. Dados de testes. Programa. Fixtures. classes. Resultados de testes
Como o FIT funciona FIT: Framework for Integrated Tests http://fit.c2.com Dados de testes Fixtures Programa classes FIT Resultados de testes Universidade Portucalense Engenharia de Software ES04 2014-2015
Leia maisAcessando o SVN. Soluções em Vendas Ninfa 2
Acessando o SVN Para acessar o SVN é necessário um código de usuário e senha, o código de usuário do SVN é o código de cadastro da sua representação na Ninfa, a senha no primeiro acesso é o mesmo código,
Leia maisAula 06 Usando controles em ASP.NET
Tecnologia em Análise e Desenvolvimento de Sistemas Disciplina: Linguagem de Programação Plataforma.NET 2 Aula 06 Usando controles em ASP.NET Nas propriedades do FORM temos a opções EnableViewState. Esta
Leia maisManual de Publicação Wordpress
Fundação Universidade Federal de Mato Grosso do Sul Manual de Publicação Wordpress Núcleo de Tecnologia da Informação - UFMS Maurílio Mussi Montanha 2014 Sumário 1 Introdução... 3 2 ACESSO À INTERFACE
Leia maisResolução da lista de exercícios de casos de uso
Resolução da lista de exercícios de casos de uso 1. Explique quando são criados e utilizados os diagramas de casos de uso no processo de desenvolvimento incremental e iterativo. Na fase de concepção se
Leia maisPROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS
PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Tratamento de Eventos Professor: Danilo Giacobo OBJETIVOS DA AULA Apresentar os modelos mais comuns de tratamento de eventos da plataforma Android. Aprender a utilizar
Leia maisCapítulo 3. Redes Sociais 24
3 Redes Sociais No contexto da Internet, redes sociais podem ser definidas como locais (sites) em que pessoas se conectam umas às outras através de laços sociais baseados em afinidades, interesses em comum
Leia maisGerenciamento de Entrada e Saída Hélio Crestana Guardia e Hermes Senger
Gerenciamento de Entrada e Saída Hélio Crestana Guardia e Hermes Senger O controle da entrada e saída (E/S ou I/O, input/output) de dados dos dispositivos é uma das funções principais de um sistema operacional.
Leia maisManual do Desktop Sharing. Brad Hards Tradução: Marcus Gama
Brad Hards Tradução: Marcus Gama 2 Conteúdo 1 Introdução 5 2 O protocolo do Buffer de Quadro Remoto (Buffer de Quadro Remoto) 6 3 Usando o Desktop Sharing 7 3.1 Gerenciando convites do Desktop Sharing........................
Leia maisAnálise e Projeto Orientado a Objetos
Análise e Projeto Orientado a Objetos Linguagem UML Modelagem Estrutural Modelagem Estrutural Anderson Belgamo Classes Definição: uma classe é uma descrição de um conjunto de objetos que compartilham os
Leia maisInstalação do Sirius sem estações. O primeiro passo é instalar o Firebird 1.5, ele se encontra no CD de instalação do Sirius na pasta Firebird.
Instalação do Sirius sem estações 1. Instalando o Firebird...1 2. Instalando o Sirius...7 3. Configurações do Sirius:...11 Configuração dos arquivos do Sirius e Firebird...12 Firebird:...12 Sirius:...13
Leia maisDocumentação Usando o Javadoc
Documentação Usando o Javadoc Prof. MSc. João Carlos Pinheiro jcpinheiro@cefet-ma.br Versão 2.1 Última Atualização: 04/2005 1 Comentários e Documentação Comentários em Java Existem três tipos de comentários
Leia maisDALUA: BIBLIOTECA PARA APLICAÇÕES DISTRIBUÍDAS
DALUA: BIBLIOTECA PARA APLICAÇÕES DISTRIBUÍDAS Aluno: Ricardo Gomes Leal Costa Orientadora: Noemi de la Rocque Rodriguez Introdução A biblioteca DALua [1], fruto do projeto anterior, tem por objetivo oferecer
Leia maisProva Específica Cargo Desenvolvimento
UNIVERSIDADE FEDERAL DO PIAUÍ Centro de Educação Aberta e a Distância CEAD/UFPI Rua Olavo Bilac 1148 - Centro CEP 64.280-001 Teresina PI Brasil Fones (86) 3215-4101/ 3221-6227 ; Internet: www.uapi.edu.br
Leia maisThemis Serviços On Line - Publicações
Nome do documento Guia do Usuário Themis Serviços On Line - Publicações Sumário Introdução:... 3 1 - Cadastro dos Usuários do Themis Serviços On Line:... 3 2 - Acesso ao Sistema Themis Serviços On Line:...
Leia maisGuia rápido de criação e gestão de um espaço no SAPO Campus
Guia rápido de criação e gestão de um espaço no SAPO Campus O SAPO Campus é uma plataforma online, disponível em http://campus.sapo.pt, que permite a comunicação e a colaboração entre membros de uma Instituição
Leia maisNeste artigo, serão apresentados os principais conceitos sobre os TRIGGERS e sua aplicabilidade.
www.devm edia.com.br [versão para im pressão] MySQL TRIGGERS Neste artigo, serão apresentados os principais conceitos sobre os TRIGGERS e sua aplicabilidade. MySQL TRIGGERS Neste artigo, serão apresentados
Leia maisO Processo de Engenharia de Requisitos
UNIVERSIDADE ESTADUAL PAULISTA INSTITUTO DE BIOCIÊNCIAS, LETRAS E CIÊNCIAS EXATAS DEPARTAMENTO DE CIÊNCIAS DE COMPUTAÇÃO E ESTATÍSTICA O Processo de Engenharia de Requisitos Engenharia de Software 2o.
Leia maisAnálise de Programação
Análise de Programação Conceitos Avançados da Linguagem de Programação Java Prof Gilberto B Oliveira Encapsulamento Proteger o dado dentro de uma classe (capsula segura) Facilita o uso da classe por outros
Leia maisMANUAL DE UTILIZAÇÃO DO TREINAMENTO EAD (Educação a Distância) ÍNDICE
MANUAL DE UTILIZAÇÃO DO TREINAMENTO EAD (Educação a Distância) ÍNDICE FORMAS DE ACESSO AO AMBIENTE EAD... 2 O AMBIENTE EAD... 3 TERMO DE COMPROMISSO... 4 CONHECENDO A HOME PAGE DO TREINAMENTO EAD... 4
Leia maisRespondendo a eventos
Respondendo a eventos Até agora, a maioria dos scripts que você escreveu foi executado de uma forma tranqüila e ordenada, movendo-se da primeira instrução para a última. Agora aprenderemos a utilizar a
Leia maisPadrões de Projeto WEB e o MVC
Padrões de Projeto WEB e o MVC Padrões de Projeto WEB e o MVC O que são padrões? "Cada padrão descreve um problema que ocorre freqüentemente em seu ambiente, e então descreve o cerne da solução para aquele
Leia maisBoletim Eletrônico de Recolhimento Manual do Sistema. Boletim Eletrônico de Recolhimento. Manual do Sistema
Boletim Eletrônico de Recolhimento Manual do Sistema Versão 1.2 Junho / 2013 Sumário 1. Introdução... - 3-2. O Sistema BOLETIM ELETRÔNICO DE RECOLHIMENTO... - 3-3. Pré-requisitos... - 3-4. Primeiro Acesso...
Leia maisUM ESTUDO PARA A EVOLUÇÃO DO PHP COM A LINGUAGEM ORIENTADA A OBJETOS
UM ESTUDO PARA A EVOLUÇÃO DO PHP COM A LINGUAGEM ORIENTADA A OBJETOS Jean Henrique Zenzeluk* Sérgio Ribeiro** Resumo. Este artigo descreve os conceitos de Orientação a Objetos na linguagem de programação
Leia maisUnidade 8: Padrão MVC e DAO Prof. Daniel Caetano
Programação Servidor para Sistemas Web 1 Unidade 8: Padrão MVC e DAO Prof. Daniel Caetano Objetivo: Apresentar a teoria por trás dos padrões na construção de aplicações Web. INTRODUÇÃO Nas aulas anteriores
Leia maisMódulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010
Módulo 02 Programação Orientada a Objetos Última atualização: 07/06/2010 1 Objetivos Definir conceitos de orientação a objetos: o abstração, encapsulamento, pacotes. Discutir reutilização de código em
Leia maisAgentes Inteligentes segundo o Chimera
Agentes Inteligentes segundo o Chimera C Heuristic I M E R A No ambiente de desenvolvimento de Agentes Inteligentes Chimera, uma extensão do LPA Win-Prolog, um agente é funcionalmente composto por: Código,
Leia maisUML Unified Modeling Language. Professor: André Gustavo Bastos Lima
UML Unified Modeling Language Professor: André Gustavo Bastos Lima Diagramas de Casos de Uso Professor: André Gustavo Bastos Lima DEFINIÇÃO DE CASO DE USO Segundo o RUP: Um Caso de Uso é a relação de uma
Leia maisBR DOT COM SISPON: MANUAL DO USUÁRIO
BR DOT COM SISPON: MANUAL DO USUÁRIO BAURU 2015 2 BR DOT COM SISPON: MANUAL DO USUÁRIO Manual do usuário apresentado para auxiliar no uso do sistema SisPon. BAURU 2015 3 SUMÁRIO 1 Instalação... 5 1.1 Sispon...
Leia maisUML & Padrões Aula 3. UML e Padrões - Profª Kelly Christine C. Silva
UML & Padrões Aula 3 UML e Padrões - Profª Kelly Christine C. Silva 1 UML & Padrões Aula 3 Diagrama de Casos de Uso Profª Kelly Christine C. Silva O que vamos tratar: Modelos de Caso de Uso Diagrama de
Leia maisManual do Teclado de Satisfação Online WebOpinião
Manual do Teclado de Satisfação Online WebOpinião Versão 1.2.3 27 de novembro de 2015 Departamento de Engenharia de Produto (DENP) SEAT Sistemas Eletrônicos de Atendimento 1. Introdução O Teclado de Satisfação
Leia maisnatureza do projeto e da aplicação métodos e ferramentas a serem usados controles e produtos que precisam ser entregues
Modelo De Desenvolvimento De Software É uma representação abstrata do processo de desenvolvimento que define como as etapas relativas ao desenvolvimento de software serão conduzidas e interrelacionadas
Leia maisComo já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser
A1Criando um módulo de negócio Capítulo 27 Aplicação dividida em módulos - Introdução Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser compreendido como uma solução de
Leia maisManipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro (bruno.calegaro@ifsc.edu.br) Maio/ 2015
Manipulação de Banco de Dados com Java Ms. Bruno Crestani Calegaro (bruno.calegaro@ifsc.edu.br) Maio/ 2015 Acesso a um SGBD Em sistemas mais simples o uso de arquivos pode ser usado mas para aplicações
Leia maisFundamentos de Teste de Software
Núcleo de Excelência em Testes de Sistemas Fundamentos de Teste de Software Módulo 2- Teste Estático e Teste Dinâmico Aula 4 Projeto de Teste 1 SUMÁRIO INTRODUÇÃO... 3 ANÁLISE E PROJETO DE TESTE... 3 1.
Leia mais1. Explicando Roteamento um exemplo prático. Através da análise de uns exemplos simples será possível compreender como o roteamento funciona.
Aula 14 Redes de Computadores 24/10/07 Universidade do Contestado UnC/Mafra Sistemas de Informação Prof. Carlos Guerber ROTEAMENTO EM UMA REDE DE COMPUTADORES A máscara de sub-rede é utilizada para determinar
Leia maisManual de Instalação SIM/SINASC
Manual de Instalação SIM/SINASC Agosto/2009 Versão 2.2 Índice CAPÍTULO 01 INTRODUÇÃO... 4 CAPÍTULO 02 - PERFIL DO HARDWARE... 5 CAPÍTULO 03 INSTALADOR SIM SINASC 2.2... 6 CAPÍTULO 04 - MODO DE INSTALAÇÃO...
Leia mais