miau's blog?

CakePHPによる実践Webアプリケーション開発

Amazon.co.jp の紹介ページ(アソシエイトあり)へ
CakePHPによる実践Webアプリケーション開発 - Amazon.co.jp

出版社(MYCOM BOOKS)

先週くらい?に発売した CakePHP の実践本。近所の書店に売ってなかったんですが、会社の後輩が買ってたのでちょっと借りてぱら見しました。読んだ感想、メモ、内容に絡めた話とかを適当に。長いです。




■全体的な感想

・概要についてはあっさりした説明のみ。その代わりに実際の開発手順が具体的に書かれてるから、中級者向けっぽくて良い感じ。

・テストについては結構紙面を割いてるので、やったこと無い人にはいいかも+assetTags なんかにも触れられてるのはいいかも。core のテスト見ればこの辺の使い方はわかるんだけど、いつの間にか core のテストがリリース版に含まれなくなっちゃってるから、テストのサンプルが気軽に見れなくなっちゃってるんだよね・・・。

・細かいところでうまいこと共通化されてて勉強になる。「ここで Component 使うかー」とか思ったりとか。

■個別のメモ

・p29 XAMPP の環境ごとに環境設定を行う .bat(例だと env.bat)を設置するといいかも、という話。

set PATH=〜\xampp\php;%PATH%

みたいな。cake の実行時は自作の .bat を使ってるけど(これは次項あたりで)「PHP のパスは各自設定してね」としてあるので、こういうのを絡めてもいいかも。

・p44 IRC で聞いた「Bad Cake から Good Cake へ」という話。2008/10/25 開催の CakePHP カンファレンスで言ってたそうな。

・p88 .po の編集は具体的にはどうやってるんだろう?Poedit 使う人も入れば shell でやる人もいるらしい ↓ からこの辺の手順についても書かれてるともっとよかったような。

Copy/Cut/Paste:2つのpoファイルをマージするCakePHP Console Applicationをcommitした

・p93 1.2 用の core.po 日本語版、ちゃんとあったらしい。知らなかった。

CakePHP 1.2 日本語化

・p110 alphaNumeric について「可読文字かどうかを判断するので全角文字も通過してしまいます」との記述が。あれ?その名のとおりアルファベットと数字だけじゃなかったっけ?だから bake で作ったやつは日本語環境では使えないなーって話だったんだけど。

と、ソースを見ると、いつの間にか

$_this->regex = '/[^\\dA-Z]/i';



$_this->regex = '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/mu';

こんな感じで処理が変わってた。対応自体は [7320](2008/07/05)で、trunk に取り込まれたのが [7690](2008/10/02)と。時期からすると 1.2 RC3?ちょうど CakePHP から離れてた時期だけど、ちゃんと差分確認してないのはよくなかったな。

・p116 確認画面を DRY っぽく作成するための ConfirmComponent というのが紹介されていた。今回は別の方法で対応してしまったけど、こっちのほうがすっきり書けていい感じ。ただ、このコンポーネントを利用する画面ではある程度処理を統一できるようにしておかないと組み込めない。うまいこと抽象化してやる必要がある。

■その他思うところ

本に絡めて書いてるけど、書いておきたいだけって感じのこと。

○コーディングスタイル

コーディングスタイル(たとえば if のあとにスペースあるとかないとか)が統一されてないのがちょっと残念。その点でもお手本になるように、CakePHP の CodingStandards には従っておいて欲しかったかな。

○グローバル関数

basic.php で定義されている e() が使われているのも気になる。basic.php には

CakePHP グローバル関数 | Sun Limited Mt.

こんな感じで便利な関数がたくさん用意されているんだけど、確実に使わないほうがいいと思ってる関数が 2 つあって、それが e() と ife()。(ife() はこの本で見かけなかったけど、ついでに書いておく。)

e($text) は echo $text と同等の関数だけど、これを使わない理由は括弧のネストが深くなるから。せっかく echo は関数じゃなくて言語構造で定義されているんだから、これを殺すのは勿体ないでしょう。

<?php e($form->radio("Hoge.opt", array(0 => h($hoge), 1 => h($fuga)))); ?>

と書くと確かに文字数は減らせるけど、

<?php echo $form->radio("Hoge.opt", array(0 => h($hoge), 1 => h($fuga))); ?>

と書いて括弧をひとつでも減らしたほうが、見やすいし保守性も上がると思うんですけど。

もひとつ使わないほうがいいと思ってる ife($condition, $val1, $val2) は $condition ? $val1 : $val2 と同等っぽい関数。ただしこれも演算子じゃなくて関数になっちゃってるので、$val1 も $val2 も常に評価される。これが大問題。

この関数の phpDoc に書いてあるとおり、$var が未定義の場合、

$str = (isset($var) ? $var : 'default');

はエラーにならないけど、

$str = ife(isset($var), $var, 'default');

はエラーになってしまう。phpDoc には、「isset には使わないか、使うなら

$str = ife(isset($var), @$var, 'default');

みたいに @ 演算子を使え」みたいに書いてあるけど、使い方に制限がある劣化版関数なんて使わず、普通に三項演算子使いましょうよ。

ひとくくりにして悪いけど、PHP な人はこういうプログラミングの文化とか無視したことを平気でやってしまうところが嫌い。e() については「括弧は書かないほうが楽だけど、a b c, d みたいに書けちゃうと a(b(c, d)) なのか a(b(c), d) なのか判別しづらいから仕方なくつけてる」みたいな流れ(これが全てではないけれど)を知ってれば、こんな関数作らないだろうし。ife() についても「VB の IIf がこれと同じ問題を抱えていて、利用者から叩かれている」ことを知ってたら実装しようとは思わないでしょ。自分もまだ勉強が足りないと思うけど、それ以上に不勉強な香りがぷんぷんする。

■開発スタイルについて

同じ CakePHP を使うでも、スタイルがいくつもあって面白い。

○DB から作るとか、E-R図(ERD)から作るとか。

一般的な流れは
 (1) DB 設計ツールで ERD 作成
 (2) ERD から .sql を生成
 (3) .sql を実行して DB に反映(場合によっては (2)-(3) を一括でできたりも)
 (4) bake model とかでモデル(.php)に反映
だろうけど、この本では cake schema で .php の内容を DB に反映してる。ERD を作りたい場合は
 (1) cake schema generate で schema.php を作成
 (2) schema.php にテーブル定義を記述
 (3) cake schema run create/update で DB に反映
 (4) リバースエンジニアリング系のツールで ERD 作成
という流れになりそう。ソース管理上は後者のほうがいいけど、見やすい ERD を作れるのはたぶん前者?他にも DROP&CREATE できないシステムでは migration 使ったりするんだろうし。一長一短があって面白い。

○bake を使うか、使わないか

この本では bake を利用してるけど、最近は本当に雛形を作る目的でしか使ってない。テストコードが作られるのが便利だからやってるけど、あとはコピペ。本当は bake にどんどん手を入れて DRY にしていくのがいいんだろうな。

○Model から作りこんでいくか

この本ではまず画面から見れる状態にしてるけど、私は今回ボトムアップで進めてみた。Model&unit test を作って最後に Controler+View を作る流れ。動くものができちゃうと、unit test がおろそかになりがち(前回実際そうなってしまった)ので。

○ロケールを英語からやるか日本語からやるか

bake とか使うのであれば 英語→日本語 に訳すことになるけど、私が以前やったのは日本向けに作ったアプリを英語に詳しい担当者が英訳する 日本語→英語 という流れ。ここも体制によって色々違いそうな。

■まとめ

載ってることも勉強になったし、いろいろ考えるきっかけにもなったのでよかったです。
posted at 21:55:14 on 2009-04-16 by miau - Category: PHP No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。