2010年10月12日火曜日

iOS用メッセージングライブラリ:MessengerSystem

iOS用メッセージングライブラリ:MessengerSystem



概要

    クラス間親子関係メッセージング用ライブラリ。 フルObjective-C。

    オープンソース。

    iOSのObjective-CランタイムでサポートされているNSNotificationを利用し、

    MVC -MVC 間の接続度を可能な限り疎にする。

    


    このライブラリのインスタンスを持つオブジェクト同士を任意に接続し、

    メッセージを投げ合う事が出来る。


    また、オマケで、アプリケーション内での接続内容をリアルタイムに可視化する

    外部視覚化ビュー、

    通信ログを持つ



    目標A、タグ:バリュー型での入力を可能にする

        Dictionaryをつれ回す形式はそのままだが、

        値に対して、文字列型の値を付けられるようにする。


    目標B、親子関係の動的指定

        親子関係を、子供から親を指定する手法で

        設定できるようにする。

        複数の親は許容しない。

        複数の同名の子供が存在する事を許容する。

        

    目標C、メソッドの外部呼び出し

        メソッドのポインタを渡し、受け取り側から遠隔実行できるようにする


    目標D、可視化

        つながりを可視化する

        可視ビューを作り出し、各インスタンスの関係、つながりを表示できるようにする。

     

    目標E、ログ取り

        通信記録を取れる/見れるようにする。


    目標F、遅延実行、遠隔実行

        遅延実行をタグ設定で実行できるようにする。



DL
    GitHubにアップロードされている。
    http://github.com/ToruInoue/MessengerSystem


APIドキュメント
    doxygenにて作成、添付


使用法
    1.MessengerSystemのインスタンスを持つ
        初期化時、自身のクラスidと、
        メッセージが来たときに実行したい、NSNotificationを引数に持つメソッドと、
        このMessengerの固有名詞を設定します。

- (id) initWithBodyID:(id)body_id withSelector:(SEL)body_selector withName:(NSString * )name

        
        Ex:TEST_PARENT_NAME = (@"親設定のMessenger"), TEST_CHILD_NAME_0 = (@"子供その1")と定義しておいたとする。

MessengerSystem * child_0 = [[MessengerSystem allocinitWithBodyID:self withSelector:@selector(testChildMethod:) withName:TEST_CHILD_NAME_0];





    2.クラス間を跨ぐように、Messengerどうしに親子関係を設定する事が出来る
        inputParentメソッドで他のクラスのMessengerの固有名詞を入力すると、
        入力元のMessengerを子供、固有名詞を指定されたMessengerを親として、
        通信関係が構築されます。

        とあるクラスA
MessengerSystem * parent = [[MessengerSystem allocinitWithBodyID:self withSelector:@selector(testParentMethod:) withName:TEST_PARENT_NAME];

        とあるクラスB

MessengerSystem * child_0 = [[MessengerSystem allocinitWithBodyID:self withSelector:@selector(testChildMethod:) withName:TEST_CHILD_NAME_0];

[child_0 inputParent:TEST_PARENT_NAME];


    その時のMessengerの関連を表示するビュー
        (MessengerViewControllerのview要素をwindowにaddSubViewしたもの)
    MessengerViewController親子関係をグラフィックで見る事が出来る。

        
    3.親子間でメッセージを送る
        可変長引数のNSObjectを渡す事が出来る。ただしnilで締める必要が有る。忘れるとエラー。
        
        parent → child_0
[parent call:TEST_CHILD_NAME_0 withExec:@"テスト",

 nil];



        child_0 → parent
[child_0 callparent:@"テスト",

 nil];  

        


        メッセージの受け取りは、
        Messenger生成時に指定したメソッドで行う事ができる。

    parentインスタンスを持っているクラス
- (voidtestParentMethod:(NSNotification * )notification {

    NSMutableDictionary * dict = (NSMutableDictionary *)[notification userInfo];

    NSString * exec = [parent getExecAsString:dict];


    if ([exec isEqualToString:@"テスト"]) {

        //やりたい事

    }

}




    childインスタンスを持っているクラス
- (voidtestChiidMethod:(NSNotification * )notification {

    NSMutableDictionary * dict = (NSMutableDictionary *)[notification userInfo];

    NSString * exec = [child_0 getExecAsString:dict];


    if ([exec isEqualToString:@"テスト"]) {

        //やりたい事

    }

}


    kvsでの値受け渡しが可能。

[child_0 callParent:TEST_EXEC_3,

 [child_0 tag:@"タグ" val:],

 nil];

 


   

    4.ブロードキャスト/相手を確定して通信
        親→子へは、子供の名称でのブロードキャストが可能。
        同名の子供が何人いても、メッセージを送付できる。

        子供の子供、などのネストが可能。
        


    5.遅延実行、遠隔実行
        命令の遅延実行(floatで指定した秒数後に起動)、
        自分が持っているメソッドの遠隔実行
            (受取手側から引数を入力してのメソッド実行)
            などが可能。

             
        parent → child_0 遅延実行
            0.3秒後にメッセージを送る

[
parent call:TEST_CHILD_NAME_0 withExec:@"テスト",

 [parent withDelay:0.3],

 nil];




        child_0 → parent 遠隔実行

            child_0を保持しているクラスが持っている、下記
        - (void) sayHello:(NSString * )str;
            メソッドをparentを保持しているクラスで遠隔実行

[child_0 callParent:TEST_PARENT_INVOKE,

 [child_0 withRemoteFrom:self withSelector:@selector(sayHello:)],

 nil];



            受け取ったparent側で、引数だけを渡して実行!

- (voidtestParentMethod:(NSNotification * )notification {

    NSMutableDictionary * dict = (NSMutableDictionary *)[notification userInfo];

    NSString * exec = [parent getExecAsString:dict];


    if ([exec isEqualToString:TEST_PARENT_INVOKE]) {

        [parent remoteInvocation:dict, @"遠隔実行で親から子供の、子供から指定されたメソッドを実行しています。", nil];

    }

}

  



    4.親子関係の動的変更
            親から子をパージ、子から親をパージ、などすると、子から親を再指定できるようになる。
             動的に変更可能。
        [child_0 removeFromParent];

        [parent removeAllChild];



ライセンス
    未定。とりあえず数日だけ公開。
    BSDかGPL2。
    このライブラリを使用した事によるどのような損害、被害についても弊社はその責任を負わないものとする。


    







2010年10月9日土曜日

doxygenでObjective-CソースからDoc生成

doxygenでObjective-CソースからDoc生成


概要
    Objective-Cのソースに対して、JavaDoc形式コメントから
    HTMLなどでドキュメントを作成してくれるツール、
    doxygenについての導入メモ
    
    もちろんC++,Cにも使える。
    (というかObjective-C専用の設定は無かった。
        だがウマく出たので良しとする。)
    

目的
    Objective-Cプロジェクト中に、JavaDoc形式で書かれた文言から
    ドキュメンテーションを自動作成する。
    といっても、動作原理はJavaDocと変わらない。
    記法もJavaDocそのものなので、
    @paramとかの記述にも対応してくれる


インストール
    Mac向けのPackageで用意されているので、DLしてインストールする。
    Wizardに従う。

    doxygen
        http://www.stack.nl/~dimitri/doxygen/


使い方
    GUIがある。
    doxygenをインストールしたフォルダにappがあるので、起動。
    先ずは生成されるドキュメントのタイトルとかをセットする。

    Step1
    プロジェクトの置いてあるフォルダを指定。

    Step2については下記、
    Project name,versionは適宜。
    Source code directory 
        ソースが置いてある場所を指定。
        iPhone系であれば、classファイルのフォルダを指定するだけでOK。
        
    Specify the directory where doxygen should put ~
        doxygenがドキュメントを出力する場所について、指定する。
        Step1をこなせば、プロジェクトの置いてあるフォルダ近辺が自動入力される筈。
    次に、実行する。
    Runのタブを押し、Run doxygenボタンを押す。以上でドキュメント生成が完了する。
    Show HTML output を押すと、完成したドキュメントが表示される。
    内容をもっとJavaDocらしくきちんと書けば、return,paramなども表示される。
    なかなか使えるんじゃなかろうか。


その他
    Graphviz というクラス関連図描画ソフトと連携しているらしいのだが、
    どうも出力時にエラーが出るようで、まだ正確に使っていない。

    Graphviz
        http://www.graphviz.org/

フォロワー