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