FV-RAD (Field Values) A Practical Framework for Rapid Application Development Luís Filipe Ferreira 28 de Abril de 2008 Desenvolvimento de Aplicações User Interface - Console - Forms - Web - Mobile UI Logic Domain Logic Persistence Logic Application Logic -.Net (C#, VB.Net,..) - J2EE (JAVA) - Imperative - Object Oriented - Functional - Declarative Persistence -Transactional Database (Open, Commit / Rollback, Close) - Object Relational Mapping framework (Telerik, Hibernate, etc.) - File Oriented (Load, Save) 2
Importância dos Modelos User Interface Master Plan Application Logic Implementation Model Persistence 3 Importância dos Modelos Implementation = UserTools.BuildApplication( Model, LogicType, UIType, PersistenceType ) Platform = LogicType, UIType, PersistenceType} 4
Importância dos Modelos Resumem uma realidade ou a resolução de um problema Definem um Plano Conceptual Dirigem a implementação de uma solução aplicacional Traduzem opções de Desenho Definem uma linguagem comum para a discussão e entendimento de um problema Sucintos => definem muito com muito pouco Abstractos => independentes da implementação / tecnologia Implementáveis => sintáctica e semanticamente coerentes 5 Utilização dos Modelos Desligada (da Implementação) Executável Executable UML (MDA) UML virtual machines Integrada Design-time Round-Trip engineering MDSD (Model Driven Software Development) MDA (PIMs e PSMs, one size fits all) Microsoft Software Factories Integrada Run-time AOM (Adaptive Object Modelling) 6
Utilização dos Modelos Desligada da Implementação Utilização concentrada no início do projecto (especificação de problema / solução) Descrevem o essencial Intencionalmente incompletos (facilitar actualização) Não há necessidade de manter sincronismo com a implementação Risco de desactualização 7 Executável Utilização dos Modelos UML executável (MDA) Full code generation, interpretado, etc Máquinas Virtuais Pouco trabalho existente neste domínio ( The Architecture of a UML Virtual Machine, OOPSLA 2001) Falta de flexibilidade de baixo nível? (integração com ferramentas de desenvolvimento existentes) 8
Utilização dos Modelos Integrada Design-time Round-Trip engineering O que sincronizar? Abstracção reduzida código sob a forma de modelo (detalhe no modelo) MDSD Elevado nível de abstracção (modelos mais concentrados no problema do que na solução) DSLs Domain Specific Languages Transformação de Modelos e Geração de Código (forward only) Separação entre Arquitectura do Domínio (infra-estrutura da família de software) Desenvolvimento da Aplicação (utilização da infraestrutura) 9 Utilização dos Modelos Integrada Design-time Software Factories (Microsoft) Convergência Model-Driven Development Linhas de produção de software Desenvolvimento orientado a componentes Integração em IDE Industrialização do desenvolvimento de software Uma fábrica de software pode criar nova fábrica de software mais especializada Customização em massa do software 10
Utilização dos Modelos Integrada Run-time (Adaptive Object Modeling) Adaptação do software em runtime a alterações no modelo Meta-dados com estrutura, comportamento e condicionantes de modelo Interpretação de meta-dados em run-time FV-RAD enquadra-se nesta abordagem mas Faz uma aproximação semântica à implementação para facilitar extensibilidade Está mais concentrado na estrutura do que no comportamento Comportamento fornecido por extensibilidade 11 Artefactos de Modelagem Permitem modelar estrutura e comportamento Vários tipos de diagramas (actividades, sequência, fluxo de dados, etc.) Diagramas de Classes / Associações (Entidades e Relacionamentos) Muito utilizados e de grande valor acrescentado FV-RAD baseado nestes diagramas 12
Exemplo de Modelo Company Model 13 FV-RAD - Objectivos Framework que permita integrar o desenho conceptual da aplicação com a sua implementação (model-aware) Demonstrar e testar o modelo de uma aplicação pela produção rápida / automática de protótipos executáveis Ferramenta que permita discutir e validar o impacto das decisões que afectam o desenho da aplicação Aumentar inteligência dos interfaces com utilizador (model-aware) 14
FV-RAD - Características É um framework (Opt.FieldValues) Adaptação dos modelos de classes do UML Fornece interfaces para a definição de meta-dados Dá uma implementação base desses interfaces Permite a definição do modelo baseada nos metadados Interpreta e executa em run-time esse modelo Permite criar extensões ao modelo na ferramenta de desenvolvimento 15 FV-RAD - Arquitectura Interfaces para Meta-dados Implementação de base dos interfaces Definição e Interpretação de modelos (extensão e execução) Automatismos UI baseados em meta-dados Protótipos e automatismos baseados no modelo 16
FV-RAD - Arquitectura UI PROTOTYPING (Opt.FieldValues.Gui) MODEL INTERPRETATION (Opt.FieldValues.Changes) META-DATA BASE IMPLEMENTATION (Opt.FieldValues.Base) META-DATA BASED UI (Opt.FieldValues.Gui.Base) META-DATA INTERFACES (Opt.FieldValues) 17 FV-RAD - Interfaces 18
FV-RAD Data Types 19 FV-RAD Interpretação de Modelo Persistência em Ficheiro (XML) Suporta Herança Gestão do estado dos objectos Transacções Orientadas ao Objecto Integridade Referencial (contagem de referências) Extensível Log de ocorrências Prototipagem e automatismos UI 20
FV-RAD Modelos e Mundos World Model Element Value Meta-Model ElementType Field Element.FVX (XML) Extension World.FVX (XML) 21 FV-RAD Model 22
FV-RAD Data Types FV-RAD Definição e Interpretação de Modelos 23 FV-RAD Casos de Uso Aplicações genéricas Meta-dados Automatismos UI baseados em meta-dados Aplicações persistidas em ficheiro Interpretação de modelo Alguns automatismos UI Protótipos Interpretação de modelo Automação UI completa / parcial 24
Construção de Protótipo Definição de Modelo Implementação de Modelo Extensões ao Modelo Invocação de GUI (executar protótipo) Persistência XML (.FVX) 25 26
Construção de Protótipo public class CompanyModel : DomainModel public CompanyModel() : base("company") // Company Model Definition // Element Types... ElementType employeetype = new ElementType("employee", "Funcionário", "Funcionários"); employeetype.ishometype = true; this.addelementtype(employeetype);... // Fields elemtype = employeetype; elemtype.addfield(new Field("firstName", FT.String(20), "Primeiro Nome")); elemtype.addfield(new Field("lastName", FT.String(20), "Ultimo Nome")); elemtype.addfield(new Field("birthDate", FT.Date(), "", DateTime.Now, "Data Nascimento")); elemtype.addfield(new Field("Name", FT.String(), "p- s- w- k+", "Nome")); elemtype.addfield(new Field("degrees", FT.Collection(degreeType, "c+"), "Habilitações"));... 27 Construção de Protótipo public class CompanyWorld : DomainWorld public CompanyWorld() : base(company.model) } } public override IDomainElement NewElement(IElementType elementtype, string key) switch (elementtype.name) case "department": return new Department(key); case "employee": return new Employee(key); case "degree": return new Degree(key); default: return base.newelement(elementtype, key); } } 28
Construção de Protótipo public override T Get<T>(int fieldindex) object result; if (fieldindex == NameIndex) // "Name" calculation result = FirstName + " " + LastName; } else return base.get<t>(fieldindex); } } return (T)result; public string Name get return this.get<string>(nameindex); } } 29 Demonstração de Protótipo // GUI automation FVPrototype proto = new FVPrototype(); proto.start(company.model); World changes BEGIN. ['department:1' initialized] Created 'department:1 ['department:2' initialized] Created 'department:2' ['department:3' initialized] Created 'department:3' ['employee:1' initialized] Created 'employee:1' ['degree:1' initialized] Created 'degree:1' [Add 'degree:1' to 'employee:1'.degrees] ['degree:1' ref 1] ['degree:2' initialized] Created 'degree:2' [Add 'degree:2' to 'employee:1'.degrees] ['degree:2' ref 1] ['employee:2' initialized] Created 'employee:2' ['degree:3' initialized] Created 'degree:3' [Add 'degree:3' to 'employee:2'.degrees] ['degree:3' ref 1] ['degree:4' initialized] Created 'degree:4' [Add 'degree:4' to 'employee:2'.degrees] ['degree:4' ref 1] ['employee:3' initialized] Created 'employee:3' ['employee:4' initialized] Created 'employee:4' ['employee:5' initialized] Created 'employee:5' ['employee:6' initialized] Created 'employee:6' ['employee:7' initialized] Created 'employee:7' [Set 'department:1'.manager to 'employee:7'] ['employee:7' ref 1] [Add 'employee:6' to 'department:1'.employees] ['employee:6' ref 1] [Add 'employee:7' to 'department:1'.employees] ['employee:7' ref 2] World changes CONFIRM. 30
<?xml version="1.0" encoding="utf-8"?> <company version="1.0.0"> <department key="department:1" name="marketing" manager="employee:7"> <notes>relações públicas e gestão de campanhas.</notes> <employees> <ref key="employee:6" /> <ref key="employee:7" /> Persistência </employees> </department> <department key="department:2" name="operações"> <notes>planeamento da actividade produtiva</notes> <employees /> </department> <department key="department:3" name="comercial"> <notes>planeamento da actividade de vendas</notes> <employees /> </department> <employee key="employee:1" firstname="luís" lastname="ferreira" birthdate="1968-10-16"> <degrees> <degree key="degree:1" designation="engenharia de Sistemas e Informática" degreetype="licenciatura" /> <degree key="degree:2" designation="informática" degreetype="pós-graduação" /> </degrees> </employee> <employee key="employee:2" firstname="fernando" lastname="vieira" birthdate="1971-03-28"> <degrees> <degree key="degree:3" designation="matemática e Ciências da Computação" degreetype="licenciatura" /> <degree key="degree:4" designation="informática" degreetype="pós-graduação" /> </degrees> </employee> <employee key="employee:3" firstname="sara" lastname="silva" birthdate="0001-01-01"> <degrees /> </employee> <employee key="employee:4" firstname="joão" lastname="castro" birthdate="0001-01-01"> <degrees /> </employee> <employee key="employee:5" firstname="sara" lastname="meireles" birthdate="0001-01-01"> <degrees /> </employee> <employee key="employee:6" firstname="lurdes" lastname="ribeiro" birthdate="0001-01-01"> <degrees /> </employee> <employee key="employee:7" firstname="manuela Ribeiro" birthdate="0001-01-01"> <degrees /> </employee> </company> 31 Futuro Implementação explícita de Meta-modelo DSL Visual e persistência de modelos (meta-modelo) Undo / Redo e Transacções OO Multi-nível (UI) Suporte a Associações binárias Suporte a Agregação Campos Únicos e Índices Conversão de modelos (versões) Mais tipos de dados Melhoramentos em automatismos UI (ex: Herança) Outros 32