書いて覚えるSwift入門

第12回 Protocol Oriented Programming

この記事を読むのに必要な時間:およそ 5 分

すでに始まったPOP
(Protocol Oriented Programming)の時代

今回はいよいよ懸案のProtocol Oriented Programmingについて解説します。

Swift Standard Library注1を眺めていると,際立った特徴があります。

Classが少ないのです。たったの5つ。しかも1つは継承でつながっているので実質3つ図1)。

それに対してStructとEnumとProtocolはどっさりあります。これは何を意味するのか?

SwiftにおいてClassというのはあくまでもObjective-Cの遺産を活用するためのものであって,Swift的なProgramとはStructやEnumをProtocolで「つなげて」活用することであるという「中の人の心の叫び」であると弾言しておきます。

注1)
Protocol-Oriented Programming in Swift

ClassとStructやEnumの違い

それを理解するためには,ClassとStructやEnumの違いを理解しておく必要があります。細かい違いは数あれど,「若者のClass離れ」の理由を理解するために必要なのは,ただ1つです。

Classは継承できるが,StructやEnumは継承できない。つまり,リスト1の事例のようなコードは書けないのです。

リスト1 Class継承のサンプル

class ClassV1 {
    var x = 0.0
    init (x:Double) {
        self.x = x
    }
}
class ClassV2 : ClassV1 {
    var y = 0.0
    init (x:Double, y:Double) {
        super.init(x:x)
        self.y = y
    }
}
class ClassV3 : ClassV2 {
    var z = 0.0
    init (x:Double, y:Double, z:Double) {
        super.init(x:x, y:y)
        self.z = z
    }
}
var cv3 = ClassV3(x:1, y:2, z:3)

なぜ継承できないのか? 参照型であるClassと異なり,StructやEnumには実体があるからです。上記の例ではインスタンス変数は実際3つあり,それが参照でつながっています。xにアクセスするには親クラスの親クラスまで参照をたぐらなければなりません。sizeofValue(cv3)はポインターのサイズである8。Classのインスタンスであれば,必ずそうなります。

これに対し,StructやEnumは,必要なインスタンスはすべて自前で持っています。

struct StructV3 {
    var x = 0.0, y = 0.0, z = 0.0
    init (x:Double, y:Double, z:Double) {
        self.x = x
        self.y = y
        self.z = z
    }
}
let sv3 = StructV3(x:1, y:2, z:3)

ここでsizeofValue(sv3)は,Doubleのきっかり3倍である24。確かに実体を持っています。StructやEnumは,何も共有していないのです。Shared Nothingというは,並列プログラミングを格段に容易にします。共有は競合を産み,その競合をどう調停するかで我々はかなり苦労してきました。なら共有しなければいい。簡単ですね?

「えー,ちょっと待って! それってDRY(Don't repeat yourself)に反しない?」と反応した読者は鋭い。そうなのです。共有をやめるということは,型の数だけ実装がいるということでもあるのです。共通項を取り出してまとめるというのは,プログラミングの作法で最重要なものの1つなのに。

でも,それはソースのレベルの話であって,必要なマシンコードはコンパイラーのほうで生成してくればいいじゃん?――我々がしたいのは,ソースの共有であって,実体ではないのですから。

それを可能にするのが,Protocolなのです。

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。

コメント

コメントの記入