言語対決:JavaScript 対 Objective-C
2010.11.12
ここのところ、サーバー側(Google App Engine)のコードはPythonで書き、クライアント側のコードはiPhone/iPad 向けはObjective-Cで、ブラウザー向けはJavaScriptで書く、という毎日が続いている私である。
それぞれの言語は難しくないのだが、さすがにこの3つを頻繁に行き来していると、pythonのコードに間違ってセミコロンを付けてしまったり、PythonとJavaScriptのどっちがTrueでどっちがtrueだか混乱したりする。
ちょうど昨日は、以前JavaScriptで書いたコード(写真をアップロードするコード)をObjective-Cに移植する機会があったのだが、とても分かりやすい結果が出たので、ここで比較してみる。
まずは元の JavaScript のコード。
SNBinder.get("/blob/create_upload", {}, true, function(json) {
SNBinder.get("/static/page_upload.htm", {}, false, function(htm) {
htm = SNBinder.bind(htm, { upload_url:json.upload_url });
$('#main').html(htm);
$('#form_upload').bind('submit', function() {
$('#wait_cursor').show();
});
});
});
-(IBAction) pickPhoto:(UIButton*)btn {
UIImagePickerController* picker = [[[UIImagePickerController alloc] init] autorelease];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self.popover dismissPopoverAnimated:false];
self.popover = [[[UIPopoverController alloc]
initWithContentViewController:picker] autorelease];
[self.popover presentPopoverFromRect:btn.bounds inView:btn
permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
// <UIImagePickerControllerDelegate> method
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
viewImage.image = [info valueForKey:UIImagePickerControllerOriginalImage];
[self.popover dismissPopoverAnimated:true];
}
-(IBAction) uploadPhoto:(UIButton*)sender {
self.uploader = [NBUploader uploaderWithSession:sessionManager.session
data:UIImageJPEGRepresentation(viewImage.image, 0.8) type:@"image/jpeg" name:textField.text
description:textDesc.text uuid:textUUID.text];
NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(uploadComplete:)
name:[NBLoader didFinishLoadingNotification] object:self.uploader];
[self.uploader connect];
labelURL.text = @"uploading...";
}
-(void) uploadComplete:(NSNotification*) notification {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
この差は大きい。どちらもプログラムを書く手間そのものはデバッグの時間を含めればそれほど大きな違いは無いのだが、私自身が数ヶ月後にこのコードを見た時に(もしくは他の人がコードを見た時に)、何をしているのかが一目瞭然と分かるのはJavaScriptの方だけだ。Objective Cの方は、少し腰を落ちつけてコードの解析をしなければ、非同期通信の流れが把握できない。これをもし、JavaScriptと同じように3回もの非同期通信をするコードをObjective Cで書いたら、それはそれは読みにくいコードになる。
こと非同期通信に関しては、JavaScriptの方が圧倒的にすぐれている、ということが分かっていただけるとと思う。何と言っても大きいのは無名関数で非同期通信のコールバックがその場に記述できてしまうこと。
event のチェーンを無名関数で繋いでいくやり方は node.js が全面的に採用していますね。
Posted by: objectx | 2010.11.12 at 22:39
iOS4から導入されたGCDが、
非同期向けのものじゃねーのかな。
iPad向けiOS4が配布されないと
使えないだろうけど。
Posted by: はむ | 2010.11.13 at 01:47
突然場所違いなところにすみません。
しかし、Photoshare,iPhone4で写真が上下逆さまになる
問題がいっこうに解決されず、困っている人がたくさん居ます。 増井さんが退社された影響なのか分かりませんが、
おもてなしの経営に反するほど、長期に渡るバグ放置。
何とかしていただけませんでしょうか。
よろしくお願いいたします。
Posted by: Toru Hishiyama | 2010.11.17 at 12:46
ここはあくまでも中島さんの個人ブログなので、Photoshareのバグ報告は公式サイトでおこなうべきでは。本当に困っているなら。
http://bigcanvasinc.com/photo/category/feedback/
Posted by: foobar | 2010.11.18 at 01:13
アドバイスありがとうございます。
たくさんの人が本当に困ってますので
早速、バグ報告させて頂きました。
以上
Posted by: Toru Hishiyama | 2010.11.18 at 21:45
Your comment is awaiting moderation.
一日経っても承認待ちですね。 バグ報告も受け付けていないのかしら。 先週は長いことサーバーが落ちてサービスが
使えなかったし。 中島さ--ん、Help me !!
Posted by: Toru Hishiyama | 2010.11.19 at 12:52
中島さん、PSへの直接回答ありがとうございました。
もうすぐ公開されるVer.1.2で上下反転問題解決するとのこと。
この場でお礼申し上げます。 Open issueにならないように
ここの書いておきます。
Posted by: Toru Hishiyama | 2010.11.19 at 23:02