2013年12月29日日曜日

Frameworkに依存しないcodeをどう書くか

元々はSymfonyのLTSが3年間というところから。
え〜、そんなに短いんだ。

フレームワーク(FW)よりビジネスのほうが長生きなので、フレームワークに依存しないコードが書きたいな、と。
もっともFWのサポート期間とはなんだろう?期間が過ぎても動くものは動いているし、PHPとかアップグレードしなければ(!)大丈夫なはずだし。脆弱性は最初から入ってないという仮定も必要だけど。
本来、プロジェクトで一番大事な部分はFWというより、それ以外の部分だと思う。それ以外の部分、と言うのはMVCでのモデルというところか。あるいはDDDで言うドメインというところか。

その部分がFWに依存しなければ、何も悩む必要はない、はず。

その部分をどう書くのかな、と最近考え始めた。

DDDとDCI

モデルやドメインといえばDDD。あるいはDCI。

ただDDDとかDCIなど、どうPHPコードに落とせばいいのだろうか?どう書くと、仕様が分かりやすい、テストしやすいコードになるのか。今のところさっぱり。

一方、今の仕事でDDDが必要になるほど複雑な仕様は無いという話もある。ということで、今後少しずつ勉強する予定。

FWとのインターフェース

モデル・ドメインを分離して書いても、フレームワークとのインターフェースは必要だ。ここがFW依存になるので、何かを挟む、ということになるのだろうか?

モデルを、ひとまずエンティティと考えれば、エンティティとフレームワークとの接点は、
*Persistence、
*Validation、
*Presentation、
それと、DBやHTMLフォームはテキストベースなので、エンティティとテキストの変換機能も必要かも。これぐらいあれば、簡単なことなら出来そう。

ということで、以上を抽象化したFWモデルを作っておけば、フレームワークが変わってもFWモデルを変えるだけで、ドメイン側には修正は必要ない、とか考えている。

ちょっと作ってみた

この1年以上PHP5.3で新フレームワークを開発していたら、受注した仕事がPHP5.2ばかり。ということで、PHP4時代から使っているライブラリで開発する羽目になった。

頭にきたので、FWモデルを書いてみた。
モデル内で、PHP4時代(コンストラクターがクラス名とかw)のオブジェクトをnewしまくりながら、ぱっと見は格好良いクラスに見せかける。もうテスタビリティとか無視してざざっと書いてみた。

時間がない中で、わけの分からんことを始めたので、方針はブレるしで、ひどいコードだが、考え方自体は気に入ってます。

ただ、このまま機能を追加してゆき、コードや複雑性が増えてゆき、結局FWモデル自体がフレームワーク化してしまうという未来が見えなくもないですが。

0 件のコメント: