2013年2月22日金曜日

CakePHPのSet::apply / FWを使った時の可読性

久々の記事が、割と具体的な内容ですね。
今やってる仕事が仕事で、どこまで書いていいかわからないので
こういう小ネタで攻めることにしました。

さて、最近はCakePHPを使うことが多いので、その話題。
CakePHP2系のお話です。(たぶん1.3でも一緒だと思う)

hogesってテーブルに、何らかの値が入ってて
それをまとめてfindAllしてきた後

  • 特定のカラムの合計値がほしい
  • 最大値がほしい

ってことはよくあって、
そのたびにわざわざCOUNTやらMAXやらのクエリ投げるのも非効率じゃないですか。

そういう時に、PHP慣れててCake慣れてない人とかだと

$hoges = $this->Hoge->find('all');
$fugas = array();
foreach ($hoges as $hoge) {
    $fugas[] = $hoge['Hoge']['fuga'];
}

$max = max($fugas);
$sum = array_sum($fugas);

って書く人が居るんですよ。

後、多言語から来た人で、PHPのリファレンスをあんまり読まない人が、
maxとかarray_sumとか使わずに、foreachの中で計算したりする事もあったりして
後で読むときに非常に面倒なコードになっていたりすることもあります。

Cakeには便利なSetってコアライブラリがるので

$hoges = $this->Hoge->find('all');
$max = Set::apply('/Hoge/fuga', $hoges, 'max');
$sum = Set::apply('/Hoge/fuga', $hoges, 'array_sum');

って感じで、スマートに記述できます。
※Cake2.2以降だと、SetはHashってライブラリに置き換えられているので、そっち使ってくださいね。

詳細な使い方は公式を参照してください。
http://book.cakephp.org/2.0/ja/core-utility-libraries/set.html#Set::apply

Cakeの場合、Web系で必要になる煩雑になりがちな処理は
だいたい、コアライブラリにあるので、
自作する前にコアライブラリ探しましょう。
(文字列操作とか…ネ)

-----

コアライブラリを使わない結果、
非常に多数のネストが発生した上行数が多く、読みづらいコード
とかいうものを見てしまったので、こんな記事を書きました。

Set::applyを使ったところで、
コアライブラリの中で結構な量の処理が走るハズなので、
計算量的に得をするとか、メモリ使用量が少ない、とか、そういうことは無いと思います。
(実測までしてないケド)

私は、シビアにパフォーマンスを求められている環境でない限り、
実行速度よりも可読性を優先してコードを書くべきだと思っています。

パフォーマンスが必要になれば、後で、リファクタリングすればよいだけです。

可読性の高いコードの可読性を低く変えるのは簡単ですが、
可読性の低いコードの可読性を高くするのは大変デショ?


では、この場合、最初に紹介した、foreachとPHPの配列操作関数を使うのと、
CakePHPのAPIを利用したコード、
どちらのほうが可読性が高いと言えるのでしょうか?

確かに、CakePHPを知っている人であれば、後者のコードはすぐにわかりますが、
慣れていない人が見る場合前者のほうがわかりやすい可能性だってありますよね…。

※そもそも、コアライブラリにある物を書き直す=車輪の再発明ジャンって話もありますが。


ここで、CakePHP…というか、FWとは、言語をさらに抽象化する物ととらえます。

イメージ的には

下層 <-     -> 上層
機械語 ->C言語 -> PHP -> CakePHP

って感じで、よりWebに特化したAPIのレイヤーをPHPにかぶせているイメージです。


FWを使う、ということは、FWによりPHPを抽象化するということです。
であれば、無理に下層のレイヤーを触ること無く記述したほうが自然ではないでしょうか?

また、上層のレイヤーで記述できる物は極力上層レイヤーで書く、というルールを徹底すると、
「下層レイヤーの記述がある=上層レイヤーでは足りない何かを行うためのコード」
という意図がコードに生まれる、という利点もあります。

ですので、私は、FWの用意するライブラリで記述できる内容であれば、
なるべく、FWが用意した物を使ったほうが良いと思います。

0 件のコメント:

コメントを投稿