Model Driven App Development for iPhone and Android
-
Upload
peter-friese -
Category
Technology
-
view
3.579 -
download
2
description
Transcript of Model Driven App Development for iPhone and Android
Model Driven App Development
@peterfriese | @itemismobilehttp://peterfriese.de | http://mobile.itemis.de
for iPhoneand Android
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
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?
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?
schematic code (manually written)
Libraries
Frameworks
manually written code
Anatomy of Modern Software
DOMAIN
ANALYZING
THEhttp://www.flickr.com/photos/jakematesdesign/4689135843/
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
«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() )
}}
‣ 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