2011-12-04
■iOSゆとりプログラミングのススメ 
iOS Advent Calendar 2011という今年を締めくくる売名イベントが突如発足したので我こそはとエントリーしたわけなんだが。
俺は入門書をいくつ読んでもアプリをいつまでたっても完成させることのできないお前らの為にわざわざ書き下ろす事にした。
精力的に入門記事を書いているもとまかさん(@motomaka)ですら書いていない内容をな!
今更ですがiOSアプリ開発の基礎について色々調べてみました
http://d.hatena.ne.jp/moto_maka/20110425/1303673150
12月3日までの記事は以下の通り。
12月1日 @glassonion1 失敗しない iOS In-App Purchase プログラミング
12月2日 @k_katsumi CAEmitterLayer でクリスマスは爆発しろ
12月3日 @fullfool NSOrderedSet と集合と順序と CoreData
どれも横文字が入っていたので俺は遇えて使わない。ひらがなとカタカナでじゅうぶんですよ。
そんなわけで「iOSゆとりプログラミングのススメ」が今回のお題。
iOS 4が出ていろいろ複雑な事ができる様になった最近はぐっと減ったんだがな。
それはそれは酷かった。iPadが出たあたりだな。
iOS 3.2ぐらいが出てアプリ内課金とかが始まっちゃった頃。
iPhoneアプリで稼ぐ方法とか、一週間でアプリを作るとか、プログラミング未経験者がアプリを作ったとか、
そういう本が増えるとボクにも作れるかも!って夢想しちゃうコドモオトナからゆとり全開の質問無双されるわけなんだが。
そんな職業プログラマでアーキテクトな俺様ちゃんがよく聞かれる事ベスト3を発表するよ!
Q1:アプリケーションの正しい設計方法
Q2:データ保存形式の特徴と選ぶべき基準
Q3:画面遷移に纏わるデータ共有のベストプラクティス
最初に結論を言っておく。
A1:時と場合による
A2:時と場合(ry
A3:時と(ry
「決まった答えなんか無ぇんだよハゲ!」
大体にしてこの3点は職業プログラマが諸々のコストを抑える為に多人数で再利用可能かつ可搬性の高いコードを長期間に渡って安全に運用するための理想的な指針だからサンデープログラマどころかちょっとやってみようかな程度の人間が気にすべき事じゃない。
もう一つおまけに付け加えておくと金を貰ってコードを書いているプロでも遵守できていないクズが多いんだからな。
誰から何を吹き込まれたのか、あるいはどんな本を読んでそう思ったのかまでは知らないが。
促成栽培よりも即席な自分ができる事はあまりにも少なすぎるということをまず自覚すべき。
そして最初から失敗せずに何かを成そうということがどれだけ無謀な事なのかを思い出せ。
補助輪をとった自転車をどうやって漕ぎ出したかなんてどうせ俺に今言われるまで思い出すこともできないんだろう?
まず最初にお前らが書くコードは稚拙で幼稚な上に満足にひとり歩きできない幼子だと思った方がいい。
できる事はまだ少ない。誤った答えを導きだす事もあるし、もしかすると期待されている事がほとんど何もできないかもしれない。
ここまで読めば初手から正しい設計で再利用できるコードを誤り無く書きアプリケーションという形に仕上げるという行為が産まれてすらいない子供の将来を杞憂するぐらい馬鹿げている事にそろそろ気付くはずだ。
入門書を書いている連中は最初にこれぐらいのことをガツンを書けよハゲ!
たとえ最初は稚拙で幼稚なコードでも時間をかけて愛でた分だけどこまでも逞しく育つ可能性がそこにはあることも忘れるなよ。
そんな幼子に部屋を片付けさせる為には整理用の「お片づけ箱」をひとつだけ与えてやればいい。
大事な物はその中に仕舞わせる。整頓用の小道具である間仕切りやトレーといったものは最初から与えない。
この時点で右も左もわからないお前らは「お片づけ箱」はどこに置いたら良いのか既に心配している。
黙ってグローバルな領域に置いておけ!とでも言いたい所だが、ちょっとだけコードを書いた気になれる様にしてやろう。
幸いな事にXcodeが作るテンプレート(雛形)には必ずAppDelegate.hと呼ばれるものが用意されている。
これは本来であればもっと高度な使い方をするものなんだがXcodeというハンマーを持ったお前らにはきっとクギに見えているだろう。
ならば俺に叩けと言われた通りクギだと思って力一杯叩けばいい。
※以下はXcode 4.2でのテンプレート例だからな!
Xcodeにいつものおまかせで作るとこんなコードを吐き出すはずだ。
#import <UIKit/UIKit.h> @class ViewController; @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) ViewController *viewController; @end
↑これをだな。まずは黙ってこうしとけ。
#import <UIKit/UIKit.h>
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
NSMutableDictionary* toyBox; // ここになんでもしまっていいよ!
}
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;
@property (strong, nonatomic) NSMutableDictionary* toyBox;
@end
こうすることでAppDelegateの中にどこからでも参照できるNSMutableDictionaryがひとつできあがる。
NSMutableDictionaryが何かよく解らない奴は何でも収納できるものだと理解して直ちにググって使い方を覚えておきなさい。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.toyBox = [[NSMutableDictionary alloc] init]; // お片づけ箱を確保
// 確保したら好き勝手につっこんでおk
[toyBox setObject:@"お菓子の包装" forKey:@"宝物1"];
[toyBox setObject:@"アルミホイルの芯" forKey:@"宝物2"];
[toyBox setObject:@"スベスベする石" forKey:@"宝物3"];
// 中には配列でも何でもつっこめる
NSMutableArray* teamArray = [NSMutableArray arrayWithObjects:@"もっさりさん", @"らんらん", @"りんりん", nil];
[toyBox setObject:teamArray forKey:@"TeamMOSA2"];
// 辞書も突っ込める
NSMutableDictionary* callSignDic = [NSDictionary dictionaryWithObjectsAndKeys:
@"DevSapの知恵袋", @"もっさりさん", @"もうすぐ小学生開発者", @"らんらん", @"ガジェットイーター", @"りんりん", nil];
[toyBox setObject:callSignDic forKey:@"通り名"];
(後略)
あとはどのViewControllerのどのメソッドからでも共有オブジェクトであるAppDelegateを取得すれば良いだろう。
#import "AppDelegate.h" (中略) - (void)viewDidLoad { // AppDelegateからNSMutableDictionaryを取得して中身を取り出してみる AppDelegate* appDelegate = [[UIApplication sharedApplication] delegate]; NSString* itemStr = [appDelegate.toyBox objectForKey:@"宝物3"]; NSLog(@"お宝:%@",itemStr); // NSMutableDictionaryの中にある配列と辞書の中身を取り出してみる NSMutableArray* memberArray = [appDelegate.toyBox objectForKey:@"TeamMOSA2"]; NSMutableDictionary* memberDic = [appDelegate.toyBox objectForKey:@"通り名"]; for( NSString* teamMember in memberArray ) { NSLog(@"%@:%@",teamMember,[memberDic objectForKey:teamMember]); } // 共有したいものはここに設定しておけば他のところでも参照できるから遠慮しないで突っ込め [appDelegate.toyBox setObject:@"ゆとりプログラミング" forKey:@"時代の潮流"];
ビューコントローラー側で設定したものはどこからでも参照できる。もちろんAppDelegateの中でも。
- (void)applicationWillEnterForeground:(UIApplication *)application { NSString* mainStreamStr = [toyBox objectForKey:@"時代の潮流"]; NSLog(@"「%@」最高だけど常に再考しろよ!",mainStreamStr);
飽きっぽいお前らが高々一年程度コードをメンテナンスするぐらいならこれで十分すぎるくらいだ。
Mutableがつくクラス、NSMutableDictionaryみたいなものとMutableのついていないNSDictionaryみたいなクラスのどちらを使うのか迷ったらMutableがついた方を選べ。大は小を兼ねるとだけ覚えろ。
ズボらしないでお片づけ箱にしまう時はたとえ数値でもNSStringに変換してからにしておけよ。
気取ってNSValueやNSDataにするとお前ら程度の理解じゃ余計な手間が増えてわけのわからないバグが入るだけだからな!
そんなコードを俺に見せて「動きがおかしいんですがiPhoneのバグですか?」とか言うと確実に説教される。
小一時間どころか勉強会後の懇親会が終わるまでな。
「保存は文字だけ」「使うときだけ必要なものを数値に変換」ってのをゆとり卒業までの定石にしろ。
いつまでも決断することのできないお前らが迷う事はいつもそこだ。ゆとりなんだから迷ったらゆとりらしく大を選べ。
デザインパターンやアルゴリズムの定石は必要となるその時まで棚上げにしておけばいい。
コードの寿命を高々三年に延ばす為ですらやらなければならない事が山ほどあるが、
そこまでしてコードをメンテナンスしなければならない理由なぞ職業プログラマではないお前らには無いだろう。
AppStoreに現在並んでいるアプリでiPhone 3Gが出た当時2008年から使われている物を挙げてみるといい。
スタメンがなかなか降板しないプラットフォームならばそもそもお前らの書くコードの出番は確実に無い。
ゆとりまとめ:
むやみに手間を増やさない。
大は小を兼ねる。
「お片づけ箱」の中身が増えすぎて手に負えなくなったらどうしたらいいかはゆとりのお前らでも解るな?
わかったらさっさと「ボクのさいきょうデザイン」案を好き勝手にコメントしろよ!
2011-05-14 またしても金字塔を打ち立ててしまった 
久々にAppStoreに新作を出しました!
Palm版の「アロ之」10周年記念ということでiPhoneへの移植と巷でブレイク中のソーシャルネット機能を加えて再デビューでございます。
「Aroyukirina」
http://itunes.apple.com/jp/artist/team-mosa-mosa/id313465258
AppStoreにはアプリ内課金という本体とは別にお金を徴収する機能があるのですが、今回はその機能をふんだんに使って人生相談をTwitterとかで行える様にしてみました。
いまのところバージョン1.0.0では以下のメニューで受け付けています。
「Twitterでの投稿をお金に換える」という試みをAppleが公式に認めました!!
001:こどもなんでもそうだんしつ(\450)
おとうさんおかあさんはおしえてくれないおとなのじじょうをつつみかくさずついったーでばくろするよ!
002:学生なんでも相談室(\1,000)
中学生〜大学生ぐらいの青臭いお悩みをTwitterでズバッと解決。「大人のやり方」の裏をかこうぜ!
003:大人なんでも相談室(\3,000)
いい歳こいて決断できないお前らにTwitterでガチでお答えしますが逆切れは厳禁です。
100:ソフトウェア開発相談(\5,000)
ソフトウェアの開発における定石、慣習、悪習による行き詰まりを打破するための外道法をTwitterで伝授します。
101:デバッグ相談(\10,000)
あなたの動かないコードの断片からTwitterで解決方法をアドバイスしますが、もっさりさんは代理でコードを書きません。
102:ペア・プログラミング指南 (\10,000)
ナビゲータとしてあなたのプログラミングを遠隔で約1時間指南します。(期間限定公開)
デベロッパーの皆さんはテクニカルなコードだけで物事を考えるのでなく、「手持ちのカードをどう切るか」をこの機会に考えてみるといいんじゃないですかね。





















