Skip to content

staticおじさんになろう 公開版

公開日:

大阪府大阪市北区グランフロント大阪 北館タワーC 8階 カンファレンスルームで開催された『PHPカンファレンス関西2017』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

公開版

staticおじさんになろう

War on Dynamics

2017-07-15 PHPカンファレンス関西2017 LT

Page 2

このスライドは2017年7月15日に開催されたPHPカンファレンス関西2017で当日募集された本篇LTにて話したスライドに調整および加筆を施したものです。口頭で補足したもの、文字だけではわかりにくいものを補ったほか、後半部分に文章の追加があります。

Page 3

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id:zonuexe
  • ピクシブ株式会社でひたすらPHPやってる p(ixi)v
  • フレームワークなき道にフレームを作るおしごと
  • Qiitaに記事を書いたり変なコメントしてるよ
  • 最近やってること
  • 万難が排されつつあるのでPHP7 移行
  • えいやえいやとテスト書いたり直したりしてる

Page 4

そろそろ10年になるWebサービスを開発

Page 5

注意

Page 6

このLTは特定のアーキテクチャの導入を勧誘するものではなく、その是非については自分で判断してください。

Page 7

対処が難しかった事例を寄せ集めただけで、特定の実装の話ではない

Page 8

オチは特にない

Page 9

あと特定の会社の回し者ではない

Page 10

さて

Page 11

あるメソッドのAPI(引数・返り値)を変更したいとします

Page 12

リファクタリングできますか?

Page 13

そのメソッドの呼び出し箇所を列挙できますか?

Page 14

そうですね

Page 15

git grep '\->setName('

Page 16

本当にそれで全部ですか?

Page 17

$obj = new FugaClass;$f = [$obj, 'setName'];call_user_func($f, $n);

Page 18

🙃

Page 19

$obj = new FugaClass;$obj->setName($v);// ↑探したいのはこっち$obj2 = new HogeClass;$obj->setName($x, $y);// ↑同名の関係ないメソッド

Page 20

誤爆

Page 21

結果を絞ろう

Page 22

# newの次行にsetNameがある前提git grep -a1 'new FugaClass' |

grep '\->setName('

Page 23

これで完璧

Page 24

// DIコンテナ$app['fuga']->setName($n);

Page 25

🙃

Page 26

こんなことが続くと人間は無気力になる(学習性無力感)

Page 27

(そのあとも動的な性質による悩みは絶えない)

Page 28

ソリューション

Page 29

new staticおじさんedition

class FugaClass {private $name;private function __construct(){}

public static function setName(FugaClass $that, $name) {

$that->name = $name;}// ...

Page 30

git grep'FugaClass::setName'

Page 31

これでいいのか

Page 32

😇

Page 33

書きにくくなっただけでは…

Page 34

staticおじさんをやめよう

Beat “evil” static methods

2017-07-15 PHPカンファレンス関西2017 LT

Page 35

特効薬

Page 36

Photoshop

Page 37

PhpStorm

Page 38

FindUsageとRefactor機能最強説

Page 39

Page 40

型が推測できなくなるような複雑な書き方をしない

Page 41

型を確定できないところは地道にPHPDocで型をつけていく

Page 42

http://nico.ms/kn1774

Page 43

これだけ覚えて帰ってね

タグ名

意味

@param引数を定義@param int $n1

@return返り値を定義@return int[]

@var変数/プロパティを定義@var int

@propertyマジックプロパティを定義@property int $id

Page 44

DI/IoCコンテナは?

Page 45

(日本語での説明、ただしサンプルコードが旧形式)PhpStorm の PHPSTORM_META でサービスロケーターとかを入力補完 - ngyukiの日記

http://ngyuki.hatenablog.com/entry/2015/02/20/134239

(公式資料・新形式のコード例が載ってる)PhpStorm Advanced Metadata

https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata#PhpStormAdvancedMetadata-Factorymethods

Page 46

某社の回し者ではないので、PhpStorm以外に良いツールあれば知りたい!

Page 47

そもそもstaticおじさんになった理由はコレジャナイ

Page 48

なれる!staticおじさん

I wanna be a clever static uncle

2017-07-15 PHPカンファレンス関西2017 LT

Page 49

Webサービスを作る人間=オブジェクト指向の達人

Page 50

ではない

Page 51

素朴に作られたクラスは余計な状態を抱えこんで渾沌が肥大化する

Page 52

多すぎる引数…謎のメソッド…不要なプロパティ…

Page 53

それでもコードは動き、今の自分たちを生かしてくれてる (=収益源)

Page 54

作られた当時は理由があった(たぶん)

Page 55

動いてきたコードへのリスペクトを見失ってはならない

Page 56

それでもサービスを成長させる足枷にならないようにリファクタリングしていく

Page 57

混沌としたクラスからstaticおじさんに身を堕としたのはカオスを収束させるため

Page 58

カオスを収束させた後ならば、未来に向かって「あるべき姿」を再定義することができる

Page 59

カオスを収束させずに夢を見てアーキテクチャの再設計を試みると理想と現実のギャップと物量に圧し潰されて氏ぬ

Page 60

重要な事実:オブジェクト指向を多少かじった程度では、ベターなOO設計ができる大先生にはなれない

Page 61

設計のエキスパートではなくても多くのパタンに触れていけば現在の身のたけに合ったものを選びとることはできる

Page 62

オブジェクト指向プログラミングに基いたリファクタリングが常に最適解ではなくて、手続き型なら手続き型としてのやりかたはある。(staticおじさんの再肯定)

Page 63

設計に失敗したらやり直しが利くように疎結合にしていくことも大事。

Page 64

(疎結合にする試みそのものが負債を生むこと往々にしてある。一足飛ばしで変更しすぎるのもよくない)

Page 65

現実を直視して分析し、自分たちに合った現実解を地道に適用していく

Page 66

どんなことにも長所と短所がある。世の中ではオブジェクト指向が先進的、手続き型はレガシーのような風潮もあるが、手続き型がベターと結論することもある。

Page 67

しかし「オブジェクト指向はわかりにくい」「インスタンスを作るとリファクタリングしにくい」といった風評はPhpStormなどのIDEで解決できる。ツールを知ることでサービスの成長改善につなげられる。

Page 68

良いツールを知らないと「リファクタリング対象をリストアップするときにgrepコマンドでテキスト検索するしかない」といった事態に陥る。(最初の問題提起)

Page 69

スタートアップ期のコードでは設計に悩み留まって製品をリリースできないことは賢明ではない。リリースされた後も機能追加に注力すべきだが、機能追加と既存機能の安定性を両立しようとすると、どこかで決断の時は来る。

Page 70

きちんと設計して未来に行こう