[php]名前空間は百害あって一利なし!

徒然草2.0

ふん。千尋というのかい?贅沢な名だねぇ。今からおまえの名前は千だ。いいかい、千だよ。分かったら返事をするんだ、千!!

湯婆婆

namespace sen;

さて…なんとなく名前と言われて何の計画性もなく「千と千尋の神隠し」のサムネにしてみました。

いきなり極端で本題を言えば私はPHPの名前空間が嫌いです…というか分かりにくいです。

Javaやperlにもあって、その時は大変便利で必要だと思っていたのですが、いざphpの5.3.0…わりと最近になって実装されてWebフレームワークを使用していれば当たり前に出てくる概念であるし、自分の環境だけで解決するようなコードを書いていないのであれば、関数やクラス名の衝突を避けるためには大規模なWebシステムにおいて絶対に必要な仕組みであることは理解しています。

現代のプログラミング言語において外せないものなんでしょう。

…ただ、なんだか考え方がロジックに関係ない話なのにややこしい概念だと思います。

オブジェクト指向の利点を関数/メソッドの名前衝突を避けるため…などとプログラミング初心者に説明するシーンってあると思いますが(てか自分も長らくそんな感じで理解をしていました)…でも、それだと「名前空間でよくね?」ってことになるし、少なくともjavaはともかく現在のperlは知りませんがperl4の名前空間はオブジェクト指向の代用的な位置づけだった気がします。javaで言うところのオブジェクトと名前空間はまったく別のものだと捉えられますが、他の簡易言語だと曖昧にされている部分があって、これらをどこで使い分けるかなんて言葉で説明するものじゃあないよなぁ(ぼやき)このへんはうかつに説明を受けるのではなく(聞いても分からない)、何の言語でもいいから質の高いプロダクトでもWebフレームワークでもいいからコードを読んでみなよ、それで理解できるから…て話になります。

独りで開発をしているプロダクトなら、関数ないしはクラス名から機能を想起するような名称にして…衝突があったら名前空間で切り分ける(というか外部モジュールのみ名前空間で分ける)ただ自分が開発しているシステムがメインで外部モジュールがサブではないから、名前空間の内包関係を適切にやるべきだみたいな話になってくる。ある程度何を最終的に作って外部ベンダーが保守することが決まっている場合はソースを開いて絶望的になるダメコードでしょうが、独りで最終的に何をつくるわからないプロジェクト(そんな、プロジェクトあるんですか?って言われると困るんですが)においては、上記のほうが良い気がします。ラズパイのコードを慣れているgccで実装しましたのでIDE使っていません的なノリに近い感じです。外部ライブラリをを使う場合は、取り込んだ側の関数名を変更したらアップデートの時に苦労しますから、やはり長期的にメンテするシステムにおいて名前空間が必要で。基本的にはフレームワーク的というかこなれたよくある設計にしておくのが無難です。

しかし胃が痛い。javaみたいにIDE前提とした開発になるのか?名前空間という制約によってPHPのラフさが奪われていない?WordPressで名前空間を使うシーンはまったくないわけではないけど単純にフィルターフックやフィルターアクションを設置するような拡張だと拡張関数に接頭辞を入れるだけで対応しちゃうから名前空間なんて知らなくても困らないですし(てかバリバリwordpressを使っているphperは名前空間は知らないでしょうし、下手したらclassも知らないでしょう)、個人のプロダクトでも大抵は衝突しません(あくまで自分の環境の話)。年に1回衝突したら当たり!って感じです。CommonClassとかStyleClassとかgetSessionとかどこにでもありふれたようなクラス名や関数名がコンフリクトするだけ。

…であればあえて自分自身が主にいじるコードをあえて特異なものにすることで外部から取り込むモジュール名とぶつからないコード体系を気づいてしまえばいいのではないか?ということに堂々巡りになる…ひとりよがりのプロダクトで保守する人が苦しむ?それはひとりよがりのプロダクトが他人に保守を委ねるレベルまで適切に育ててから悩めばいい事案ではないか。そもそもPHPはラフな言語なんだし。仕様そのままにフレームワークに置き換えるリプレイスを図ってもいい。

※注意:別にオブジェクティブさ(コンポーネンティブさ)を犠牲にしろという話はしていない。すべてオブジェクティブにしろというのが極端で、局所的にオブジェクティブにすることを否定はしない(むしろ、そのようにすべきところでは、Componentiveな設計を推奨する)ただそれはComponentiveであってObjectiveではない(これには説明が必要そうだが、今回はパス)。

言語にとって絶対必要だけど嫌いなんで不要…なんて言っているならば世間様から老害プギャーと言われて世捨て人として生きていくしかない。新しい技術ってなんか前よりちょっと何かがよくなったことの積み重ね(技術は日進月歩で当たり前なんだけど)なのだけど、たぶんもっと自分が年をとって知識の吸収力に限界を感じると言うか、目まぐるしい変化の中で小賢しい変更って虚しいなあと思ってくるのかと思っています。

(追伸)jsのグルーバル変数にアンダーバーをつけてプライベートな変数として、状態管理変数であること周囲に分かるようにして関数でラップすることを明示しておけば、保守する人も困らないよね?的なのりでいいのでは?と現代フロントエンドエンジニアの作法なんてことを無視して作ったほうがいいやと割り切り始めているこの頃。老害?老兵は、静かに戦場を去りたい。

コメント

タイトルとURLをコピーしました