More Related Content Similar to MDSD for iPhone and Android Similar to MDSD for iPhone and Android (20) More from Heiko Behrens (8) MDSD for iPhone and Android4. / soft·ware de·vel·op·ment / n.
the set of activities that results in
software products. ~ may include
research, new development,
modification, reuse, maintenance,
or any other activities that result in
software products.
Dienstag, 28. September 2010
9. Anatomy of Modern Software
schematic code (manually written)
Libraries
Frameworks
manually written
code
Dienstag, 28. September 2010
11. package templates;
import java.util.*;
import java.io.Serializable;
import javax.persistence.*;
@SuppressWarnings("serial")
@Entity
public class Customer implements Serializable {
private Long id;
private String name;
private Address address;
private Set<Order> orders = new HashSet<Order>();
// No-arg constructor
public Customer() {
}
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@OneToMany
public Collection<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
Dienstag, 28. September 2010
12. package templates;
import java.io.Serializable;
import java.util.*;
import javax.persistence.*;
@SuppressWarnings("serial")
@Entity
public class Customer implements Serializable {
private Long id;
private String name;
private Address address;
private Set<Order> orders = new HashSet<Order>();
// No-arg constructor
public Customer() {
}
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@OneToMany
public Collection<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
Dienstag, 28. September 2010
15. This wizard whips up a
complete and running
legacy application with
just a single click.
Dienstag, 28. September 2010
18. Raise the level
of abstraction
where possible
and generate
code wisely.
Dienstag, 28. September 2010
20. Use the best of both worlds at the same time.
Dienstag, 28. September 2010
28. You’d want to core a few more apples...
Dienstag, 28. September 2010
29. ... for an apple cake.
Dienstag, 28. September 2010
33. ... a DSL is ...
Dienstag, 28. September 2010
36. Use DSLs to describe the world
Dienstag, 28. September 2010
37. select name, salary
from employees
where salary > 2000
order by salary
^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$
Dienstag, 28. September 2010
39. entity Vortrag {
String titel
String untertitel
String sprecher
String beschreibung
}
contentprovider AllVortragItems
returns Vortrag[]
fetches XML
from "http://spreadsheets.google.com/feeds/list/.../public/values"
selects "feed.entry"
tableview VortragListe(Vortrag[] items) {
title= "Vorträge"
section {
cell Subtitle foreach items as i {
text= i.titel
details= i.untertitel
action= VortragDetailsView( i )
}
}
}
tabbarApplication itemisApp {
button {
title= "Vorträge"
icon= "66-microphone.png"
view= VortragListe( AllVortragItems() )
}
button {
title= "Referenten"
icon= "person.png"
view= SprecherListe( AllSprecherItems() )
}
}
Entities & Data Access
Views & Actions
Navigation
Dienstag, 28. September 2010
43. Grammar (similar to EBNF)
grammar org.xtext.example.Entity with org.eclipse.xtext.common.Terminals
generate entity "http://www.xtext.org/example/Entity"
Model:
(types+=Type)*;
Type:
TypeDef | Entity;
TypeDef:
"typedef" name=ID ("mapsto" mappedType=JAVAID)?;
JAVAID:
name=ID("." ID)*;
Entity:
"entity" name=ID ("extends" superEntity=[Entity])?
"{"
(attributes+=Attribute)*
"}";
Attribute:
type=[Type] (many?="*")? name=ID;
Dienstag, 28. September 2010
44. grammar org.xtext.example.Entity
with org.eclipse.xtext.common.Terminals
generate entity
"http://www.xtext.org/example/Entity"
Model:
(types+=Type)*;
Type:
TypeDef | Entity;
TypeDef:
"typedef" name=ID
("mapsto" mappedType=JAVAID)?;
JAVAID:
name=ID("." ID)*;
Entity:
"entity" name=ID
("extends" superEntity=[Entity])?
"{"
(attributes+=Attribute)*
"}";
Attribute:
type=[Type] (many?="*")? name=ID;
entity
Model
*
name: EString
Type
types
TypeDef Entity
name: EString
JAVAID
superEntity
mappedType
name: EString
many: EBoolean
Attribute
attributes
type
Meta model inference
Dienstag, 28. September 2010
45. Let’s build a DSL
for Mobile Apps
Dienstag, 28. September 2010
47. Anatomy of an iPhone app
Table view
View title
Tab bar
Tab bar button
Name
Image
Speaker
Title
Location
Session
Entity
Data Provider
Table cell
Dienstag, 28. September 2010
48. Mapping concepts
Table view
View title
Table cell
Tab bar
Tab bar button
Entity
Data Provider
tabbarApplication itemisApp {
button {
title= "Blog"
icon= "08-chat.png"
view= BlogList( Blogposts() )
}
button {
title= "Talks"
icon= "66-microphone.png"
view= VortragListe( AllVortragItems() )
}
button {
title= "Speakers"
icon= "person.png"
view= SprecherListe( AllSprecherItems() )
}
}
Dienstag, 28. September 2010
49. Mapping concepts
Table view
View title
Table cell
Tab bar
Tab bar button
Entity
Data Provider
entity BlogItem {
String title
String author
String link
String description
String pubDate
BlogItem subItem
}
entity Sprecher {
String name
String beschreibung
String email
String blog
String fotourl
String vortraege
}
entity Vortrag {
String titel
String untertitel
String sprecher
String beschreibung
String zeit
Vortrag fortsetzung
}
Dienstag, 28. September 2010
50. Mapping concepts
Table view
View title
Table cell
Tab bar
Tab bar button
Entity
Data Provider
contentprovider Blogposts
returns BlogItem[]
fetches XML
from "http://blogs.itemis.de/?showfeed=1"
selects "rss.channel.item"
contentprovider AllVortragItems
returns Vortrag[]
fetches XML
from "http://spreadsheets.google.com/feeds/
list/0Au3-oaNYhfPIdEpRQWxpZnJyX2JCNUdtT1Z4M1B4SkE/1/
public/values"
selects "feed.entry"
Dienstag, 28. September 2010
51. Mapping concepts
Table view
View title
Table cell
Tab bar
Tab bar button
Entity
Data Provider tableview BlogList(BlogItem[] items) {
title= "itemis blog"
section {
cell Subtitle foreach items as i {
text= i.author
details= i.title
image= ("http://blogs.itemis.de/wp-content/
themes/itemis-WP-Theme/photos/" urlconform(i.author)
".jpg")
action= BlogDetails(i)
}
}
}
Dienstag, 28. September 2010
52. Type safe
Produces any
kind of text
Can run standalone
(ANT / Maven)
Debugger
Profiler
Eclipse-based
Editor
Protected regions
Cartridges
Outlets
Polymorphism
Dienstag, 28. September 2010
53. tableview SpeakerList(
Speaker[] speakers)
{
title= "Speakers"
section
{
cell Default foreach
speakers as speaker
{
text= speaker.name
image= speaker.smallImageURL
action= SpeakerDetails
(SpeakerById(
speaker.speakerId))
}
}
}
Mapping concepts to code
Dienstag, 28. September 2010
54. - (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
!
id item = [self.items objectAtIndex: indexPath.row];
!
UITableViewCell *cell =
[self cellDefaultForTableView:tableView];
cell.textLabel.text = [item valueForKeyPath:@"name"];
!
NSString *imageURL = [item valueForKeyPath:@"fotourl"];
cell.imageView.image = [self getImage: imageURL
withLoadingImage:@"personLoading.png"
andErrorImage:@"personUnknown.png"];
return cell;
}
Cell Rendering
Dienstag, 28. September 2010
55. - (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
!
id item = [self.items objectAtIndex: indexPath.row];
!
UITableViewCell *cell =
[self cellDefaultForTableView:tableView];
cell.textLabel.text = [item valueForKeyPath:@"name"];
!
NSString *imageURL = [item valueForKeyPath:@"fotourl"];
cell.imageView.image = [self getImage: imageURL
withLoadingImage:@"personLoading.png"
andErrorImage:@"personUnknown.png"];
return cell;
}
Cell Rendering
tableview SpeakerList(
Speaker[] speakers)
{
title= "Speakers"
section
{
cell Default foreach
speakers as speaker
{
text= speaker.name
image= speaker.smallImageURL
action= SpeakerDetails
(SpeakerById(
speaker.speakerId))
}
}
}
Dienstag, 28. September 2010
56. - (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
id item = [self.items objectAtIndex: indexPath.row];
IPContentProvider *provider =
[IPSimpleContentProvider providerWithContent:item
andProviders:self.contentProvider.providers];
SprecherDetailsViewController *controller =
[[SprecherDetailsViewController alloc] init];
controller.contentProvider = provider;
[self.navigationController pushViewController:
controller animated: TRUE];
[controller release];
}
User Interaction
tableview SpeakerList(
Speaker[] speakers)
{
title= "Speakers"
section
{
cell Default foreach
speakers as speaker
{
text= speaker.name
image= speaker.smallImageURL
action= SpeakerDetails
(SpeakerById(
speaker.speakerId))
}
}
}
Dienstag, 28. September 2010
57. tableview SpeakerList(
Speaker[] speakers)
{
title= "Speakers"
section
{
cell Default foreach
speakers as speaker
{
text= speaker.name
image= speaker.smallImageURL
action= SpeakerDetails
(SpeakerById(
speaker.speakerId))
}
}
}
«DEFINE viewModule FOR SectionedView»
«FILE filenameModule()»
#import "«filenameHeader()»"
#import "NSObject+Applause.h"
«EXPAND imports»
@implementation «className()»
«EXPAND sectionCount»
«EXPAND sectionTitleHeader»
«EXPAND rowCounts»
«EXPAND cellDescriptions»
«EXPAND cellSelections»
«EXPAND staticData»
@end
«ENDFILE»
«ENDDEFINE»
Template Invocation
Dienstag, 28. September 2010