QtModeling: Metamodelagem e
Model-Driven Software Engineering
com Qt5
Sandro S. Andrade
sandroandrade@kde.org / @andradesandro
FISL 15 – Fórum Internacional de Software Livre – Porto Alegre – Maio/2014
   
Introdução
● Motivos para uso de modelos na Engenharia de
Software:
● Documentação
● Geração automática de código / sincronização modelo-
artefatos
● Recuperação Arquitetural e Verificação de Conformidade
● Gerência de Qualidade e Integração Contínua
● Predição de Atributos de Qualidade / Simulação
● Domain-Specific Languages (DSLs)
● Models@run.time
   
Introdução
● Diferentes notações diferentes propósitos→ →
diferentes graus de formalidade:
– Linguagem natural, gráficos informais, UML, Architecture
Description Languages (ADLs)
● Linguagens de modelagem baseadas em
metamodelos:
– Metamodelo Linguagem de Modelagem Modelo→ →
– MOF MOF {UML, CWM, DuSE} seu modelo→ → →
   
Introdução
● Exemplo de
stack de
metamodelagem:
   
Introdução
● Model-Driven Software Engineering (MDSE)
● Uma plataforma para MDSE deve ser capaz de:
– Permitir a criação, manipulação e transformação de
modelos descritos em diversas linguagens de
modelagem
– Permitir a criação de novas linguagens de modelagem
(de domínio específico)
– Viabilizar a integração do uso de modelos nas atividades
que compõem o processo de desenvolvimento
   
Introdução
● Cenário exemplo 1:
– Configuração de um exemplar de uma linha de produto
(ex: novo sistema embarcado para smartphones) a partir
do uso de modelos
– Análise da arquitetura resultante (teste arquitetural
antecipado)
– Subsequente geração de código ou artefatos de
integração
   
Introdução
● Cenário exemplo 2:
– Uma arquitetura prescrita foi projetada pelo arquiteto
– Constantes evoluções/manutenções podem degradar a
arquitetura
– Deseja-se integrar o uso de modelos nos scripts de
Integração Contínua de modo a detectar
antecipadamente possíveis desvios/erosões
arquiteturais
   
Qt5
● Lançado oficialmente em Dezembro de 2012
● Qt-project.org
● Amplo conjunto de features:
– Widgets, Multimídia, Network, Banco de Dados, OpenGL,
Sensors, XML, dentre outras
● Plataformas suportadas:
– Windows, Linux/X11, Max OS X, QNX, VxWorks, Android,
iOS
● Nenhum suporte a uso de modelos (até então)
   
Qt5
   
QtModeling
● Conjunto de módulos add-on do Qt5 para MDSE
● Desenvolvido upstream
● http://qt-project.org/wiki/QtModeling
● git clone git://gitorious.org/qt/qtmodeling.git
   
QtModeling
● Objetivos:
– Alta conformidade com os padrões do Object
Management Group (OMG)
– API Qt-ish para criação e manipulação de modelos:
● Fácil compreensão
● Boa produtividade
– Excelente desempenho em múltiplas plataformas
– Suporte por ferramenta (DuSE-MT):
● Extensibilidade
   
QtModeling - API
QUmlModel *model = new QUmlModel("MyModel");
QUmlPackage *package = new QUmlPackage("Package1");
QUmlPrimitiveType *stringType = new QUmlPrimitiveType("String");
QUmlClass * class_ = new QUmlClass("Student");
class_->setAbstract(false);
QUmlProperty *property = new QUmlProperty(“name”);
property->setType(stringType);
property->setFinal(true);
… (cont.)
   
QtModeling - API
… (cont.)
package->addOwnedType(class_);
model->addPackagedElement(package);
model->addOwnedType(primitiveType);
// query model or
// perform 'well-formed/sanity/architectural conformance'
// checks
delete model;
   
QtModeling – Serialização XMI
QFile file("test.xmi");
if (!file.open(QFile::WriteOnly | QFile::Text)) {
qDebug() << "Cannot write file !";
return 1;
}
QXmiWriter writer(model);
writer.writeFile(&file);
file.close();
   
QtModeling
● Módulos disponíveis:
– QtModeling
– QtModelingWidgets
– QtMof + metamodel plugin
– QtUml + metamodel plugin
– QtDuSE + metamodel plugin
– QtSADuSEProfile + metamodel plugin
   
DuSE-MT
● Nasceu como um exemplo de uso do QtModeling
● Evoluiu para uma ferramenta de MDSE (duse.sf.net)
● Objetivos de design:
– Metamodel-agnostic (metamodelos/linguagens são
plugins)
– Acesso e manipulação de modelos via linguagens
interpretadas
– Amplo editor de propriedades
– Implementação declarativa de sintaxes concretas
   
DuSE-MT
   
DuSE-MT – Model Inspector
   
DuSE-MT – Plugins
   
DuSE-MT – Sintaxe Concreta
   
DuSE-MT – Interpretador JavaScript
   
DuSE-MT – Property Editor
   
QtModeling - Desafios
● O metamodelo da UML possui 239 metaclasses
● Destas, 193 são classes concretas
● Muitas heranças múltiplas e dreaded diamonds
– Estaria tudo ok se estivéssemos implementando em C++
(heranças virtuais) …
– … mas QObject's não gostam de heranças múltiplas
(muito menos virtuais)
– Solução: QObject-free implementation + QObject-based
wrappers
   
QtModeling - Desafios
● 91.83% do código do metamodelo UML foi gerado
automaticamente:
– OMG XMI Perl Template Toolkit QtModeling templates→ →
QtUml/QtMof/Qt<your-language> implementation→
● Exceções: propriedades derivadas e operações
(sendo implementadas sob demanda)
● Futuro: Grantlee para suportar geração automática
de implementações de metamodelos
– Ex: definição de DSLs
   
QtModeling - Desafios
● A implementação atual possui suporte completo a:
– Propriedades do tipo Derived (sob demanda) e Derived
Union (já implementadas)
– Propriedades opposite, subsetted e redefined
– Operações (sob demanda)
– Enumerações
– Clonagem de elementos de modelagem
– Memory ownership para agregações do tipo composite
– Serialização XMI (metamodel-agnostic)
   
DuSE-MT - Desafios
● Amplo uso de reflexão computacional, de modo a
não depender de um metamodelo particular
● QtScript para viabilização de um Interpretador
JavaScript para acesso e manipulação de modelos:
– Criação de regras de boa-formação pelo próprio usuário
– Plugins escritos em JavaScript (ou Python, Ruby, etc
com o KDE Kross)
● Novos models e views do Qt para acesso aos
elementos e propriedades de um elemento
   
DuSE-MT - Desafios
● Sintaxe concreta:
– QML to the rescue
– Porque QML:
● Linguagem declarativa (boa produtividade, boa compreensão)
● Execução suportada por hardware (OpenGL)
● Amplamente utilizada para construção de GUIs/UXs em
diversos form factors
● Tecnologia de preferência para construção de novos widgets
para o KDE Plasma
   
DuSE-MT - Desafios
● Exemplo de sintaxe concreta em QML:
import QtQuick 2.0
UmlElement {
UmlSlot { id: nameSlot; anchors.top: parent.top
Text { id: label, text: element.name,
anchors.centerIn: parent
}
}
… (cont.)
   
DuSE-MT - Desafios
● Exemplo de sintaxe concreta em QML:
UmlSlot { id: attributeSlot
anchors { top: nameSlot.bottom; topMargin: -1 }
height: (parent.height - nameSlot.height)/2
ListView { model: element.ownedAttributes
anchors { fill: parent; margins: 4 }
delegate: Text {
text: visibility(modelData.visibility) + modelData.name + ": " +
modelData.type
}
   
DuSE-MT - Desafios
● Resultado:
   
DuSE
● Processo para projeto arquitetural automatizado de
arquiteturas de software
● Linguagem para criação de design spaces
arquiteturais específicos de domínio
● Objetivos:
– Representar conhecimento refinado de design de uma
maneira mais sistemática e estruturada
– Suportar o (re)design automatizado de arquiteturas
– Suportar otimização multi-objetivo de arquiteturas
   
DuSE - metamodelo
   
DuSE - otimização
● Otimizando arquiteturas de software:
– Trade-offs entre atributos de qualidade são inevitáveis
– Otimização multi-objetivo com articulação a posteriori de
preferências é uma boa forma de abordar o problema
● Novo módulo: QtOptimization
– Influenciado pelo JMetal
– Disponibiliza o algoritmo evolucionário para otimização
multi-objetivo NSGA-II
– Retorna um Pareto-front de arquiteturas (near-)optimal
   
DuSE - aplicações
● SA:DuSE
– Design Space concreto, especificado em DuSE, que
captura as principais dimensões de design no domínio de
Sistemas Self-Adaptive
– Aplicado para gerar automaticamente arquiteturas de
controladores para arquiteturas MapReduce e
WebServers
● SO:DuSE (em andamento)
– Idem, para Sistemas Self-Organizing
   
QtModeling – o futuro
● Comunidade em formação:
– 1 professor, 3 alunos de pós-graduação, 2 bolsistas PIBIC,
2 alunos de graduação
– 2 contribuidores iniciantes na Europa e Asia
● Ainda não temos um release :(
   
QtModeling – o futuro
● Trabalhos futuros:
– Framework para geração flexível de código
– Redes sociais para modelagem de software
– Estilos arquiteturais, recuperação, métricas, model@RT
(em andamento)
– Boost no Umbrello ?
– Suporte a MDSE no QtCreator e KDevelop ?
   
QtModeling – o futuro
● O QtModeling é um projeto Qt
● Contribuições são sempre bem-vindas
● Há muito a ser feito !!!
   
Obrigado ! Perguntas ?
Sandro S. Andrade
sandroandrade@kde.org / @andradesandro
FISL 15 – Fórum Internacional de Software Livre – Porto Alegre – Maio/2014

Palestra do FISL15: QtModeling: Metamodelagem e Model-Driven Software Engineering com Qt5

  • 1.
        QtModeling: Metamodelageme Model-Driven Software Engineering com Qt5 Sandro S. Andrade sandroandrade@kde.org / @andradesandro FISL 15 – Fórum Internacional de Software Livre – Porto Alegre – Maio/2014
  • 2.
        Introdução ● Motivospara uso de modelos na Engenharia de Software: ● Documentação ● Geração automática de código / sincronização modelo- artefatos ● Recuperação Arquitetural e Verificação de Conformidade ● Gerência de Qualidade e Integração Contínua ● Predição de Atributos de Qualidade / Simulação ● Domain-Specific Languages (DSLs) ● Models@run.time
  • 3.
        Introdução ● Diferentesnotações diferentes propósitos→ → diferentes graus de formalidade: – Linguagem natural, gráficos informais, UML, Architecture Description Languages (ADLs) ● Linguagens de modelagem baseadas em metamodelos: – Metamodelo Linguagem de Modelagem Modelo→ → – MOF MOF {UML, CWM, DuSE} seu modelo→ → →
  • 4.
        Introdução ● Exemplode stack de metamodelagem:
  • 5.
        Introdução ● Model-DrivenSoftware Engineering (MDSE) ● Uma plataforma para MDSE deve ser capaz de: – Permitir a criação, manipulação e transformação de modelos descritos em diversas linguagens de modelagem – Permitir a criação de novas linguagens de modelagem (de domínio específico) – Viabilizar a integração do uso de modelos nas atividades que compõem o processo de desenvolvimento
  • 6.
        Introdução ● Cenárioexemplo 1: – Configuração de um exemplar de uma linha de produto (ex: novo sistema embarcado para smartphones) a partir do uso de modelos – Análise da arquitetura resultante (teste arquitetural antecipado) – Subsequente geração de código ou artefatos de integração
  • 7.
        Introdução ● Cenárioexemplo 2: – Uma arquitetura prescrita foi projetada pelo arquiteto – Constantes evoluções/manutenções podem degradar a arquitetura – Deseja-se integrar o uso de modelos nos scripts de Integração Contínua de modo a detectar antecipadamente possíveis desvios/erosões arquiteturais
  • 8.
        Qt5 ● Lançadooficialmente em Dezembro de 2012 ● Qt-project.org ● Amplo conjunto de features: – Widgets, Multimídia, Network, Banco de Dados, OpenGL, Sensors, XML, dentre outras ● Plataformas suportadas: – Windows, Linux/X11, Max OS X, QNX, VxWorks, Android, iOS ● Nenhum suporte a uso de modelos (até então)
  • 9.
  • 10.
        QtModeling ● Conjuntode módulos add-on do Qt5 para MDSE ● Desenvolvido upstream ● http://qt-project.org/wiki/QtModeling ● git clone git://gitorious.org/qt/qtmodeling.git
  • 11.
        QtModeling ● Objetivos: –Alta conformidade com os padrões do Object Management Group (OMG) – API Qt-ish para criação e manipulação de modelos: ● Fácil compreensão ● Boa produtividade – Excelente desempenho em múltiplas plataformas – Suporte por ferramenta (DuSE-MT): ● Extensibilidade
  • 12.
        QtModeling -API QUmlModel *model = new QUmlModel("MyModel"); QUmlPackage *package = new QUmlPackage("Package1"); QUmlPrimitiveType *stringType = new QUmlPrimitiveType("String"); QUmlClass * class_ = new QUmlClass("Student"); class_->setAbstract(false); QUmlProperty *property = new QUmlProperty(“name”); property->setType(stringType); property->setFinal(true); … (cont.)
  • 13.
        QtModeling -API … (cont.) package->addOwnedType(class_); model->addPackagedElement(package); model->addOwnedType(primitiveType); // query model or // perform 'well-formed/sanity/architectural conformance' // checks delete model;
  • 14.
        QtModeling –Serialização XMI QFile file("test.xmi"); if (!file.open(QFile::WriteOnly | QFile::Text)) { qDebug() << "Cannot write file !"; return 1; } QXmiWriter writer(model); writer.writeFile(&file); file.close();
  • 15.
        QtModeling ● Módulosdisponíveis: – QtModeling – QtModelingWidgets – QtMof + metamodel plugin – QtUml + metamodel plugin – QtDuSE + metamodel plugin – QtSADuSEProfile + metamodel plugin
  • 16.
        DuSE-MT ● Nasceucomo um exemplo de uso do QtModeling ● Evoluiu para uma ferramenta de MDSE (duse.sf.net) ● Objetivos de design: – Metamodel-agnostic (metamodelos/linguagens são plugins) – Acesso e manipulação de modelos via linguagens interpretadas – Amplo editor de propriedades – Implementação declarativa de sintaxes concretas
  • 17.
  • 18.
        DuSE-MT –Model Inspector
  • 19.
  • 20.
        DuSE-MT –Sintaxe Concreta
  • 21.
        DuSE-MT –Interpretador JavaScript
  • 22.
        DuSE-MT –Property Editor
  • 23.
        QtModeling -Desafios ● O metamodelo da UML possui 239 metaclasses ● Destas, 193 são classes concretas ● Muitas heranças múltiplas e dreaded diamonds – Estaria tudo ok se estivéssemos implementando em C++ (heranças virtuais) … – … mas QObject's não gostam de heranças múltiplas (muito menos virtuais) – Solução: QObject-free implementation + QObject-based wrappers
  • 24.
        QtModeling -Desafios ● 91.83% do código do metamodelo UML foi gerado automaticamente: – OMG XMI Perl Template Toolkit QtModeling templates→ → QtUml/QtMof/Qt<your-language> implementation→ ● Exceções: propriedades derivadas e operações (sendo implementadas sob demanda) ● Futuro: Grantlee para suportar geração automática de implementações de metamodelos – Ex: definição de DSLs
  • 25.
        QtModeling -Desafios ● A implementação atual possui suporte completo a: – Propriedades do tipo Derived (sob demanda) e Derived Union (já implementadas) – Propriedades opposite, subsetted e redefined – Operações (sob demanda) – Enumerações – Clonagem de elementos de modelagem – Memory ownership para agregações do tipo composite – Serialização XMI (metamodel-agnostic)
  • 26.
        DuSE-MT -Desafios ● Amplo uso de reflexão computacional, de modo a não depender de um metamodelo particular ● QtScript para viabilização de um Interpretador JavaScript para acesso e manipulação de modelos: – Criação de regras de boa-formação pelo próprio usuário – Plugins escritos em JavaScript (ou Python, Ruby, etc com o KDE Kross) ● Novos models e views do Qt para acesso aos elementos e propriedades de um elemento
  • 27.
        DuSE-MT -Desafios ● Sintaxe concreta: – QML to the rescue – Porque QML: ● Linguagem declarativa (boa produtividade, boa compreensão) ● Execução suportada por hardware (OpenGL) ● Amplamente utilizada para construção de GUIs/UXs em diversos form factors ● Tecnologia de preferência para construção de novos widgets para o KDE Plasma
  • 28.
        DuSE-MT -Desafios ● Exemplo de sintaxe concreta em QML: import QtQuick 2.0 UmlElement { UmlSlot { id: nameSlot; anchors.top: parent.top Text { id: label, text: element.name, anchors.centerIn: parent } } … (cont.)
  • 29.
        DuSE-MT -Desafios ● Exemplo de sintaxe concreta em QML: UmlSlot { id: attributeSlot anchors { top: nameSlot.bottom; topMargin: -1 } height: (parent.height - nameSlot.height)/2 ListView { model: element.ownedAttributes anchors { fill: parent; margins: 4 } delegate: Text { text: visibility(modelData.visibility) + modelData.name + ": " + modelData.type }
  • 30.
        DuSE-MT -Desafios ● Resultado:
  • 31.
        DuSE ● Processopara projeto arquitetural automatizado de arquiteturas de software ● Linguagem para criação de design spaces arquiteturais específicos de domínio ● Objetivos: – Representar conhecimento refinado de design de uma maneira mais sistemática e estruturada – Suportar o (re)design automatizado de arquiteturas – Suportar otimização multi-objetivo de arquiteturas
  • 32.
        DuSE -metamodelo
  • 33.
        DuSE -otimização ● Otimizando arquiteturas de software: – Trade-offs entre atributos de qualidade são inevitáveis – Otimização multi-objetivo com articulação a posteriori de preferências é uma boa forma de abordar o problema ● Novo módulo: QtOptimization – Influenciado pelo JMetal – Disponibiliza o algoritmo evolucionário para otimização multi-objetivo NSGA-II – Retorna um Pareto-front de arquiteturas (near-)optimal
  • 34.
        DuSE -aplicações ● SA:DuSE – Design Space concreto, especificado em DuSE, que captura as principais dimensões de design no domínio de Sistemas Self-Adaptive – Aplicado para gerar automaticamente arquiteturas de controladores para arquiteturas MapReduce e WebServers ● SO:DuSE (em andamento) – Idem, para Sistemas Self-Organizing
  • 35.
        QtModeling –o futuro ● Comunidade em formação: – 1 professor, 3 alunos de pós-graduação, 2 bolsistas PIBIC, 2 alunos de graduação – 2 contribuidores iniciantes na Europa e Asia ● Ainda não temos um release :(
  • 36.
        QtModeling –o futuro ● Trabalhos futuros: – Framework para geração flexível de código – Redes sociais para modelagem de software – Estilos arquiteturais, recuperação, métricas, model@RT (em andamento) – Boost no Umbrello ? – Suporte a MDSE no QtCreator e KDevelop ?
  • 37.
        QtModeling –o futuro ● O QtModeling é um projeto Qt ● Contribuições são sempre bem-vindas ● Há muito a ser feito !!!
  • 38.
        Obrigado !Perguntas ? Sandro S. Andrade sandroandrade@kde.org / @andradesandro FISL 15 – Fórum Internacional de Software Livre – Porto Alegre – Maio/2014