Masonryとチェーンプログラミング

6186 ワード

Objective-Cチェーンプログラミングから最近チェーンプログラミングと関数プログラミングの2つの概念を見て、ネット上でいくつかの資料を調べましたが、資料はすべて千編一律で、私の心の中に存在するこれらの疑問は全然私に解いてくれませんでした.1,なぜ.構文を用いてメソッドを呼び出すことができるのか,OCの[]を用いるのではない.2,なぜメソッドにパラメータがないのか,メソッドの戻り値がblockである場合に.構文呼び出しメソッドを用いてパラメータを伝達することができる.私と同じ問題に直面した同級生がいるかどうか分からないが、週末の時間は午後1時少し考えていた.これらの問題を一つ一つ説明します.まず、blockをご紹介します
方法のパラメータがblockタイプである場合、blockのパラメータは内外伝値2.blockの戻り値から外から内へ結果を返すために使用される.
この二つの言葉はチェーンプログラミングを実現できる鍵であり、よく理解してください.
blockについて、私たちはこのように理解することができます例を挙げることができます:みんなはきっと匪賊映画を見たことがあります.映画の中で、悪党はリモコンの爆弾をインストールして警察を脅かすのが好きで、警察が言うことを聞かないと、悪党は爆弾を爆発させます.ここの爆弾はblockと理解でき、リモコンはblockを呼び出すと理解できる.blockは私たちが事前に保存したコードブロックで、私たちが使用する必要があるときに呼び出されます.このリモコン爆弾を理解するために、ネットワーク要求データのコードを見てみましょう.
@interface ReuuestData : NSObject
//パラメータなし戻り値なしblockの定義
  • (void)requestDataSucc:(void(^)())succBlock fail:(void(^)())failBlock; @end @implementation ReuuestData
  • (void)requestDataSucc:(void(^^))succBlock fail:(void(^))failBlock{//これは爆弾のリモコンに相当し、成功または失敗の中で爆弾if(/*DISABLES CODE*/(YES){succBlock();//成功のblock}else{failBlock(///失敗のblock}@end次はViewControllerで
  • を使用します
    ReuuestData *obj = [ReuuestData alloc] init];//これは爆弾を埋めたことに相当し、私たちは彼がいつ爆発するかにかかわらず、彼が爆発する時刻はこの爆弾受信信号を取り付けたリモコンであることを決定した[obj requestDataSucc:^{//成功のコールバック}fail:^{//失敗のコールバック}].ネットワークリクエストを行うときにいつリクエストが成功するか分からないので、まずobjにリクエストネットワークのメソッドを呼び出させます.このとき、ネットワークリクエストが開始され、リクエストが終了すると、対応する成功または失敗のメソッドが実行されます.
    次に、上記のネットワークリクエストの例を理解し、チェーンプログラミングを一例で説明します.この例は他の文章でも紹介されています.文章の完全性を保証するために、もう一度この例をくどくど言います.1.まずPersonクラスを作成し、2つのメソッドを追加する
  • (void)name1;
  • (void)sex1; 2、実現方法
  • (void) name1 { NSLog(@"name"); }
  • (void)sex 1{NSLog(@"sex")}3、オブジェクトをインスタンス化し、メソッド
  • を呼び出す.
    Person*person = [[Personalloc]init]; [person name1]; [person sex1]; 以上の3部は簡単で、みんなが読むことができるより分かります.私たちの最終的な目標は
    person.name(@「Jason」).sex(@「男」);まず実現しなければなりません
    [[person name] sex]; この目標を達成するのは簡単で、[person name]を呼び出すときにPersonオブジェクトを返すだけでいいので、コードを修正します.
  • (Person *)name2;
  • (Person *)sex2;

  • (Person *)name2 { NSLog(@"name"); return self; }
  • (Person*)sex 2{NSLog(@"sex");return self;}これで実現できます
  • [[person name2] sex2]; これは私たちの最終目標からまだ距離があります.まず目標を分割し,まず実現する
    [[person name](@"Jason") sex](@" "); //               ,        (.)    
    
    person.name(@"Jason").sex(@" ");
    

    OCで呼び出しメソッドが[obj func]を使用していることはよく知られており,1つのメソッドにメッセージを送信する.obj.func(param)の形式はなく、これを実現するには、OCの中のblockを自然に思い浮かべ、blockだけが()で呼び出される.1、blockに戻って()を使って削除することができます.2、では、連続呼び出しをどのように実現すればいいのでしょうか.さらに,[[person name]sex]のようなクラスのインスタンスメソッドを呼び出すには,このクラスのインスタンスオブジェクトによって呼び出さなければならないことを解析した.[]を連続的に使用できるのは、インスタンスオブジェクトを返すためです.返されたブロックにインスタンスオブジェクトを返すと連続的に呼び出され、ブロックはちょうどオブジェクトを返すことができるのではないでしょうか.次にコードを書き換えます.
    //blockを返し、blockの戻り値はPersonオブジェクト
  • (Person * (^)())name3;
  • (Person * (^)())sex3;
  • (Person*(^^))name 3{//はblock return^Person*(){return self;}
  • を直接返すことができます.
  • (Person*(^^))sex 3{//blockを定義して、戻ってきたblockを受け取って、blockを//等号右側のPerson*()を省略して書かなくてもいいです.Person*を省略して書かないのは、戻り値自体を書かなくてもいいからです.()省略してもいいのは、blockにパラメータがない場合は省略できます()=^Person*()=^Person*(){return self;};return block;}メソッド
  • を呼び出す
    person name3 sex3; このような書き方を見るのはおかしいのではないでしょうか.OCの呼び出し方法はこのように書かれていません.焦らないでください.私たちは一歩一歩分解します.
    [person name 3]このステップはよく知られているでしょう.私たちは前に言ったように、name 3の方法はblockを返しています.私たちはこの戻り値を印刷して、いったい何の鬼なのか見てみましょう.
    NSLog(@"%@", [person name3]);//印刷結果は、戻り値がblockであることを示しています.
    //この書き方は私たちがblockを呼び出したことに相当します.前に言ったように、blockだけが()という言葉を持っています//前に言ったタイミング爆弾を覚えていますか.[person name 3]というコードを実行したとき、私たちはその爆弾を見つけて、()を実行したとき、私たちは爆弾を爆発させました.person name 3前にも言いましたが、blockにも戻り値があります.私たちは同じようにblockの戻り値を印刷します.
    NSLog(@"%@", person name3); //戻り値はオブジェクトであり、次に書き方を変えてこのコードを理解し、このコードを2つのステップに分けます.
    //1.戻り値がPersonタイプであることを宣言し、パラメータのないblockは、戻り値Person*(^returnBlock)=[person name 3]を受信するために使用される.NSLog(@"%@", [person name3]);// NSLog(@"%@", returnBlock);////2.block returnBlock();//ここではPersonオブジェクトが返されます.これはチェーンプログラミングを実現する鍵であるNSLog(@"%@",returnBlock();//上記の書き方は分かりやすいのではないでしょうか.まず、戻り値がPersonタイプで、パラメータのないblockであることを宣言し、[person name 3]の戻り値を受信します.このとき、私たちが以前に保存していたblock(爆弾)を見つけてから、block(爆発爆弾)を呼び出します.次に、前のコードを見てみましょう.
    [[person name3]() sex3]();
    

    //このステップの操作分解の後はこの4つのステップであり、チェーンプログラミングは開発効率を向上させ、コードの可読性を向上させることができるPerson*(^returnName Block)=[person name 3];Person *personName = returnNameBlock(); Person * (^returnSexBlock)() = [personName sex3]; Person *personSex = returnSexBlock(); この時、私たちが最終的に実現した効果の前のステップからまだ少し足りないのは、パラメータがないことです.私たちはコードを書き換え、パラメータを加えて、次の効果を実現します.
    person name sex; 書き換え
    //関数の戻り値はBlockで、Blockの戻り値は現在のオブジェクトで、Blockにはパラメータがあります
  • (Person * (^)(NSString *name))name4;//設定パラメータ
  • (Person * (^)(NSString *sex))sex4;
  • (Person*(^)(NSString*name))name 4{//メソッドの戻りは、戻り値が参照されているBlock"return^Person*(NSString*name){NSLog(@"%@",name);//blockの戻り値は、現在のオブジェクトreturn self;}
  • (Person*(^)(NSString*sex))sex 4{return^Person*(NSString*sex){NSLog(@'%@',sex);return self;}//呼び出し
  • //(@「Jason」)このパラメータはblockのパラメータであり、blockが戻り値のパラメータである.文章の冒頭で述べたように、blockの戻り値パラメータは外から内へ結果を返すために使用され、これが私たちが外からパラメータを入力した理由である(@「Jason」)私たちが入力したパラメータを関数の内部に印刷することは間違いありません.-->>冒頭の2番目の問題person name 4 sex 4を説明します.OK、九九八十一難を経験して、私たちはついに天竺に着いて、真経を求めるまであと一歩しかありません.私たちが望んでいる結果は
    person.name(@"Jason").sex(@"男");私たちの今の結果はこの目標と一歩差があるだけで、少し興奮しているのではないでしょうか.それとも文章の冒頭の最初の問題-->>なぜ使うことができるのか.文法はOCの中の[]を使うのではなく、方法を呼び出すことができますまず、OC内の属性宣言のデフォルトはプライベートであり、外部は直接アクセスできないが、setter個のgetterメソッドは間接的に属性にアクセスできることを知っておく必要があります.実はself.propert構文を使用する場合、直接属性にアクセスするのではなく、ステルスがsetterまたはgetterメソッドを呼び出して属性にアクセスし、コンパイルと実行の間、あなたが本当に属性を取得しています..ポイント構文呼び出し方法を実装するには、戻り値があり、パラメータがない必要があります.これによりgetterメソッドの書き込み仕様に合致し、最終的に使用するメソッドがこの仕様に合致するようになります.したがって、person.name(@「Jason」).sex(@「男」)を直接使用してメソッドを呼び出すことができます.
    最終的には
    person.name(@“Jason”).sex(@“男”);あなたは思う存分.下りて行くことができます