Page 1
公開版
staticおじさんになろう
War on Dynamics
カンファレンス関西
2017-07-15 PHP 2017 LT
公開日:
by USAMI Kenta @tadsan
公開版
staticおじさんになろう
War on Dynamics
カンファレンス関西
2017-07-15 PHP 2017 LT
このスライドは2017年7月15日に 開催されたPHPカンファレンス関 西2017で当日募集された本篇LT にて話したスライドに調整および 加筆を施したものです。口頭で補 足したもの、文字だけではわかり にくいものを補ったほか、後半部
分に文章の追加があります。
お前誰よ
うさみけんた (@tadsan) / Zonu.EXE
そろそろ10年になる Webサービスを開発
注意
このLTは特定のアーキ
テクチャの導入を
勧誘するものではなく、 その是非については自分
で判断してください。
対処が難しかった事例を
寄せ集めただけで、
特定の実装の話ではない
オチは特にない
あと特定の会社の
回し者ではない
さて
あるメソッドの
API(引数・返り値)を 変更したいとします
リファクタリング
できますか?
そのメソッドの
呼び出し箇所を列挙
できますか?
そうですね
git grep '\->setName('
本当にそれで 全部ですか?
$obj = new FugaClass; $f = [$obj, 'setName']; call_user_func($f, $n);
🙃
$obj = new FugaClass;
$obj->setName($v);
//
↑探したいのはこっち
$obj2 = new HogeClass; $obj->setName($x, $y);
// ↑同名の関係ないメソッド
誤爆
結果を絞ろう
# new setName
の次行に がある前提
git grep -a1 'new FugaClass' |
grep '\->setName('
これで完璧
//
DIコンテナ
$app['fuga']->setName($n);
🙃
こんなことが続くと
人間は無気力になる
(学習性無力感)
(そのあとも動的な性質 による悩みは絶えない)
ソリューション
new staticおじさんedition
class FugaClass { private $name;
private function __construct(){}
public static function setName( ) {
FugaClass $that, $name
$that->name = $name;
}
// ...
git grep
'FugaClass::setName'
これでいいのか
😇
書きにくくなった
だけでは…
staticおじさんをやめよう
Beat “evil” static methods
カンファレンス関西
2017-07-15 PHP 2017 LT
特効薬
Photoshop
PhpStorm
FindUsage
と
Refactor
機能
最強説
型
型が推測できなく なるような複雑な
書き方をしない
型を確定できないと ころは地道にPHPDoc
で型をつけていく
http://nico.ms/kn1774
これだけ覚えて帰ってね
タグ名 意味 例
@param 引数を定義
@param int $n1
@return 返り値を定義
@return int[]
@var 変数/プロパティを定義
@var int
@property マジックプロパティを定義
@property int $id
DI/IoC
コンテナは?
(日本語での説明、ただしサンプルコードが旧形式)
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
某社の回し者ではないの で、PhpStorm以外に良 いツールあれば知りたい!
そもそも
staticおじさんになっ た理由はコレジャナイ
なれる!staticおじさん
I wanna be a clever static uncle
カンファレンス関西
2017-07-15 PHP 2017 LT
Webサービスを作る人間
=
オブジェクト指向の達人
ではない
素朴に作られたクラス は余計な状態を抱えこ んで渾沌が肥大化する
多すぎる引数…
謎のメソッド…
不要なプロパティ…
それでもコードは動き、 今の自分たちを生かし てくれてる (=収益源)
作られた当時は
理由があった
(たぶん)
動いてきたコードへの
リスペクトを
見失ってはならない
それでもサービスを成長さ
せる足枷にならないように リファクタリングしていく
混沌としたクラスから
staticおじさんに
身を堕としたのは
カオスを収束させるため
カオスを収束させた後な
らば、未来に向かって
「あるべき姿」を再定義
することができる
カオスを収束させずに夢を見 てアーキテクチャの再設計を 試みると理想と現実のギャッ プと物量に圧し潰されて氏ぬ
重要な事実:
オブジェクト指向を多少かじっ た程度では、ベターなOO設計 ができる大先生にはなれない
設計のエキスパートではなく ても多くのパタンに触れてい けば現在の身のたけに合った ものを選びとることはできる
オブジェクト指向プログラミングに
基いたリファクタリングが常に
最適解ではなくて、手続き型なら
手続き型としてのやりかたはある。
(staticおじさんの再肯定)
設計に失敗したらやり直 しが利くように疎結合に
していくことも大事。
(疎結合にする試みそのものが
負債を生むこと往々にしてある。 一足飛ばしで変更しすぎるのもよ
くない)
現実を直視して分析し、 自分たちに合った現実解
を地道に適用していく
どんなことにも長所と短所がある。 世の中ではオブジェクト指向が先 進的、手続き型はレガシーのよう な風潮もあるが、手続き型がベター
と結論することもある。
しかし「オブジェクト指向はわかり にくい」「インスタンスを作るとリ ファクタリングしにくい」といった 風評はPhpStormなどのIDEで解決 できる。ツールを知ることでサー ビスの成長改善につなげられる。
良いツールを知らないと「リ ファクタリング対象をリスト アップするときにgrepコマン ドでテキスト検索するしかな
い」といった事態に陥る。
(最初の問題提起)
スタートアップ期のコードでは設 計に悩み留まって製品をリリース できないことは賢明ではない。リ リースされた後も機能追加に注力 すべきだが、機能追加と既存機能 の安定性を両立しようとすると、
どこかで決断の時は来る。
きちんと設計して
未来に行こう