delegateパターン
delegateは日本語訳で「委譲」という意味だそうですが、
自分の理解のためにもdelegateパターンについてまとめようと思います。
delegateパターンとは?
delegateパターンとはオブジェクト間のイベント通知の一種です。
イベント通知は3種類に分けられます。
- デリゲートパターン
- クロージャ
- オブザーバパターン
デリゲートパターンはこの中の1種類に該当するものです。
イベント通知とは何か?
イベント通知とは、イベントの発生箇所となるオブジェクトが、他のオブジェクトにイベントの発生を伝えることです。
イベントというのは、アプリケーション内で発生するあらゆる事象のことになります。
例:UI要素のタップ、プロパティの値の変更
実装方法
コード例
protocol GameDelegate: class{
var numberOfPlayers: Int { get }
func gameDidStart(_ game: Game)
func gameDidEnd(_ game: Game)
}
class TwoPersonGameDelegate: GameDelegate{
var numberOfPlayers: Int {return 2}
func gameDidStart(_ game: Game) {print("ゲーム開始")}
func gemeDidEnd(_ game: Game) {print("ゲーム終了")}
}
class Game {
weak var delegate: GameDelegate?
func start(){
print("プレイヤーの人数は\(delegate?.numberOfPlayers ?? 1)人です")
delegate?.gameDidStart(self)
print("プレイ中です")
delegate?.gameDidEnd(self)
}
}
let delegate = TwoPersonGameDelegate()
let twoPersonsGame = Game()
twoPersonsGame.delegate = delegate
twoPersonGame.start()
//実行結果
プレイヤーの人数は2人です
ゲーム開始
プレイ中です
ゲーム終了
実装手法
- 任せる処理をプロトコルのメソッドとして宣言する
func gameDidStart(_ game: Game)
func gameDidEnd(_ game: Game)
- デリゲート先のオブジェクトはそのプロトコルに準拠し、処理の委譲に応えられるようにする。
class TwoPersonGameDelegate: GameDelegate
命名方法
このコード例についてまとめると下記のようになります。
- デリゲート元のオブジェクト名→Game
- デリゲート先のオブジェクト名→TwoPersonGameDelegate
命名3規則
-
メソッド名はデリゲート元のオブジェクト名から始め、続けてイベントを説明する
gameDidStart
→gameはデリゲート元のオブジェクト名
→DidStartはイベント
gameDidEnd
→gameはデリゲート元のオブジェクト名
→DidEndはイベント -
didやwillなどの助動詞を用いてイベントのタイミングを示す
-
第一引数にはデリゲート元のオブジェクトを渡す
gameDidStart(_ game: Game)
命名規則を守ることによるメリット
- メソッド名を見ただけで、誰が、いつ、どういう場合に呼ぶのか明確になる
- 名前の衝突を回避できる
- 利用する側が扱いやすい
- 既存のCocoa,Cocoa Touchフレームワークと違和感なく協調させることができる
利用するべき時
- 2つのオブジェクト間で多くの種類のイベント通知を行うとき
- 外部からのカスタマイズを前提としたオブジェクトを設計する時