可変値変数 var を極力避けることを模索するための事前知識 #cswift

>100 Views

February 07, 16

スライド概要

前回の勉強会中で話題に登った『アプリケーション規模で var を極力減らしてみよう』をみんなで試みる前の前提知識として用意した、変数を let で扱うことの意味やそれにまつわるお話を紹介するために作成したスライドです。

※ Docswell での公開に移行する直前の Slideshare での閲覧数は 4,124 でした。

ややこしい部分はその場で説明したらいいかなと思って作ったので、スライド的に流れや説明が欠けているところもありますけど、幾らかの参考になるかもしれません。

profile-image

正統派趣味人プログラマー。プログラミングとは幼馴染です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

可変値変数 var を極⼒避けることを 模索するための事前知識 2016.02.06 カジュアル Swift 勉強会 @ ⻘葉台 EZ-NET 熊⾕友宏 Swift 2.1.1 http://ez-net.jp/

2.

熊谷友宏 @es̲kumagai EZ-NET http://ez-net.jp/ 書籍 / 登壇 Xcode 5 徹底解説 MOSA Xcode 5 の全機能を 徹底的に解説した本 OSX/iOS 系の歴史深い 有料会員制の勉強会 Xcode 7 でも役立つはず 法人会員も多数 紙版は絶版、電子書籍は販売中

3.

熊谷友宏 @es̲kumagai EZ-NET http://ez-net.jp/ 勉強会 横浜 iPhone 開発者勉強会 カジュアル Swift 勉強会 【 横浜・馬車道 】 #yidev 【 横浜・青葉台 】 #cswift わいわい・ゆるく、iPhone 開発者の みんなで楽しく過ごすのが目的の会 ゆるくみんなで Swift を語らえる場を 作りたくて始めた会 第22回を 2016-03-05 に開催

4.

熊谷友宏 @es̲kumagai EZ-NET http://ez-net.jp/ iOS, OS X, Apple Watch アプリ CodePiece いつもの電卓 ソースコードを Twitter と Gist に同時投稿できる。 計算式も見える電卓アプリ。 watchOS 1 対応 音で再配達ゴッド EZ-NET IP Phone 簡単操作で 再配達の申し込み。 iPhone でひかり電話を使う。 自宅 LAN からの利用専用

5.

CodePiece for OS X 勉強会を楽しむアプリ ソースコードを Twitter と Gist に同時投稿できる 勉強会で知見をみんなと共有したい時とかに便利! できること #devsap

6.

2種類の変数

7.

2種類の変数 概要 1. 不変値変数 let value = 100 2. 可変値変数 var value = 100

8.

不変値変数 概要 ▶ let で宣言された変数 ▶ 値を書き込めるのは1度だけ // 値を書き込んだら… let value = 10 // 変更はできない value = 20

9.

可変値変数 概要 ▶ var で宣言された変数 ▶ 何度でも書き換え可能 // 値を書き込んで… var value = 10 // さらに書き換えが可能 value = 20

10.

【余談】不変値変数の初期化 不変値変数の初期化は遅らせられる ▶ 使うまでに代入すれば良い ▶ 型の明記だけは必要 ▶ 条件で違う値を設定したり、 クロージャーを再帰実行したいときに便利 // 型を明記して変数を定義する let value: Int // 値の設定はその後で出来る(1度限り) value = 10 print(value)

11.

原則 不変値変数を使う

12.

不変値変数を使う 意図 ▶ 値が未来永劫、保証される ▶ 外からの予期しない変化を防ぐ ▶ 変化を考慮したコードが不要になる

13.

不変値変数を使う コンパイラも推奨 ▶ 値を変えてない変数を検出 ▶ let の使用を促してくる

14.

不変値と可変値

15.

不変値と可変値 おさらい 1. 不変値変数 let value = 100 2. 可変値変数 var value = 100

16.

不変値と可変値 捉え方 1. 不変値変数 値を表現 2. 可変値変数 状態を表現

17.

不変値変数 値を表現 ▶ 評価したい式で使うもの ▶ 何かを評価した結果 a = f(x,y,z) ▶ 引数は使う前に決まる ▶ 結果は決まったら変わらない 変化する必要がない

18.

可変値変数 状態を表現 ▶ 時事刻々と変化する値 ▶ 今の様相を表現するもの location: (x,y) amount: ㎖ 変化する必要がある

19.

不変値と可変値 要所

20.

着目点 動くか動かないか 1. 不変値変数 location: (x,y) 2. 可変値変数 location: (x,y)

21.

可読性 変数が意味を含む // 座標の値 let location:(x,y) // 物体の現在位置 var location:(x,y)

22.

不変値と可変値 オプショナルにおける意味合い

23.

不変値と可変値 捉え方 1. 不変値変数 値が得られるか否か 2. 可変値変数 何もない状態が存在する

24.

オプショナルな不変値変数 値を得られるか否か ▶ 値が得られないかもしれない ▶ 取得後、速やかに判定する // 不必要にオプショナルのまま持ち越さない let index:Int? = values.indexOf("Apple") // オプショナルは速やかに解消する if let index:Int = values.indexOf("Apple") { }

25.

オプショナルな可変値変数 何もない状態が存在する ▶ 無い状態が継続する可能性がある ▶ ある瞬間を切り出すと値になる // アイテムを持ってない可能性がある struct Clipboard { var item:AnyObject? } // 参照したら値、オプショナルは速やかに解消 if let item:AnyObject = clipboard.item { }

26.

値を意識した言語仕様

27.

構造体 値を表現する型 ▶ 新しい値型を作る ▶ 既存の値を組み合わせて表現する // 座標を表現する構造体 struct Point { var x:Int var y:Int }

28.

値型を支える仕組み (1) 扱いで振る舞いが変わる 1. 不変値変数 内容が書き込み禁止になる 2. 可変値変数 内容が書き込み可能になる

29.

構造体 扱いで振る舞いが変わる 1. 不変値変数 let location = Point(x:0, y:0) location.x = 10 2. 可変値変数 var location = Point(x:0, y:0) location.x = 10

30.

mutating 可変値変数だけで使える機能 struct MyValue { // メソッドは、必要なら設計者が mutating を明示 mutating func increment { self.value = value + 1 } // 保持型プロパティは、セッターが mutating 扱い var value: Double // 計算型プロパティは、既定ではセッターだけが mutating 扱い var integerValue: Int { get { return Int(value) } set { self.value = Double(newValue) } } }

31.

値型を支える仕組み (2) 代入時コピー ▶ 代入時に複製される ▶ 外部の影響を受けなくなる let location1 = Point(x:0, y:0) // 別の変数に代入すると、新しい値が作られる let location2 = location1 コピー

32.

値型を支える仕組み (2) 代入時コピー ▶ 代入時に複製される ▶ 外部の影響を受けなくなる var currentLocation = Point(x:0, y:0) // 状態も取得時に複製され、影響を受けなくなる let location = currentLocation コピー 値と状態の乗り入れが可能

33.

不変値を意識すると起こる変化

34.

値なのか、状態なのか 値なら可変値変数は使わない

35.

総和の計算 Objective-C で普通な計算方法 func sum(values: [Int]) -> Int { var result = 0 for value in values { result += value } } return result

36.

総和の計算 変数の用途を見直してみる ▶ 足し合わせる数は、値 ▶ 足し合わせた結果は、値 値なら可変値変数は使わない

37.
[beta]
総和の計算
可変値変数を使わないで計算すると…
func sum(values: [Int]) -> Int {
var result = 0
for value in values {
result += value
}
func sum(values: ArraySlice<Int>)
return result
-> Int {
}
if values.isEmpty {
return 0
}
else {
return values.first!
+ sum(values.dropFirst())
}
}

38.

総和の計算 可変値変数を避けるのに便利な機能 func sum(values: [Int]) -> Int { } return values.reduce(0) { $0 + $1 } 0 1 5 10 -3 8 array.reduce(0) { $0 + $1 } 0 + 1 1 + 5 6 + 10 16 + -3 13 + 8 21

39.

まとめ

40.

可変値変数を極力避ける 得られる利点 ▶ 予測不能な変化を防げる ▶ 変化を考慮した制御が不要になる ▶ スコープの中では認知されている考え方 ▶ スコープを超えたクラス規模でも効果的? 可能性を確かめてみたい!

41.

to be continued ...

42.

可変値変数 var を極力避けることを 模索するための事前知識 1. 2種類の変数 ✓ ✓ 2. … 値を表現 … 状態を表現 原則、不変値変数を使う ✓ ✓ 3. 不変値変数 let 可変値変数 var 予測不能な変化を阻止 変化を考慮した制御が不要 値を意識した言語仕様 ✓ ✓ ✓ 構造体 扱いで振る舞いが変わる … mutating 代入時コピー