google appengine に関してひと言
スパゲッティはオブジェクト指向の夢を見るか

言語対決:JavaScript 対 Objective-C

ここのところ、サーバー側(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();
                    });
                });
            });

SNBinderという自作のライブラリを使って、HTMLテンプレートのクライアント側でのバインディングを行っているのだが(このライブラリは希望者が多ければオープンソースにしても良いと考えている)、まずは "/blob/create_upload" というURLにHTTP GETを投げてアップロード用のURLを取得し(変数jsonの中に入ってくる)、"/static/page_upload.htm" という HTMLテンプレートをやはり HTTP GET で取得し、それを先に取得したURL( json.pload_url)と結合し(テンプレート中の文字列の置き換えをしているだけだ)、画面上に表示した上で、ユーザーがアップロードボタンを押したら、ページ中のGIFアニメをスタートする、というものだ。
すばらしいのは、HTTP-GETを2回と、HTTP-POSTを1回をすべて非同期でするという処理がわずか9行のコードで書けている事(そのうち3行は閉じカッコだけの行)。
全く同じことを Objective C で書くと、以下の様になる。これもやはり自作の、NBUploaderという汎用ライブラリを駆使して、できるだけ簡素に書こうとしている(ちなみに、エラー処理のコードは公平に比べるために除いてある)。ちなみに、ユーザーインターフェイスは、アプリそのものに含まれているのでその分のHTTP GETは節約できているし、NBUploaderがURLの取得とHTTP POSTの両方をしているので、アプリ側から見た非同期通信は1回だけである。にも関らず、この長さだ。

-(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の方が圧倒的にすぐれている、ということが分かっていただけるとと思う。何と言っても大きいのは無名関数で非同期通信のコールバックがその場に記述できてしまうこと。

Comments

objectx

event のチェーンを無名関数で繋いでいくやり方は node.js が全面的に採用していますね。

はむ

iOS4から導入されたGCDが、
非同期向けのものじゃねーのかな。

iPad向けiOS4が配布されないと
使えないだろうけど。

Toru Hishiyama

突然場所違いなところにすみません。
しかし、Photoshare,iPhone4で写真が上下逆さまになる
問題がいっこうに解決されず、困っている人がたくさん居ます。 増井さんが退社された影響なのか分かりませんが、
おもてなしの経営に反するほど、長期に渡るバグ放置。
何とかしていただけませんでしょうか。
よろしくお願いいたします。

foobar

ここはあくまでも中島さんの個人ブログなので、Photoshareのバグ報告は公式サイトでおこなうべきでは。本当に困っているなら。
http://bigcanvasinc.com/photo/category/feedback/

Toru Hishiyama

アドバイスありがとうございます。
たくさんの人が本当に困ってますので
早速、バグ報告させて頂きました。
以上

Toru Hishiyama

Your comment is awaiting moderation.
一日経っても承認待ちですね。 バグ報告も受け付けていないのかしら。 先週は長いことサーバーが落ちてサービスが
使えなかったし。 中島さ--ん、Help me !!

Toru Hishiyama

中島さん、PSへの直接回答ありがとうございました。
もうすぐ公開されるVer.1.2で上下反転問題解決するとのこと。
この場でお礼申し上げます。 Open issueにならないように
ここの書いておきます。

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Your Information

(Name is required. Email address will not be displayed with the comment.)