scalin titanium mobile

127
Scaling Titanium Mobile at Android Bazaar and Conference 2012 Spring http://bit.ly/scale-ti Saturday, March 24, 12

Upload: daisuke-ishikawa

Post on 12-Oct-2014

1.482 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Scalin Titanium Mobile

ScalingTitaniumMobile

at Android Bazaar and Conference 2012 Spring

http://bit.ly/scale-ti

Saturday, March 24, 12

Page 2: Scalin Titanium Mobile

おぐらじゅんや

@junya

Saturday, March 24, 12

Page 3: Scalin Titanium Mobile

合同会社キュニップabout.qnyp.com

Saturday, March 24, 12

Page 4: Scalin Titanium Mobile

Scaling

Saturday, March 24, 12

Page 5: Scalin Titanium Mobile

Scalingチーム開発

機能の追加・削除

対応デバイスの追加

Saturday, March 24, 12

Page 6: Scalin Titanium Mobile

Scalingチーム開発

機能の追加・削除

対応デバイスの追加 }Saturday, March 24, 12

Page 7: Scalin Titanium Mobile

Scalingを容易にする

コードの書き方

チーム開発

機能の追加・削除

対応デバイスの追加 }Saturday, March 24, 12

Page 8: Scalin Titanium Mobile

What’s Titanium Mobile

最近のTitanium Mobile

コードの分割

underscore.js

CoffeeScript

プラットフォーム依存コードの隠蔽

カスタムイベント

Agenda

Saturday, March 24, 12

Page 9: Scalin Titanium Mobile

What’s

Titanium Mobile?

Saturday, March 24, 12

Page 10: Scalin Titanium Mobile

Titanium Mobileタイタニウム・モバイル

Saturday, March 24, 12

Page 11: Scalin Titanium Mobile

by Appcelerator, Inc.

Saturday, March 24, 12

Page 12: Scalin Titanium Mobile

from JavaScript

Saturday, March 24, 12

Page 13: Scalin Titanium Mobile

from JavaScript

to iOS

Saturday, March 24, 12

Page 14: Scalin Titanium Mobile

from JavaScript

to iOS

to Android

Saturday, March 24, 12

Page 15: Scalin Titanium Mobile

from JavaScript

to iOS

to Android

It’s OpenSource!

Saturday, March 24, 12

Page 16: Scalin Titanium Mobile

from JavaScript

to iOS

to Android

It’s OpenSource!

Community License => Free

Saturday, March 24, 12

Page 17: Scalin Titanium Mobile

from JavaScript

to iOS

to Android

It’s OpenSource!

Community License => Free

Indie License => $49/month

Saturday, March 24, 12

Page 18: Scalin Titanium Mobile

開発環境

Mac OS XWindowsUbuntu Linux

Saturday, March 24, 12

Page 19: Scalin Titanium Mobile

iOS 4.0.X -Android 2.2 (API 7) -

Titanium Compatibility Matrix - Documentation & Guides - Appcelerator Wikihttps://wiki.appcelerator.org/display/guides/Titanium+Compatibility+Matrix

最新版のターゲット環境

Saturday, March 24, 12

Page 20: Scalin Titanium Mobile

Only Mac OS X

iOS

Saturday, March 24, 12

Page 21: Scalin Titanium Mobile

Code Example

Saturday, March 24, 12

Page 22: Scalin Titanium Mobile

Saturday, March 24, 12

Page 23: Scalin Titanium Mobile

var win = Ti.UI.createWindow({ title: 'github/appcelerator' });

var tableView = Ti.UI.createTableView();win.add(tableView);

var tabGroup = Ti.UI.createTabGroup();var tab = Ti.UI.createTab({ icon: 'KS_nav_ui.png', title: 'Repos', window: win});tabGroup.addTab(tab);tabGroup.setActiveTab(tab);tabGroup.open();

var xhr = Ti.Network.createHTTPClient();var url = 'https://api.github.com/orgs/appcelerator/repos?type=public';xhr.open('GET', url);xhr.onload = function() { var res = JSON.parse(this.responseText); tableView.setData(res.map(function(repo) { return Ti.UI.createTableViewRow({ title: repo.name }); }));;};xhr.send();

Saturday, March 24, 12

Page 24: Scalin Titanium Mobile

var win = Ti.UI.createWindow({ title: 'github/appcelerator' });

var tableView = Ti.UI.createTableView();win.add(tableView);

var tabGroup = Ti.UI.createTabGroup();var tab = Ti.UI.createTab({ icon: 'KS_nav_ui.png', title: 'Repos', window: win});tabGroup.addTab(tab);tabGroup.setActiveTab(tab);tabGroup.open();

var xhr = Ti.Network.createHTTPClient();var url = 'https://api.github.com/orgs/appcelerator/repos?type=public';xhr.open('GET', url);xhr.onload = function() { var res = JSON.parse(this.responseText); tableView.setData(res.map(function(repo) { return Ti.UI.createTableViewRow({ title: repo.name }); }));;};xhr.send();

25行

Saturday, March 24, 12

Page 25: Scalin Titanium Mobile

var win = Ti.UI.createWindow({ title: 'github/appcelerator' });

var tableView = Ti.UI.createTableView();win.add(tableView);

var tabGroup = Ti.UI.createTabGroup();var tab = Ti.UI.createTab({ icon: 'KS_nav_ui.png', title: 'Repos', window: win});tabGroup.addTab(tab);tabGroup.setActiveTab(tab);tabGroup.open();

var xhr = Ti.Network.createHTTPClient();var url = 'https://api.github.com/orgs/appcelerator/repos?type=public';xhr.open('GET', url);xhr.onload = function() { var res = JSON.parse(this.responseText); tableView.setData(res.map(function(repo) { return Ti.UI.createTableViewRow({ title: repo.name }); }));;};xhr.send();

25行

Saturday, March 24, 12

Page 26: Scalin Titanium Mobile

var win = Ti.UI.createWindow({ title: 'github/appcelerator' });

var tableView = Ti.UI.createTableView();win.add(tableView);

var tabGroup = Ti.UI.createTabGroup();var tab = Ti.UI.createTab({ icon: 'KS_nav_ui.png', title: 'Repos', window: win});tabGroup.addTab(tab);tabGroup.setActiveTab(tab);tabGroup.open();

var xhr = Ti.Network.createHTTPClient();var url = 'https://api.github.com/orgs/appcelerator/repos?type=public';xhr.open('GET', url);xhr.onload = function() { var res = JSON.parse(this.responseText); tableView.setData(res.map(function(repo) { return Ti.UI.createTableViewRow({ title: repo.name }); }));;};xhr.send();

25行

Saturday, March 24, 12

Page 27: Scalin Titanium Mobile

Titanium Mobile製アプリ

Saturday, March 24, 12

Page 28: Scalin Titanium Mobile

MogSnapZaim

GetGlue Welcome to NIFTY-Serve

Built with Appcelerator Titanium / http://www.builtwithtitanium.com/

Saturday, March 24, 12

Page 29: Scalin Titanium Mobile

Titanium Mobile

最近の

Saturday, March 24, 12

Page 30: Scalin Titanium Mobile

Titanium Mobile SDK 1.8.2Feb 29, 2012

Saturday, March 24, 12

Page 31: Scalin Titanium Mobile

1.8系のサービスパック

メモリリーク修正

クラッシュバグ修正

など

http://developer.appcelerator.com/apidoc/mobile/1.8.2/changelog.html

Saturday, March 24, 12

Page 32: Scalin Titanium Mobile

4月に2.0がリリース予定

Cocoafishサービスとの統合

ジオロケーション機能の強化

TableViewのパフォーマンス改善

モジュールAPIの改良

Saturday, March 24, 12

Page 33: Scalin Titanium Mobile

Scalingを容易にする

コードの書き方

チーム開発

機能の追加・削除

対応デバイスの追加 }Saturday, March 24, 12

Page 34: Scalin Titanium Mobile

Code Structure

コードの分割

Saturday, March 24, 12

Page 35: Scalin Titanium Mobile

// app.jsvar win = Ti.UI.createWindow({ backgroundColor: '#fff'});

var button = Ti.UI.createButton();button.addEventListener(‘click’, function(e) { alert(‘Button Clicked’);});win.add(button);

win.open();

簡単なアプリ。

Saturday, March 24, 12

Page 36: Scalin Titanium Mobile

// app.jsvar win = Ti.UI.createWindow({ backgroundColor: '#fff'});

var button = Ti.UI.createButton();button.addEventListener(‘click’, function(e) { alert(‘Button Clicked’);});win.add(button);

win.open();

ウィンドウの生成。

Saturday, March 24, 12

Page 37: Scalin Titanium Mobile

// app.jsvar win = Ti.UI.createWindow({ backgroundColor: '#fff'});

var button = Ti.UI.createButton();button.addEventListener(‘click’, function(e) { alert(‘Button Clicked’);});win.add(button);

win.open();

ボタンの生成とクリック時の処理設定。

Saturday, March 24, 12

Page 38: Scalin Titanium Mobile

// app.jsvar win = Ti.UI.createWindow({ backgroundColor: '#fff'});

var button = Ti.UI.createButton();button.addEventListener(‘click’, function(e) { alert(‘Button Clicked’);});win.add(button);

win.open();

ウィンドウのオープン。

Saturday, March 24, 12

Page 39: Scalin Titanium Mobile

1つのapp.jsでは、

すぐに見通しが悪くなる。

Saturday, March 24, 12

Page 40: Scalin Titanium Mobile

チーム開発では分業も困難。

Saturday, March 24, 12

Page 41: Scalin Titanium Mobile

コードを分割する手法。

Saturday, March 24, 12

Page 42: Scalin Titanium Mobile

window.url

Ti.include()

CommonJS

Saturday, March 24, 12

Page 43: Scalin Titanium Mobile

手法によって、

Android対応

テストのしやすさ

保守性

などに大きく影響する。

Saturday, March 24, 12

Page 44: Scalin Titanium Mobile

window.url

Saturday, March 24, 12

Page 45: Scalin Titanium Mobile

ウィンドウ生成時の

urlパラメータを利用。

Saturday, March 24, 12

Page 46: Scalin Titanium Mobile

// app.jsvar win = Ti.UI.createWindow({ backgroundColor: '#fff', url: 'window.js'});win.open();

// window.jsvar win = Ti.UI.currentWindow;var button = Ti.UI.createButton();button.addEventListener(‘click’, function(e) { alert(‘Button Clicked’);});win.add(button);

Saturday, March 24, 12

Page 47: Scalin Titanium Mobile

window.urlスタイルは、

古いサンプルコード、ブログ、記事

などで使われている。

Saturday, March 24, 12

Page 48: Scalin Titanium Mobile

パフォーマンスの問題もあり、

現在は推奨されていないので

使わないこと。

Saturday, March 24, 12

Page 49: Scalin Titanium Mobile

window.url

Ti.include()

CommonJS

Saturday, March 24, 12

Page 50: Scalin Titanium Mobile

Ti.include

Saturday, March 24, 12

Page 51: Scalin Titanium Mobile

Ti.include関数を利用。

Saturday, March 24, 12

Page 52: Scalin Titanium Mobile

// app.jsvar name = 'Foo';var win = Ti.UI.createWindow({ backgroundColor: '#fff', name: name});Ti.include('window.js');win.open();

// window.jsvar label = Ti.UI.createLabel({text: win.name});label.addEventListener('click', function(e) { alert(name + ' Clicked');});win.add(label);

Saturday, March 24, 12

Page 53: Scalin Titanium Mobile

var name = 'Foo';var win = Ti.UI.createWindow({ backgroundColor: '#fff', name: name});var label = Ti.UI.createLabel({text: win.name});label.addEventListener('click', function(e) { alert(name + ' Clicked');});win.add(label);win.open();

実際には1つのファイルに結合されて実行される。

Saturday, March 24, 12

Page 54: Scalin Titanium Mobile

名前の衝突が起こりやすい。

Saturday, March 24, 12

Page 55: Scalin Titanium Mobile

現在はTi.includeも非推奨なので

使わないこと。

Saturday, March 24, 12

Page 56: Scalin Titanium Mobile

window.url

Ti.include()

CommonJS

Saturday, March 24, 12

Page 57: Scalin Titanium Mobile

CommonJS

Saturday, March 24, 12

Page 58: Scalin Titanium Mobile

サーバーサイドJavaScriptにおける

共通仕様 CommonJSの、

モジュール仕様を採用。

Saturday, March 24, 12

Page 59: Scalin Titanium Mobile

コードの分割・再利用の手法として

現在、Appceleratorが推奨。

Saturday, March 24, 12

Page 60: Scalin Titanium Mobile

// app.jsvar name = 'Foo';var window = require('window');var win = window.myWindow(name);win.open();

alert('label = ' + label); // labelは見えない

// window.jsexports.myWindow = function(name) { var win = Ti.UI.createWindow({ backgroundColor: '#fff' }); var label = Ti.UI.createLabel({text: name}); label.addEventListener('click', function(e) { alert(name + ' Clicked'); }); win.add(label); return win;};

Saturday, March 24, 12

Page 61: Scalin Titanium Mobile

Titanium Studioで生成される

テンプレートもCommonJS形式。

Saturday, March 24, 12

Page 62: Scalin Titanium Mobile

Saturday, March 24, 12

Page 63: Scalin Titanium Mobile

Saturday, March 24, 12

Page 64: Scalin Titanium Mobile

app.jsui/ApplicationWindow.jsui/FirstView.js

Saturday, March 24, 12

Page 65: Scalin Titanium Mobile

function FirstView() { var self = Ti.UI.createView(); var label = Ti.UI.createLabel({ color:'#000000', text:String.format(L('welcome'),'Titanium'), height:'auto', width:'auto' }); self.add(label);

label.addEventListener('click', function(e) { alert(e.source.text); });

return self;}

module.exports = FirstView;

ui/FirstView.js

Saturday, March 24, 12

Page 66: Scalin Titanium Mobile

function ApplicationWindow() { var FirstView = require('ui/FirstView');

var self = Ti.UI.createWindow({ backgroundColor:'#ffffff', navBarHidden:true, exitOnClose:true });

var firstView = new FirstView(); self.add(firstView);

return self;}

module.exports = ApplicationWindow;

ui/ApplicationWindow.js

Saturday, March 24, 12

Page 67: Scalin Titanium Mobile

var ApplicationWindow = require('ui/ApplicationWindow');new ApplicationWindow().open();

app.js

Saturday, March 24, 12

Page 68: Scalin Titanium Mobile

注意

相対パスを指定した際の挙動が

CommonJSと異なり、Resources/

からの相対指定として認識される。

Saturday, March 24, 12

Page 69: Scalin Titanium Mobile

パフォーマンスの問題がない。

メンテナンス性が高い。

再利用しやすい。

単体テストが行いやすい。

Saturday, March 24, 12

Page 70: Scalin Titanium Mobile

var Window;if (globals.osname === 'ipad') { Window = require('ui/ipad/iPadWindow');} else if (globals.osname === 'iphone') { Window = require('ui/iphone/iPhoneWindow');} else { Window = require('ui/android/AndroidWindow');}new Window().open();

デバイスに応じたUIの読み込み。

Saturday, March 24, 12

Page 71: Scalin Titanium Mobile

window.url

Ti.include()

CommonJS

Saturday, March 24, 12

Page 72: Scalin Titanium Mobile

underscore.js

Saturday, March 24, 12

Page 73: Scalin Titanium Mobile

配列や関数に対する操作を

容易にするライブラリ。

Saturday, March 24, 12

Page 74: Scalin Titanium Mobile

JavaScriptの

ビルトインオブジェクトを

拡張しない。

Saturday, March 24, 12

Page 75: Scalin Titanium Mobile

関数プログラミング由来の

ものを中心とした60ほどの関数。

each, map, reduce,filter, reject, any,max, min, shuffle,union, uniq, ...

Saturday, March 24, 12

Page 76: Scalin Titanium Mobile

It’s CommonJS

var _ = require('underscore')._;

Saturday, March 24, 12

Page 77: Scalin Titanium Mobile

JSONをUI用のデータに整形・変換。

var items = JSON.parse(responseText);

var itemNames = _(items).chain() .uniq(false, function(item) { return item.id; }) .select(function(item) { return item.available; }) .sortBy(function(item) { return item.name; }) .name();

Saturday, March 24, 12

Page 78: Scalin Titanium Mobile

JSONをUI用のデータに整形・変換。

var items = JSON.parse(responseText);

var itemNames = _(items).chain() .uniq(false, function(item) { return item.id; }) .select(function(item) { return item.available; }) .sortBy(function(item) { return item.name; }) .name();

Saturday, March 24, 12

Page 79: Scalin Titanium Mobile

JSONをUI用のデータに整形・変換。

var items = JSON.parse(responseText);

var itemNames = _(items).chain() .uniq(false, function(item) { return item.id; }) .select(function(item) { return item.available; }) .sortBy(function(item) { return item.name; }) .name();

Saturday, March 24, 12

Page 80: Scalin Titanium Mobile

JSONをUI用のデータに整形・変換。

var items = JSON.parse(responseText);

var itemNames = _(items).chain() .uniq(false, function(item) { return item.id; }) .select(function(item) { return item.available; }) .sortBy(function(item) { return item.name; }) .name();

Saturday, March 24, 12

Page 81: Scalin Titanium Mobile

JSONをUI用のデータに整形・変換。

var items = JSON.parse(responseText);

var itemNames = _(items).chain() .uniq(false, function(item) { return item.id; }) .select(function(item) { return item.available; }) .sortBy(function(item) { return item.name; }) .name();

Saturday, March 24, 12

Page 82: Scalin Titanium Mobile

JSONをUI用のデータに整形・変換。

var items = JSON.parse(responseText);

var itemNames = _(items).chain() .uniq(false, function(item) { return item.id; }) .select(function(item) { return item.available; }) .sortBy(function(item) { return item.name; }) .name();

Saturday, March 24, 12

Page 83: Scalin Titanium Mobile

CoffeeScript

Saturday, March 24, 12

Page 84: Scalin Titanium Mobile

JavaScriptに比べて

コードの記述量を削減できる。

Saturday, March 24, 12

Page 85: Scalin Titanium Mobile

バグ、ケアレスミスの削減。

Saturday, March 24, 12

Page 86: Scalin Titanium Mobile

パラメータ記述が簡潔に。// JavaScriptvar win = Ti.UI.createWindow({ title: 'github' });var tab = Ti.UI.createTab({ icon: 'KS_nav_ui.png', title: 'Repos', window: win});

# CoffeeScriptwin = Ti.UI.createWindow(title: 'github')tab = Ti.UI.createTab icon: 'KS_nav_ui.png' title: 'Repos' window: win

Saturday, March 24, 12

Page 87: Scalin Titanium Mobile

コールバック記述が簡潔に。

// JavaScriptbutton.addEventListener('click', function(e) { Ti.API.debug('button clicked');});

# CoffeeScriptbutton.addEventListener 'click', (e) -> Ti.API.debug('button clicked')

Saturday, March 24, 12

Page 88: Scalin Titanium Mobile

ループがシンプルに。// JavaScriptvar rows = [];for (var i = 0; i < items.length; i++) { var item = items[i]; if (item.isPublic()) rows.push(createTableRow(items[i]));}var tableView = Ti.UI.createTableView({ data: rows });

# CoffeeScriptrows = []for item in items when item.public() rows.push(createTableRow(item))tableView = Ti.UI.createTableView(data: rows)

Saturday, March 24, 12

Page 89: Scalin Titanium Mobile

後置ifでプラットフォーム毎の

場合分けをシンプルに。

# CoffeeScriptTi.UI.iPhone.appBadge = 10 if Ti.Platform.osname is “iphone”

# JavaScriptif (Ti.Platform.osname === “iphone”) { Ti.UI.iPhone.appBadge = 10;}

Saturday, March 24, 12

Page 90: Scalin Titanium Mobile

クラスベースに設計しやすい。

# CustomView.coffeeclass CustomView view: null constructor: -> @initView() @initEvents() initView: -> @view = Ti.UI.createView() initEvents: -> @view.addEventListener 'click', (e) -> alert('clicked')

module.exports = CustomView

# app.coffeeCustomView = require('CustomView')view = new CustomView()

Saturday, March 24, 12

Page 91: Scalin Titanium Mobile

文字列内で変数展開ができる。

name = "Titanium"alert("Hello, #{name}")

Saturday, March 24, 12

Page 92: Scalin Titanium Mobile

Auto Compile with Guard

$ brew install nodejs$ curl http://npmjs.org/install.sh | sh$ npm install -g coffee-script

$ gem install guard-coffeescript$ gem install rb-fsevent

# Guardfileguard 'coffeescript', :input => 'coffee', :output => 'Resources', :bare => true

$ guard

Saturday, March 24, 12

Page 93: Scalin Titanium Mobile

Facade

プラットフォーム

依存コードの隠蔽

Saturday, March 24, 12

Page 94: Scalin Titanium Mobile

iOSとAndroidで場合分けするコード。if (Ti.Platform.osname === "android") { var picker1 = Ti.UI.createPicker({type:Ti.UI.PICKER_TYPE_DATE}); var picker2 = Ti.UI.createPicker({type:Ti.UI.PICKER_TYPE_TIME}); picker1.addEventListener('change', callback); picker2.addEventListener('change', callback); win.add(picker); win.add(picker2);} else { var picker = Ti.UI.createPicker({ type:Ti.UI.PICKER_TYPE_DATE_AND_TIME }); picker.addEventListener('change', callback); win.add(picker);}

Saturday, March 24, 12

Page 95: Scalin Titanium Mobile

分岐処理をラップして隠蔽。var calendarWindow = function(callback) { var win = Ti.UI.createWindow(); if (Ti.Platform.osname === "android") { var picker1 = Ti.UI.createPicker({type:Ti.UI.PICKER_TYPE_DATE}); var picker2 = Ti.UI.createPicker({type:Ti.UI.PICKER_TYPE_TIME}); picker1.addEventListener('change', callback); picker2.addEventListener('change', callback); win.add(picker1); win.add(picker2); } else { var picker = Ti.UI.createPicker({ type:Ti.UI.PICKER_TYPE_DATE_AND_TIME }); picker.addEventListener('change', callback); win.add(picker); } return win;};

Saturday, March 24, 12

Page 96: Scalin Titanium Mobile

分岐処理をラップして隠蔽。

var win = calendarWindow(function(e) { ... });

Saturday, March 24, 12

Page 97: Scalin Titanium Mobile

モジュール化して再利用。

// utils.jsexports.createCalendarWindow = function(callback) { ...};

// app.jsvar utils = require('/utils');var win = utils.createCalendarWindow(function(e) { ...});

Saturday, March 24, 12

Page 98: Scalin Titanium Mobile

Custom Event

カスタムイベント

Saturday, March 24, 12

Page 99: Scalin Titanium Mobile

イベント

Saturday, March 24, 12

Page 100: Scalin Titanium Mobile

button.addEventListener(‘click’, function (e) {...});window.addEventListener(‘focus’, function (e) {...});

UIウィジェットの操作に伴って発生するもの、

Saturday, March 24, 12

Page 101: Scalin Titanium Mobile

とは限らない。

Saturday, March 24, 12

Page 102: Scalin Titanium Mobile

アプリ内コンポーネントの

連携にもイベントを活用する。

Saturday, March 24, 12

Page 103: Scalin Titanium Mobile

ApplicationLevelEvents

Saturday, March 24, 12

Page 104: Scalin Titanium Mobile

アプリケーションレベルイベント

アプリケーション内でグローバルに有効。

利用にはTi.Appモジュールを使う。

すべてのコンテキスト、関数スコープ、

CommonJSモジュールから参照できる。

Saturday, March 24, 12

Page 105: Scalin Titanium Mobile

Ti.App.addEventListener('settingsUpdated', function(params) { alert('New value: ' + params.newValue);});

Ti.App.fireEvent('settingsUpdated', { newValue: '...'});

ハンドラの設定とイベントの発生

Saturday, March 24, 12

Page 106: Scalin Titanium Mobile

コンポーネント同士がメソッドを呼び合うと、

エラー処理が分散する。

// メモ作成addButton.addEventListener('click', function(e) { if (dataManager.insertMemo(newMemo)) { memoList.append(newMemo); } else { alert('error!'); }});

Saturday, March 24, 12

Page 107: Scalin Titanium Mobile

イベントのやり取りで疎結合に。

メモ作成

Ti.AppdataManager

memoList

Saturday, March 24, 12

Page 108: Scalin Titanium Mobile

イベントのやり取りで疎結合に。

メモ作成 fire memoWillCreate

Ti.AppdataManager

memoList

Saturday, March 24, 12

Page 109: Scalin Titanium Mobile

イベントのやり取りで疎結合に。

メモ作成 fire memoWillCreate

Ti.AppdataManager

memoList

memoWillCreate

Saturday, March 24, 12

Page 110: Scalin Titanium Mobile

イベントのやり取りで疎結合に。

メモ作成 fire memoWillCreate

Ti.AppdataManager

memoList

memoWillCreate

fire memoDidCreated

Saturday, March 24, 12

Page 111: Scalin Titanium Mobile

イベントのやり取りで疎結合に。

メモ作成 fire memoWillCreate

Ti.AppdataManager

memoList

memoWillCreate

fire memoDidCreated

memoDidCreated

Saturday, March 24, 12

Page 112: Scalin Titanium Mobile

エラー時はイベントを発生させない。

メモ作成 fire memoWillCreate

Ti.AppdataManager

memoList

memoWillCreate

fire memoDidCreated×

Saturday, March 24, 12

Page 113: Scalin Titanium Mobile

// メモ作成addButton.addEventListener('click', function(e) { Ti.App.fireEvent('memoWillCreate', { id: memo.id, title: memo.id, body: memo.body });});

メモ作成の際には、データ保存やメモ一覧の更新には関与しない。

Saturday, March 24, 12

Page 114: Scalin Titanium Mobile

// dataManagerTi.App.addEventListener('memoWillCreate', function(memo) { if (insertMemo(memo)) { Ti.App.fireEvent('memoDidCreated', memo); } else { // エラー処理 }});

データ保存失敗時には次のイベントを発生させない。

Saturday, March 24, 12

Page 115: Scalin Titanium Mobile

// memoListTi.App.addEventListener('memoDidCreated', function(memo) { updateMemoList(memo);});

メモ一覧の更新処理はイベントの発生だけを待っていればよい。

Saturday, March 24, 12

Page 116: Scalin Titanium Mobile

注意

アプリケーションレベルのイベントハンドラ内

で生成したオブジェクトは、ハンドラを明示的

に削除するまでメモリに残る。

Managing Memory and Finding Leaks - Documentation & Guideshttps://wiki.appcelerator.org/display/guides/Managing+Memory+and+Finding+Leaks

Saturday, March 24, 12

Page 117: Scalin Titanium Mobile

var doSomething = function() { var foo = new Foo(); // ハンドラを削除するまで残り続ける};Ti.App.addEventListener(‘doSomething’, doSomething);

// 不要になったタイミングでハンドラを削除するTi.App.removeEventListener(‘doSomething’, doSomething);

Saturday, March 24, 12

Page 118: Scalin Titanium Mobile

var win = Ti.UI.createWindow();win.addEventListener('userLoggedIn', function(user) { updateAvatar(user.avatar);});win.open();

var button = Ti.UI.createButton();button.addEventListener(‘click’, function(e) { win.fireEvent(‘userLoggedIn’, { avatar: ‘...’ });});

グローバルなスコープが不要ならば、

ビューオブジェクトにカスタムイベントを設定することも可能。

Saturday, March 24, 12

Page 119: Scalin Titanium Mobile

Summary

まとめ

Saturday, March 24, 12

Page 120: Scalin Titanium Mobile

Scalingを容易にする

コードの書き方

チーム開発

機能の追加・削除

対応デバイスの追加 }Saturday, March 24, 12

Page 121: Scalin Titanium Mobile

What’s Titanium Mobile

最近のTitanium Mobile

コードの分割

underscore.js

CoffeeScript

プラットフォーム依存コードの隠蔽

カスタムイベント

Agenda

Saturday, March 24, 12

Page 122: Scalin Titanium Mobile

コードの分割は常にCommonJSスタイル。

モジュール化で分業が容易に。

プロジェクト間でのコード再利用を促進。

CommonJS

Saturday, March 24, 12

Page 123: Scalin Titanium Mobile

underscore.js配列や関数に対する操作を簡潔に記述。

チーム内での配列操作スタイルを統一。

Saturday, March 24, 12

Page 124: Scalin Titanium Mobile

冗長なコードの削減。

JavaScriptの良い部分だけを利用。

チーム内でJavaScriptのコード品質を統一。

CoffeeScript

Saturday, March 24, 12

Page 125: Scalin Titanium Mobile

iOS/Android判定のコードはできるだけ隠蔽。

関数やモジュールに隠す。

再利用できるノウハウを蓄積。

状況が変わった際の対応を容易に。

プラットフォーム依存コードの隠蔽

Saturday, March 24, 12

Page 126: Scalin Titanium Mobile

コンポーネント間の通信はできるだけイベントで。

エラー処理を集約。

シンプルな処理フロー。

カスタムイベント

Saturday, March 24, 12

Page 127: Scalin Titanium Mobile

Thanks.

@junya

http://bit.ly/scale-ti

Saturday, March 24, 12