インターフェース再入門 / Think Interface again
by
Sota Sugiura
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
インターフェース再⼊⾨ @sota1235 PHPカンファレンス関⻄ 2018 2018/7/14
Slide 2
Slide 2 text
var_dump($me); • Sota Sugiura(きりん) • @sota1235 • Mercari, Inc. • 将来の夢はJavaScript になることです
Slide 3
Slide 3 text
インターフェース
Slide 4
Slide 4 text
インターフェースの • よさを知る • パターンを知る • 作り⽅を知る
Slide 5
Slide 5 text
Agenda 1章 インターフェースのメリット 2章 インターフェースの評価⽅法 3章 インターフェースの作り⽅
Slide 6
Slide 6 text
1章 インターフェースのメリット
Slide 7
Slide 7 text
インターフェースを使うと… • いい感じに抽象化される! • いい感じに疎結合になる!
Slide 8
Slide 8 text
インターフェースを使うと… • いい感じに抽象化される! • いい感じに疎結合になる!
Slide 9
Slide 9 text
インターフェース (interface) はインタフェイ ス、インターフェイスとも書き、英語で界⾯や 接触⾯、中間⾯などといった意味を持ち、転じ てコンピュータと周辺機器の接続部分を表すよ うになった。さらに、ユーザーインターフェー スなどのように、⼈間と⾃動機械との間の複雑 な操作をする⼿順・規則との意味にも使われる。 https://ja.wikipedia.org/wiki/インターフェース
Slide 10
Slide 10 text
ޅŮ ޅŮ ƺȉǕ✣ǫƽ✣Ǐ
Slide 11
Slide 11 text
何か = いろいろ
Slide 12
Slide 12 text
ǧǓljȉ ದᾇ ǃ✣Dz✣ǟ ίʔυ ॻ͖͍ͨ
Slide 13
Slide 13 text
Ǫnj ǭȃdžǿǴ ểὐ ϐβ ৯͍ͨ
Slide 14
Slide 14 text
DžǿǏ DžǿǏ ǷǓǙǟ σʔλ อଘͯ͠
Slide 15
Slide 15 text
getByName(); return $name; } } 3FQPTJUPSZ 6TFS HFU#Z/BNF
Slide 16
Slide 16 text
getByName(); return $name; } } 3FQPTJUPSZ 6TFS HFU#Z/BNF 中のロジックは 知らなくていい
Slide 17
Slide 17 text
インターフェースとは • ⽬的を果たすために⾃分以外のものへ作⽤す るときの窓⼝ • 窓⼝の先は知らなくてもいい • 窓⼝を知っていれば⽬的が果たせる
Slide 18
Slide 18 text
PHPのInterfaceって必要?
Slide 19
Slide 19 text
Interfaceを使う意義 • 「裏側はどうでもいいのでこういうものを求 めます」をコードで表現できる • Interfaceを使うコード側の意図が読みやすく なる
Slide 20
Slide 20 text
db = $db; } public function getByName(string $name) { return $this->db->getByName($name); } } %BUBCBTF 6TFS HFU#Z/BNF
Slide 21
Slide 21 text
db = $db; } public function getByName(string $name) { return $this->db->getByName($name); } } • Userクラスが欲しい のはデータ • データの取得元はど こでもいい • にも関わらずコード ではDatabaseクラス に依存している
Slide 22
Slide 22 text
db = $db; } public function getByName(string $name) { return $this->db->getByName($name); } } • Userクラスが欲しい のはデータ • データの取得元はど こでもいい • にも関わらずコード ではDatabaseクラス に依存している 6TFSΫϥε͕ຊʹඞཁͳͷ ʮHFU#Z/BNFΛ௨ͯ͡σʔλΛฦ͢ʯԿ͔
Slide 23
Slide 23 text
Slide 24
Slide 24 text
rp = $rp; } public function getByName(string $name) { return $this->rp->getByName($name); } } • Userクラスでは定め たInterfaceをtype hintする • 求めるInterfaceと 役割をコードで表現 できる
Slide 25
Slide 25 text
1章まとめ • インターフェースとは裏側で何が起きている か把握せずに作⽤することができる窓⼝ • PHPのInterfaceを使うことでインターフェー スに期待する動作をコードで表現できる
Slide 26
Slide 26 text
2章 インターフェースの評価⽅法
Slide 27
Slide 27 text
よいインターフェースとは
Slide 28
Slide 28 text
1. 名前が役割を適切に⽰しているか 2. 最⼩か完全か 3. 単純か複雑か
Slide 29
Slide 29 text
1. 名前が役割を適切に⽰しているか 2. 最⼩か完全か 3. 単純か複雑か
Slide 30
Slide 30 text
名は体を表す • インターフェースの名前が役割を適切に表現 すべきである • どんなロジックを持つのか • 返り値は何なのか
Slide 31
Slide 31 text
getLoginSession
Slide 32
Slide 32 text
getLoginSession -PHJO4FTTJPOΛ औಘ͠·͢
Slide 33
Slide 33 text
getData
Slide 34
Slide 34 text
getData ใΛ (FU͠·͢
Slide 35
Slide 35 text
getData ใΛ (FU͠·͢ • Dataって何のData?
Slide 36
Slide 36 text
getData ใΛ (FU͠·͢ • Dataって何のData? ⇒ 名前が曖昧で役割を表現できていない
Slide 37
Slide 37 text
getCompletedTime
Slide 38
Slide 38 text
getCompletedTime ྃ࣌ؒΛ ݄Ͱฦ͠·͢
Slide 39
Slide 39 text
getCompletedTime ྃ࣌ؒΛ ݄Ͱฦ͠·͢ • 完了時間、何秒かまで欲しいんだけど…
Slide 40
Slide 40 text
getCompletedTime ྃ࣌ؒΛ ݄Ͱฦ͠·͢ • 完了時間、何秒かまで欲しいんだけど… ⇒ 期待と実装にギャップがある ⇒ 名前を実装に寄せる or 実装と名前を直す
Slide 41
Slide 41 text
名前を⼤切に • インターフェースの名前から役割が連想でき るようにする • 名前で不⼗分な場合はコメント等で補完する • できれば⽂書化せずに済む名前を考えよう • 引数や返り値(PHP7)のtypehintも活⽤しよう
Slide 42
Slide 42 text
1. 名前が役割を適切に⽰しているか 2. 最⼩か完全か 3. 単純か複雑か
Slide 43
Slide 43 text
最⼩か完全か • 最⼩ • ⽬的を実現するために必要最⼩限なメソッド だけ揃っている • 完全 • ⽬的を実現するために必要なメソッドが全て 揃っている
Slide 44
Slide 44 text
Example • Fileを扱うInterfaceを考える • 以下の⽬的があるとする • ファイルを1⾏ずつ読み込みたい
Slide 45
Slide 45 text
Slide 46
Slide 46 text
Slide 47
Slide 47 text
Slide 48
Slide 48 text
Slide 49
Slide 49 text
Slide 50
Slide 50 text
トレードオフ • 最⼩ • 実装がシンプルに保たれる • 使う側でコード量が増える可能性がある • 完全 • 呼び出し側がシンプルになる • テストや実装の追加、保守が必要
Slide 51
Slide 51 text
1. 名前が役割を適切に⽰しているか 2. 最⼩か完全か 3. 単純か複雑か
Slide 52
Slide 52 text
単純か複雑か • 単純 • 主な機能のメソッドのみ提供される • 複雑 • より細かい操作を可能にするメソッドが提供 される
Slide 53
Slide 53 text
Example • 画像を扱うInterfaceを考える • 様々な変更を加えるメソッドを⽣やす
Slide 54
Slide 54 text
Slide 55
Slide 55 text
Slide 56
Slide 56 text
Slide 57
Slide 57 text
Slide 58
Slide 58 text
Slide 59
Slide 59 text
トレードオフ • 単純 • メソッド数が少なく、理解が容易 • 細やかな変化に対応できない • 複雑 • 細やかな操作が呼び出し側で可能 • インターフェースの理理解が難しい
Slide 60
Slide 60 text
2章まとめ • インターフェースの評価基準 • 役割を⽰す名前 • 最⼩/完全、単純/複雑のトレードオフ
Slide 61
Slide 61 text
3章 インターフェースの作り⽅
Slide 62
Slide 62 text
インターフェース作りに挑戦 • ⼈を表現するInterfaceが欲しい • ⼈は名前を持つ • ⼈は役割を持つ • その⼈が特定の役割を持つか確かめる⼿段が 欲しい
Slide 63
Slide 63 text
Slide 64
Slide 64 text
Slide 65
Slide 65 text
Slide 66
Slide 66 text
Slide 67
Slide 67 text
インターフェース作りに挑戦 • ⼈を表現するInterfaceが欲しい • ✅⼈は名前を持つ • ✅⼈は役割を持つ • ✅その⼈が特定の役割を持つか確かめる⼿段 が欲しい
Slide 68
Slide 68 text
Q. これがベストのInterface?
Slide 69
Slide 69 text
A. わからない
Slide 70
Slide 70 text
ベストなInterfaceとは • Interfaceに正解はない • これを導⼊すればよい、というテクニックもない • 実現したいことによって最善は変わる • ⾃分が何を作るのか熟考必要がある • コード設計と同じこと
Slide 71
Slide 71 text
提案したい設計指針 • 要件から考える • 保守性から考える • 未来予測から考える
Slide 72
Slide 72 text
要件から考える • 必要な機能を考える • そのInterfaceを使う側に⽴って考える
Slide 73
Slide 73 text
Slide 74
Slide 74 text
Slide 75
Slide 75 text
Slide 76
Slide 76 text
getRole() === 'admin') { // } } } 使い⼿の気持ちになる
Slide 77
Slide 77 text
getRole() === 'admin') { // } } } 使い⼿の気持ちになる getRole()を駆使しないと 「その⼈が特定の役割を持つか確かめる⼿段が欲しい」 が実現できない
Slide 78
Slide 78 text
getRole() === 'admin') { // } } } 使い⼿の気持ちになる 最⼩/完全という観点で⾒ると最⼩と⾔えそうだが そもそも現時点でgetRole()を求められていない
Slide 79
Slide 79 text
isRole('admin')) { // } } } 改良版 1つメソッドを呼ぶだけで要件を実現できた 名前も今回求める役割を表現できてる
Slide 80
Slide 80 text
isAdmin()) { // } } } 改良版 最⼩のインターフェースから完全へ
Slide 81
Slide 81 text
Slide 82
Slide 82 text
保守性から考える • 実装⼯数や運⽤を意識する • メソッドの数が多ければ多いほど保守性は下 がる
Slide 83
Slide 83 text
Slide 84
Slide 84 text
1つ1つに意味を与える • 経験則やベストプラクティスからメソッドを 定義しない • 全てのメソッドは意味を持つ • 「そのメソッドはなぜ必要ですか?」に答え られないメソッドは⾒直すべき
Slide 85
Slide 85 text
Slide 86
Slide 86 text
未来予測から考える • 予測できる範囲の近い未来を考える • 確定された未来がないことを肝に刻んで考え る
Slide 87
Slide 87 text
例えば • 現在の仕様で存在する役割がadmin, sysadmin, generalの3種類だったらこんな Interfaceもあり
Slide 88
Slide 88 text
Slide 89
Slide 89 text
Slide 90
Slide 90 text
Slide 91
Slide 91 text
3章まとめ • 最適なインターフェースはその時々で変わる • 要件を理解し、未来予想や保守性、様々なト レードオフを考慮して設計していく
Slide 92
Slide 92 text
最後に
Slide 93
Slide 93 text
最⾼のインターフェースへの 道のりは⻑い • 最適解は時と場合で変わっていく • ⼤事なのは引き出しを多く持つこと • たくさんコードを書き、読むことで引き出し を増やしていきましょう • 必要に応じて論理武装するとよい
Slide 94
Slide 94 text
まとめ • インターフェースのメリットとは「裏側を知 らずに」⽬的を実現できること • 様々なパターンとトレードオフが存在する • 要件や様々な問題を知識を駆使してInterface を設計していくことが⼤事
Slide 95
Slide 95 text
Thank you