今回はInterpreterパターンについて書いていきます。
デザインパターンとは
デザインパターンとはソフトウェア開発の設計方法の事です。
『オブジェクト指向における再利用のためのデザインパターン』という本が出典で、全部で23種類のパターンが紹介されています。
Interpreterパターンとは
簡単な言語を作る事のできるパターンです。
文字列を解析してそれを元に実行する時に等使います。
NSPredicateで文字列で条件式を書く時のような事を実現してくれます。
SwiftでのInterpreterパターンの実装方法
SwiftでのInterpreterパターンは下のように実装します。
まだ把握しきれていないのですが、このパターンでは文字列を分割・保持するContext
とContext
内のToken
の1つ1つに対応するExpression
の2つが出てきます。
import UIKit class Context { var tokens: [String?] var index = 0 init(str: String) { tokens = split(str, maxSplit: Int(INT_MAX), allowEmptySlices: true, isSeparator: { $0 == " " }).map({ return $0 }) tokens.append(nil) } func nextToken() -> String? { if currentToken() == nil { return nil } return tokens[index++] } func currentToken() -> String? { return tokens[index] } } class Expression { let token: String init(token: String) { self.token = token } func execute() {} } class TerminalExpression: Expression { override func execute() { NSLog("\(token)です") } } class NonterminalExpression: Expression { let tag = "!" var expressions = [Expression]() func parse(context: Context) { while context.currentToken() != nil { if (context.currentToken() == tag) { expressions.append(NonterminalExpression(token: context.currentToken()!)) } else { expressions.append(TerminalExpression(token: context.currentToken()!)) } context.nextToken() } } override func execute() { NSLog("START!!! ") for expression in expressions { expression.execute() } } } let context = Context(str: "! A B ! C") let token = context.currentToken() context.nextToken() let expression = NonterminalExpression(token: token!) expression.parse(context) expression.execute()
- 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 1999/10
- メディア: 単行本
- 購入: 21人 クリック: 711回
- この商品を含むブログ (210件) を見る