model driven app development for iphone and android

58
Model Driven App Development @peterfriese | @itemismobile http://peterfriese.de | http://mobile.itemis.de for iPhone and Android

Upload: peter-friese

Post on 15-Jan-2015

3.579 views

Category:

Technology


2 download

DESCRIPTION

This presentation outlines how APPlause, an open source DSL for model-driven app development, works and how you can use it to create mobile apps in very little time.

TRANSCRIPT

Model Driven App Development

@peterfriese | @itemismobilehttp://peterfriese.de | http://mobile.itemis.de

for iPhoneand Android

AWESOME

OUR GOAL

BEING

Great, so...

How to be Awesome?

How to be Awesome?

Timeto

MarketHappyUsers

Precision.GreatIdeas

How to be Awesome?

Timeto

MarketHappyUsers

Precision.GreatIdeasGreatIdeas

How to be Awesome?

Timeto

MarketHappyUsers

GreatIdeas

Precision.

How to be Awesome?

HappyUsers

Precision.GreatIdeas

Timeto

Market

How to be Awesome?

Timeto

Market

Precision.GreatIdeas

HappyUsers

There Are 4 Things That Keep Us From Being Awesome

AccidentalComplexity

Wrong LevelofAbstraction

UglyDesign

BoringCode

There Are 4 Things That Keep Us From Being Awesome

AccidentalComplexity

Wrong LevelofAbstraction

UglyDesign

BoringCode

There Are 4 Things That Keep Us From Being Awesome

Wrong LevelofAbstraction

UglyDesign

BoringCode

AccidentalComplexity

There Are 4 Things That Keep Us From Being Awesome

UglyDesign

BoringCode

AccidentalComplexity

Wrong LevelofAbstraction

There Are 4 Things That Keep Us From Being Awesome

BoringCode

AccidentalComplexity

Wrong LevelofAbstraction

UglyDesign

Oh, did I mention

Oh, did I mention

Bugs

Redundancy

Multi-Platform

Challenges vs. Threats

Timeto

MarketHappyUsers

Precision.GreatIdeas

AccidentalComplexity

Wrong LevelofAbstraction

UglyDesign

BoringCode

Challenges vs. Threats

Timeto

MarketHappyUsers

Precision.GreatIdeas

AccidentalComplexity

Wrong LevelofAbstraction

UglyDesign

BoringCode

not in

this t

alk

not in

this t

alk

Challenges vs. ThreatsAccidentalComplexity

Wrong LevelofAbstraction

BoringCode

Timeto

Market

HappyUsers

Precision.

Bugs

Redundancy

Multi-Platform

Challenges vs. ThreatsAccidentalComplexity

Wrong LevelofAbstraction

BoringCode

Timeto

Market

HappyUsers

Precision.

Bugs

Redundancy

Multi-Platform

Is there anything we can

do about all this?

YES, there is.

Why?

... is code so boring (at times)?

... is there so much accidental complexity?

... is there so much redundancy?

... is our code so buggy?

Wrong Level of Abstraction!

... is code so boring (at times)?

... is there so much accidental complexity?

... is there so much redundancy?

... is our code so buggy?

Software artifact

Anatomy of Modern Software

Libraries

Frameworksmanually written code

Anatomy of Modern Software

schematic code (manually written)

Libraries

Frameworks

manually written code

Anatomy of Modern Software

RESTRICTIONS

GAIN VELOCITYTHROUGH

Text

Lists Details Custom

DOMAIN

ANALYZING

THEhttp://www.flickr.com/photos/jakematesdesign/4689135843/

Anatomyof Data-Driven

Apps

Cells

View

Navigation

Cells

View

Navigation

NameImage

Speaker

TitleLocation

Session

Entity

Data Provider

LANGUAGE

DOMAINSPECIFIC

BUILDING A

http://en.wikipedia.org/wiki/File:Rosetta_Stone.JPG

tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) }

button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) }}

tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) }

button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) }}

-(UIViewController*)createController {! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease];! UITabBarController *result = [[UITabBarController alloc] init];! NSMutableArray *controllers = [NSMutableArray array];!! UIViewController<IPUIView> *controller;! UINavigationController *navController;! IPContentProvider *contentProvider;

! // controller for @"Tuesday"! contentProvider = [providers providerForSessionsByDay: @"0"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Tuesday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Wednesday"! contentProvider = [providers providerForSessionsByDay: @"1"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Wednesday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Thursday"! contentProvider = [providers providerForSessionsByDay: @"2"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Thursday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Speakers"! contentProvider = [providers providerForAllSpeakers];!! controller = [[SpeakersListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Speakers";! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

! result.viewControllers = controllers;! return result;}

tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) }

button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) }}

-(UIViewController*)createController {! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease];! UITabBarController *result = [[UITabBarController alloc] init];! NSMutableArray *controllers = [NSMutableArray array];!! UIViewController<IPUIView> *controller;! UINavigationController *navController;! IPContentProvider *contentProvider;

! // controller for @"Tuesday"! contentProvider = [providers providerForSessionsByDay: @"0"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Tuesday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Wednesday"! contentProvider = [providers providerForSessionsByDay: @"1"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Wednesday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Thursday"! contentProvider = [providers providerForSessionsByDay: @"2"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Thursday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Speakers"! contentProvider = [providers providerForAllSpeakers];!! controller = [[SpeakersListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Speakers";! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

! result.viewControllers = controllers;! return result;}

tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) }

button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) }}

-(UIViewController*)createController {! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease];! UITabBarController *result = [[UITabBarController alloc] init];! NSMutableArray *controllers = [NSMutableArray array];!! UIViewController<IPUIView> *controller;! UINavigationController *navController;! IPContentProvider *contentProvider;

! // controller for @"Tuesday"! contentProvider = [providers providerForSessionsByDay: @"0"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Tuesday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Wednesday"! contentProvider = [providers providerForSessionsByDay: @"1"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Wednesday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Thursday"! contentProvider = [providers providerForSessionsByDay: @"2"];!! controller = [[SessionListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Thursday";! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

!! // controller for @"Speakers"! contentProvider = [providers providerForAllSpeakers];!! controller = [[SpeakersListViewController alloc] init];! [controller setContentProvider: contentProvider];! controller.tabBarItem.title = @"Speakers";! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"];! navController = [[UINavigationController alloc] initWithRootViewController:controller];! [controllers addObject: navController];! [controller release];! [navController release];

! result.viewControllers = controllers;! return result;}

135

http://www.xtext.org

ENGINETEMPLATE

GENERATECODE

WITH A

«DEFINE moduleFile FOR Application»«FILE filenameApplicationDelegateModule()»#import "«filenameApplicationDelegateHeader()»"#import "IPUIView.h"#import "«filenameCentralProvidersHeader()»"

«EXPAND importStatements-»

@implementation «applicationDelegateClassname()»

@synthesize window, rootController;

-(UIViewController*)createController { «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease]; UITabBarController *result = [[UITabBarController alloc] init]; NSMutableArray *controllers = [NSMutableArray array]; UIViewController<IPUIView> *controller; UINavigationController *navController; IPContentProvider *contentProvider;

«EXPAND barControllerInstance FOREACH buttons»

result.viewControllers = controllers; return result;}

- (void)applicationDidFinishLaunching:(UIApplication *)application { self.rootController = [self createController]; [window addSubview: [self.rootController view]]; [window makeKeyAndVisible];}

- (void)dealloc { self.rootController = nil; [window release]; [super dealloc];}

@end«ENDFILE»«ENDDEFINE»

«DEFINE moduleFile FOR Application»«FILE filenameApplicationDelegateModule()»#import "«filenameApplicationDelegateHeader()»"#import "IPUIView.h"#import "«filenameCentralProvidersHeader()»"

«EXPAND importStatements-»

@implementation «applicationDelegateClassname()»

@synthesize window, rootController;

-(UIViewController*)createController { «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease]; UITabBarController *result = [[UITabBarController alloc] init]; NSMutableArray *controllers = [NSMutableArray array]; UIViewController<IPUIView> *controller; UINavigationController *navController; IPContentProvider *contentProvider;

«EXPAND barControllerInstance FOREACH buttons»

result.viewControllers = controllers; return result;}

- (void)applicationDidFinishLaunching:(UIApplication *)application { self.rootController = [self createController]; [window addSubview: [self.rootController view]]; [window makeKeyAndVisible];}

- (void)dealloc { self.rootController = nil; [window release]; [super dealloc];}

@end«ENDFILE»«ENDDEFINE»

tabbarApplication itemisApp {

button { title= "Tuesday"

icon= "calendar.png"

view= SessionList( SessionsByDay("0") )

}

button { title= "Wednesday"

icon= "calendar.png"

view= SessionList( SessionsByDay("1") )

} button { title= "Thursday"

icon= "calendar.png"

view= SessionList( SessionsByDay("2") )

} button { title= "Speakers"

icon= "person.png"

view= SpeakersList( AllSpeakers() )

}}

«DEFINE moduleFile FOR Application»«FILE filenameApplicationDelegateModule()»#import "«filenameApplicationDelegateHeader()»"#import "IPUIView.h"#import "«filenameCentralProvidersHeader()»"

«EXPAND importStatements-»

@implementation «applicationDelegateClassname()»

@synthesize window, rootController;

-(UIViewController*)createController { «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease]; UITabBarController *result = [[UITabBarController alloc] init]; NSMutableArray *controllers = [NSMutableArray array]; UIViewController<IPUIView> *controller; UINavigationController *navController; IPContentProvider *contentProvider;

«EXPAND barControllerInstance FOREACH buttons»

result.viewControllers = controllers; return result;}

- (void)applicationDidFinishLaunching:(UIApplication *)application { self.rootController = [self createController]; [window addSubview: [self.rootController view]]; [window makeKeyAndVisible];}

- (void)dealloc { self.rootController = nil; [window release]; [super dealloc];}

@end«ENDFILE»«ENDDEFINE»

tabbarApplication itemisApp {

button { title= "Tuesday"

icon= "calendar.png"

view= SessionList( SessionsByDay("0") )

}

button { title= "Wednesday"

icon= "calendar.png"

view= SessionList( SessionsByDay("1") )

} button { title= "Thursday"

icon= "calendar.png"

view= SessionList( SessionsByDay("2") )

} button { title= "Speakers"

icon= "person.png"

view= SpeakersList( AllSpeakers() )

}}

«DEFINE barControllerInstance FOR TabbarButton» «IF view.provider != null» // controller for «this.title.expression('', '')» contentProvider = «view.provider.contentProvider('providers', '', '')»; «ENDIF» controller = [[«view.view.className()» alloc] init]; [controller setContentProvider: contentProvider]; controller.tabBarItem.title = «title.expression('', '')»; controller.tabBarItem.image = [UIImage imageNamed:«this.icon.expression('','')»]; navController = [[UINavigationController alloc] initWithRootViewController:controller]; [controllers addObject: navController]; [controller release]; [navController release];«ENDDEFINE»

tabbarApplication itemisApp {

button { title= "Tuesday"

icon= "calendar.png"

view= SessionList( SessionsByDay("0") )

}

button { title= "Wednesday"

icon= "calendar.png"

view= SessionList( SessionsByDay("1") )

} button { title= "Thursday"

icon= "calendar.png"

view= SessionList( SessionsByDay("2") )

} button { title= "Speakers"

icon= "person.png"

view= SpeakersList( AllSpeakers() )

}}

INTEGRATIONTOOL

BUILDERPROJECT

XCODEINVOKE

DEMO

FUTURETHE

SourceUI (Apple TV)

iPhone App

iPad App

Apple TV App

UI (iPad)

UI (iPhone)

@mschluepmann:

iPhone App

iPad App

TV App

@APPlauseDSL:

APPlauseDSL Program

APPlauseDSL

DEMO

code

Open source - EPL 1.0

code.google.com/p/applause/

‣ Showcase about conferences

‣ Tighter integration with Xcode

‣ Improved Android Generator

‣ Support for BlackBerry

‣ Support for Windows Phone 7

‣ Support for TV sets?

APPlause - Roadmap

@peterfriese | http://peterfriese.dehttp://mobile.itemis.de