Hatena::Groupiphone-dev

haoyayoi Dev Style このページをアンテナに追加 RSSフィード

2009-06-27

ImageStoreのコードリーディング

| 10:45 | ImageStoreのコードリーディング - haoyayoi Dev Style を含むブックマーク はてなブックマーク - ImageStoreのコードリーディング - haoyayoi Dev Style ImageStoreのコードリーディング - haoyayoi Dev Style のブックマークコメント

ImageStoreは画像ダウンロードにおいて使い勝手のいいフレームワークです。使い方も開発者自身が提示しているので迷いません。

実際にはこんな感じ。


#import "ImageStore.h"

//-------------(途中略)

- (void)viewDidLoad {
    [super viewDidLoad];

    imageStore = [[ImageStore alloc] initWithDelegate:self];
    [imageStore getImage:@"http://assets0.twitter.com/images/twitter_logo_header.png"];
}

- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url
{
    UIImage* image = [sender getImage:url];
    // 画像を使う処理
}

ただ、ここまで使い勝手がいいとなると、どんな処理がなされているか気になるものです。そこで、勉強がてらにコードリーディング

構成

ImageStoreは、

  • HttpClient
  • ImageDownloader
  • ImageStore
  • StringHelper

の4つのクラスで構成されています。

HttpClient

実際に画像をダウンロードするクラスです。delegateメソッドとしてNSObjectにHttpClientDelegateカテゴリを構成します。NSURLRequestの結果に応じてHttpClientDelegateカテゴリ内のメソッドを実行します。

ImageDownloader

HttpClientをラップするクラスです。delegateメソッドとしてNSObjectにImageDownloaderDelegateカテゴリを構成します。HttpClientの結果に応じてImageDownloaderDelegateカテゴリ内のメソッドを実行します。

ImageStore

Developerが実際に触れるクラスです。ImageDownloaderをラップしています。delegateメソッドとして、ImageStoreにPrivateカテゴリを構成します。DeveloperはPrivateカテゴリのメソッド内にて実際に取得した画像に対する処理を行います。

StringHelper

HttpClient内にて、URLRequestの際のクエリを組み立てる時に用いられるクラスです。

処理の実際

各クラス同士は以下のような具合にやり取りしています。

f:id:hao_yayoi:20090627103356p:image

プロトコルでは無い理由

プロトコル化することで、NSObjectを汚染せずにコーディングすることも可能です。ImageStoreの場合はあえてNSObjectにいれることで、コーディングに掛かる工数を減らしています。

paellapaella2009/06/27 19:50すばらしいです。このフレームワークは気になっていたので、とても参考になりました。

hao_yayoihao_yayoi2009/06/28 19:56いつかやろうと思いつつ全然やっていなかったので、片付ける感じでやっちゃいました。
delegateメソッドで幾つか用いられていないものがあったので、そこらへんをもうちょっと踏み込み必要みたいです。

PsychsPsychs2009/06/30 14:12delegate に用いる protocol は、informal protocol にするのが一般的です。formal protocol にすると、delegate オブジェクトは、protocol に含まれるすべてのメソッドを実装する必要があるからです。

hao_yayoihao_yayoi2009/07/12 11:43レス遅れてしまってすいません。

informal protocolについては、SDKのヘッダを見ていて「なんか書かれてるー」という程度の認識で、以前protocolを作ろうとしたとき、そこらへん分かってなくて全部formalにしちゃってました。まだまだ学習の余地ありです。

2009-06-16

iPhoneアプリハッカソン

23:31 | iPhoneアプリハッカソン - haoyayoi Dev Style を含むブックマーク はてなブックマーク - iPhoneアプリハッカソン - haoyayoi Dev Style iPhoneアプリハッカソン - haoyayoi Dev Style のブックマークコメント

SDK規約上かなり色々と制限がありますが、やってみたい。

一人で延々と開発作業していたけれど、java-jaペアプログラミングとか見てたら「iPhoneアプリでも同じ事してみたいなー」とか思い始めてました。ただ、やはりSDK規約だけは引っかかる。

そこで考え方を変えて、Objective-Cハッカソンならどうだろうか、と。iPhoneアプリ開発にはSDKが欠かせないけど、それ以前にObjective-Cの基礎が必要なわけです。萩原本ハッカソンともいえそうです。

皆でMacBookと萩原本を持ち寄って、共同プロジェクト作ってアプリ開発して申請、というノリ。

ついさっき思いついたので何にも決まるどころか実際に開催されるかも不明ですが、やってみたいー、という方おられたらいいなぁ。

ktakayamaktakayama2009/06/17 07:12やってみたいー、という方です!
しかしノートを持ってないという問題がありますが…泣

hao_yayoihao_yayoi2009/06/17 21:36ノートあると色々便利ですよー。
中古でもよければ、下のリンク先とか試してみてくださいな。
http://www.pbweb.jp/as-info/

2009-06-12

iUnitTestを使った実際の開発進行

| 21:08 | iUnitTestを使った実際の開発進行 - haoyayoi Dev Style を含むブックマーク はてなブックマーク - iUnitTestを使った実際の開発進行 - haoyayoi Dev Style iUnitTestを使った実際の開発進行 - haoyayoi Dev Style のブックマークコメント

以前iUnitTestを使ったことをエントリにいれたものの、開発が進みまくった後での導入は中々手強いものがありました。

実際のテンプレートを使ったコーディングになかなか踏切にくいというのはあるかもしれないので、具体的なコーディングについてメモとして残してみます。

ModelはiUnitTest subclass

MVCのうち、ModelのテストにはiUnitTestが一番用いやすいと思います。

お手軽なやり方としては、宣言の方にテスト対象をインスタンス変数として含め、実装にてtestメソッド内にて生成。そしてASSERT_EQUALなりでテストを加える形。もしくは毎回testメソッド内にてローカル変数としてやってしまうのも手です。

#pragma mark -
#pragma mark Tests

- (void)test1
{
    TargetModel *targetmodel = [[TargetModel alloc] init];
    ASSERT_NOT_EQUAL(nil, targetmodel);
    ASSERT_EQUAL([TargetModel class], [targetmodel class]);
    [targetmodel release];
}

@end

tableとviewはUINavigationBarBasedTest

というよりも、単にUITabBarBasedな方を未だ踏み入れてないというだけだったりします。

iUnitTest内部にテスト用のNavigatonBarが含まれており、テストしたいtableviewcontrollerやviewcontrollerなりをそのBarに追加するという形です。

初期ではTableViewController用に記述されていますが、これをViewControllerに直すと

- (UIViewController *)rootViewController
{
    controller = [[ViewController alloc] initWithNibName:nil bundle:nil];
    return controller;
}

こんな感じになります。

コーディングのスタイル

あくまで私流です。

1.作成したいメソッド名を定義

@interface FakeClass : NSObject {

}
- (BOOL)fakeMethod:(id)sender;
@end

2.実装はせずに、テストクラスを作成

3.テストケースを書く

- (void)testFakeMethod {
    FakeClass *faker = [[FakeClass alloc] init];
    ASSERT_EQUAL_INT(YES, [faker fakeMethod:nil]);
    [faker release];
}

4.一度テストアプリを実行する(もちろんこける)

5.実装のコードを書くけど肝心な部分は実装しない

- (BOOL)fakeMethod:(id)sender {
    return sender;
}

6.一度テストアプリを実行する(あたりまえのようにこける)

7.肝心な部分をかく

8.テストアプリを実行する

といった繰り返しでした。一つ一つ足固めする感覚です。

2009-06-06

TwitterでiPhoneでObjective-Cな人達

| 02:23 | TwitterでiPhoneでObjective-Cな人達 - haoyayoi Dev Style を含むブックマーク はてなブックマーク - TwitterでiPhoneでObjective-Cな人達 - haoyayoi Dev Style TwitterでiPhoneでObjective-Cな人達 - haoyayoi Dev Style のブックマークコメント

  • 2009/06/14
    • 2名追加。
  • 2009/06/08
    • 5名ほど追加。ついでにAppStoreへのリンクもはった。

Objective-CiPhoneアプリを開発している人の中で、Twitterアカウントを所有している人は結構多く存在します。iphone_dev_jp発言ランキングをみるとアカウントは分かるんですが、流石にだれがだれなのかまで一目でわかるかというとなかなか…。

個人的にも気になったので、iphone_dev_jpに入っているか別としてリストアップしてみました。分かる範囲で補足つけてます。敬称略です。followしまくれば多分TLがobjc一色になるかもしれません。

私がfollowしてる人ベースなので激しく抜けまくってます。突っ込みなどあればお気軽に。

うん、抜けまくってるっていうどころじゃない。無いも同然でした。どんどん増やすよ。

CherryCherry2011/05/15 23:43Thanks alot - your answer solved all my porlbmes after several days struggling