Metaprogramming

13
Metaprogramming @akuraru

Transcript of Metaprogramming

Page 1: Metaprogramming

Metaprogramming@akuraru

Page 2: Metaprogramming

自己紹介

• Scalaが好き

• Objective-Cは生成するもの

• こわくない

@akuraru

Page 3: Metaprogramming

メタプログラミング

Page 4: Metaprogramming

メタプログラミング

• プログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。主に対象言語に埋め込まれたマクロ言語によって行われる。

Page 5: Metaprogramming

メタプログラミング

• クラスやメソッドを生成するロジックの事

• Objective-Cには実行時に行うことができる

• 今回はコンパイル時にメソッドを増やす      カテゴリの話

Page 6: Metaprogramming

カテゴリ• コンパイル時に既存のクラスにメソッドを追加、上書きできる機能

• 例

• NSDate-Escort、MagicalRecord

Page 7: Metaprogramming

書き方

@interface NSDate (Escort)

- (BOOL)isToday;

@end

@implementation NSDate (Escort)

- (BOOL)isToday {    return [self isEqualToDateIgnoringTime:[NSDate date]];}

@end

参考:https://github.com/azu/NSDate-Escort

Page 8: Metaprogramming

実装

• コンパイル時に既存のクラスにメソッドを追加、上書きしている

• ヘッダーをインポートしなくても実行できる

Page 9: Metaprogramming

良いところ

• 手軽

• ファイル分けができる

• テストするとき便利

Page 10: Metaprogramming

問題• 同じクラスに同じメソッドを別のカテゴリで追加した場合、どちらかが適用される

• 実装ファイルがなくてもコンパイルエラーにならない

• 責任過剰になりがち

Page 11: Metaprogramming

カテゴリを用いていい場合

• 複数クラスにメソッドを追加したい

• それが自然と思える場合

Page 12: Metaprogramming

解決法

• 継承

• Static Classを作る

Page 13: Metaprogramming

まとめ

• 簡単に既存のクラスにメソッドを追加できます

• 何でもかんでもカテゴリで解決しない