Laravel4のstaticコールについてのやりとり

Laravel4はスタティック地獄じゃないよという英語のブログエントリに、各方面からPHPerが集まってまいりました。(トイレ中に話が進んでいたので自分がまとめて読む用/漏れてるのを追加してもらえると作成者が喜びます)
3
Hirohisa Kawase @HiroKws

頑固プログラマーとLaravel開発者のTaylor氏が、討論しています。というより、頑固だから、Facadeでスタティックメソッドも実はオブジェクト生成しているのを受け入れがたいよう。 要は、staticに見えてしまうからなんでしょう。

2013-07-24 07:49:24
Masao Maeda @brtriver

マジックメソッドはできるだけ使いたく無い派 / “Laravel 4 Uses Lots of Static, Not True.” http://t.co/MocYqyb4Uh

2013-07-24 10:16:06
Masashi Shinbara @shin1x1

まあ面白いこと考えるよね / “Laravel 4 Uses Lots of Static, Not True.” http://t.co/XZTHB5CMKE

2013-07-24 10:26:04
Masashi Shinbara @shin1x1

@tanakahisateru つ RT @shin1x1: まあ面白いこと考えるよね / “Laravel 4 Uses Lots of Static, Not True.” http://t.co/XZTHB5CMKE

2013-07-24 10:27:43
田中ひさてる @tanakahisateru

@shin1x1 読んだ。やはり魔法少女ララベル。ところでどうやってモック差し込むのかわからなかったけど、ようするにインスタンス見つけてそっち使えということなのかなー

2013-07-24 10:42:49
cakephper ichikawa @cakephper

Static callを窓口にしてるだけだから、laravel4がstatic地獄みたいな印象を持つのは間違いという記事。 マジックメソッド__callStatic()を使ってそれっぽく見せてるだけ。 / “Laravel 4 U…” http://t.co/CELEUeaHuW

2013-07-24 10:49:15
Masashi Shinbara @shin1x1

@tanakahisateru モック差し込むなら、テスト時はこれ書き換えることになるのかな。 https://t.co/xMPD5XIEcf

2013-07-24 10:51:51
Hidenori Goto | COO and CTO at KabuK Style @hidenorigoto

@cakephper 「それっぽく見せてるだけ」ではないと思います。内部ではstaticではないオブジェクトで構成されている部分もありますが、アプリケーションではstaticに呼び出す以外に機能させる方法が無いと認識しています。

2013-07-24 10:55:42
田中ひさてる @tanakahisateru

@shin1x1 これ指してるのがクラス名だから、テストケースごとに別々なクラスファイルがいっぱい要りそうな...

2013-07-24 10:59:46
Masashi Shinbara @shin1x1

@tanakahisateru 実はモック用クラスがフレームワークに用意されているとか。で、テストケースで生成したモックのインスタンスをモック用クラスに差し込むとそっちを呼んでくれるとか。(ソース見てないけど)

2013-07-24 11:03:41
Hirohisa Kawase @HiroKws

Laravel4のコアのstaticが裏でインスタンス化されているということが、日英で今日は良くツイートされています。 staticメソッドのほうが、読み書きしやすが、テストはできないという点を解決するための方策です。 ですから、読みやすいと思わない人には、役に立ちません。

2013-07-24 11:25:29
Hirohisa Kawase @HiroKws

Laravelのファサードの仕組みは、読み書きしやすさとテスタビリティーの両立を目指しています。 コアクラスに対し、依存注入を行わなくても、CoreClass::shouldReceive('メソッド名')で、Mockeryのモックが用意されます。

2013-07-24 11:28:19
Hirohisa Kawase @HiroKws

ドキュメントにも軽く書かれ、日本語のブログ記事も既にいくつか存在し、テスト本と構造本でも取り上げられていますが、英語のブログ記事をきっかけに、今日は話題として取り上げられているようです。

2013-07-24 11:30:24
Hidenori Goto | COO and CTO at KabuK Style @hidenorigoto

@HiroKws 目指す意図は理解します。ですが、モックライブラリにMockeryしか使えない点、そのテストを動作させるためにLaravelコアに依存してしまう点など、標準で汎用性のある方法にはなっていないと私は認識しています。

2013-07-24 11:36:28
Hirohisa Kawase @HiroKws

@hidenorigoto その通りです。:D フレームワークですから。結局は好みなのです。 全てのフレームワークが、汎用性を目指しているわけでないでしょうし、少なくともLaravelの人気は、お手軽さがあってのことですしね。 依存注入でコーディングしてもいいわけですし。

2013-07-24 11:50:04
田中ひさてる @tanakahisateru

@shin1x1 @hidenorigoto @kenji_s みなさんありがとうございますー。それにしてもインスタンスまでが遠いというか、モックごときにコンテナ全体を巻き込む感じというか...Laravel難しい子

2013-07-24 11:51:10
Hidenori Goto | COO and CTO at KabuK Style @hidenorigoto

@tanakahisateru コンテナで管理されているオブジェクトで、プロダクションコード内でstaticコールしているやつをモックする場合の機能ですよね。

2013-07-24 11:53:24
田中ひさてる @tanakahisateru

よく考えたらこれすごい状況なんじゃないかと… https://t.co/v3djM1zcDf

2013-07-24 11:55:40
Hirohisa Kawase @HiroKws

20年くらい前でも、UIに関しては、難しさはユーザーに隠しなさい、というのはよく知られていました。 便利なライブラリー、いくつかのプログラムパターンは、内部構造を利用者から隠す目的です。 そうしたアイデアをフレームワークであるLaravelは取り入れているだけです。

2013-07-24 12:02:17
田中ひさてる @tanakahisateru

@hidenorigoto コンテナでFacadeと対応してるDB::とかの単位でのみ、コールを騙せるという感じなのは見えました。

2013-07-24 12:02:56
Hirohisa Kawase @HiroKws

開発者のTaylorは、Symfonyのミートアップでもレクチャーしてますし、そもそもSymfonyとは方向性が違います。ですから、SymfonyからLaravelへの釣り記事は少ないです。 同じ方向性ではありませんが、お手軽さが同程度なのかCI=>Laravelは多いです。

2013-07-24 12:06:44
田中ひさてる @tanakahisateru

@hidenorigoto ここだけの話(になってないけど)、スタティックコールが気になる点は、教育的にどうかというところだったりします。Laravel本体は中でいろいろ工夫してても、そこまで見てないユーザは、スタティックで設計するのはアリアリなんだって思ってしまわないかなーと。

2013-07-24 12:07:08
Hirohisa Kawase @HiroKws

ちなみに、Laravelに関してずらずら、ツイートしているのは、Laravelで検索した時に、別の見方もあることを示すためにやっていることで、特定の意見の反論を目的としていません。 フレームワーク選定中の人の、頭を一方に向いてしまうのを中立へリセットするためです。

2013-07-24 12:10:42