ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    レガシーなPHPアプリをCodeIgniterへ移植

    このエントリーを含むはてなブックマーク はてなブックマーク - レガシーなPHPアプリをCodeIgniterへ移植 あとで読む
    既存のPHPアプリケーションを、CodeIgniterへ移植するのに、うまいやり方があるかどうか検討してみた。

    ●MVCでリファクタリング
    オープンソースで提供されているPHPのWebアプリケーションは、たくさんある。

    MVC構造になっていないWebアプリ(PHPコードの中に、HTMLコードが入ってる=ロジックとデザインが混在)のデザインをカスタマイズするのは、該当するHTML部分を探すのが、面倒だと感じるときがある。
    そこで、MVC構造になっていないレガシーなPHPコードを、CodeIgniterへ移植して、MVC構造へとリファクタリングすれば、コードの改変が容易になり、便利になるだろうと思った。

    問題は、CodeIgniterへの移植が、簡単にできるかどうかだ。

    ●レガシーなコードの特徴
    MVC構造になっていないPHPのWebアプリの特徴は、以下のようであった。

    ・HTMLを吐き出すレンダリング処理が、関数化されている。
    →関数から、HTML部分を分離して、ビューにする。
    →レンダリング処理は、ビューを呼び出す形に改める。

    ・HTTPメソッドとして、GETリクエストが多様されている。
    ・GETリクエストのクエリーストリング(?aaa=bbbのような文字列)で、ディスパッチ(処理の割り振り)を決定する。
    →CodeIgniterは、GETリクエストでもディスパッチできるけど、「/」で区切られたパス情報を基にしたい。
    →$_GETでルーティングしている部分を、CodeIgniterのコントローラーに置く。

    以上のことから、レガシーなPHPコードをCodeIgniterへ移植するには、
    ・レンダリング処理の変更=HTML部分をビューファイルに移す。
    ・ルーティング処理の変更=ディスパッチ機能をコントローラーに移す。
    を基本にすればOK?

    ●移植の進捗管理
    移植作業を行なっているとき、どこまで作業が完了したか管理したい。
    例えば、関数が100個あったとして、30個まで移植を終えたら、目印を付けるなりして、終わった分と未着手分の違いが分かるようにしたい。

    NetBeansを使えば、コメントで「@ToDo」と書いておくことにより、未着手のコードに目印を付けられるので、とりあえずこれでもOK。
    =関数の宣言部分(function ~)の直前に「/* @ToDo convert */」とかの文字列を挿入すればOK。

    ●PHPコードの静的解析
    関数がたくさんあると、全体を把握するだけでも大変だ。
    ソースコードを解析するツールを補助として活用したい。

    PHPのプロファイラー「XHProf」の使い方 - 浜村拓夫の世界

    Doxygen/Graphvizでドキュメントを自動生成する - パソコンのトラブル
    最近のDoxygenは、C言語だけじゃなくて、PHPにも対応している。

    PSAT(the PHP static analysis tool)
    PSATというツールも紹介されていた。

    ●テストフレームワーク
    PHPUnitとか、全然使ってない。
    コードを書いてる最中に、適当な値をハードコーディングして、デバッガーでチェック=原始的な方法で検査!(笑)
    エラー処理は、エラーを吐き出さないように「@」で封印とか…。(違)
    後々大変なバグフィックスが発生したときの備えとして、再現性のあるテストを実施するために、ちゃんとテストコードを書かなきゃいけないんだろうな。

    CodeIgniterでPHPUnitテスト :: handsOut.jp

    PHPUnitの学習 - e2esound.com業務日誌

    CodeIgniter ユーザガイド - ユニットテストクラス

    Seleniumを考えた人はスゴイ!

    Seleniumでブラウザを自動的に操作する方法 - 浜村拓夫の世界

    ブラウザを選ばずWebテストを自動化するSelenium (1/3) - @IT

    第5回 Seleniumでのテストの記述方法 - テスト講座

    ●継続的インテグレーション
    最近読んだブログ記事で「Jenkins」というツールを活用して、PHPコードをリファクタリングする方法が紹介されていた。
    (「Jenkins」と言えば、北朝鮮に逃亡していたアメリカ兵のジェンキンスさんを連想したが、それは違う!)

    告白告白
    チャールズ・R・ジェンキンス 伊藤 真

    角川書店 2005-10-08

    Amazonで詳しく見る
    by G-Tools


    PHPでTDD&CIワークショップ、Jenkins + PHP の各種プラグインパート資料

    概要としては、Jenkins を使って PHP のウンコレガシーなコードをいかに綺麗にして行くかということを説明する。

    いれているツールは、あとでも説明するが以下の通り
    - Phing (Java の Apache Ant というビルドツールの PHP クローン)
    - PHP_Depend (実は今回はこれの説明はしないが、下で説明するPHPMDが依存してるので。パッケージ間の依存性とかを調べられるツール)
    - PHPMD (PHPのコードのクソいけてない部分を探すツール)
    - PHPCPD (PHPのコードのアホコピペ重複部分を探すツール)
    - PHPDocumentor (コメントからPHPDocを出力するためのツール)
    - PHPUnit (言わずとしれた PHP のテストツール)



    ダメだ何をやっているのか、サッパリ分からん><
    っていうか、Jenkinsって何さ?

    Jenkinsについて - Nutex-wiki

    Jenkinsとは、継続的インテグレーション(Continuous Integration、CIと良く略されます)を行うためのツールです。
    例えばソースをSVNにコミットするだけで勝手にツールがテストしてくれた上にそのレポートまで作ってくれる感じ?

    かつてはHudsonと呼ばれていました。
    日本人の開発者がはじめた世界的なオープンソースプロジェクトでもあります。

    phpでJenkinsを使う場合、
    PHPUnitなどのテスティングフレームワークと組み合わせて使用します。

    ・PHPUnitを使うなら、Jenkinsも使った方が良い気がする
    ・自動単体テストとその反復が合わさり最強に見える



    Jenkinsとは? - Jenkins Wiki

    Jenkinsは、ソフトウェアのビルドやcronで起動するジョブなどの繰り返しのジョブの実行を監視します。これらのうち、Jenkinsは現在次の2つのジョブに重点を置いています。

    - 継続的な、ソフトウェアプロジェクトのビルドとテスト: つまり、CruiseControlやDamageControlが行うこと。 一言で言えば、Jenkinsは、容易ないわゆる「継続インテグレーションシステム」を提供し、開発者が変更をプロジェクトに統合でき、ユーザーがより新しいビルドを容易に取得できるようにします。自動化された継続的なビルドは、生産性を向上させます。

    - 外部で起動するジョブの実行監視: cronによるジョブやprocmailのジョブで、リモートマシンで動作するものも含みます。例えばcronについて言えば、出力をキャプチャーした定期的なメールだけ受信し、こつこつとそれを見ます。おかしくなっていることに気がつくかどうかは、すべてあなた次第です。Jenkinsは出力を保存し、 いつおかしくなったのか容易に把握することができるようになります。



    Symfony2でJenkinsを使ってCI - symfonyで開発日記

    Symfony2のプロジェクトを継続的インテグレーションツールであるJenkinsをつかって管理してみたいと思います。



    Jenkinsは、「継続的インテグレーション」を行なうためのツールと。
    インテグレーションは、文字通りには「統合」って意味だけど、「継続的インテグレーション」って何なの?

    はてなキーワード > 継続的インテグレーション

    概要
    継続的インテグレーションとは、ソフトウェアの品質改善・納期短縮のためのソフトウェア・エンジニアリングの習慣の集合である。その原則は、開発の連続的な全行程が終わってから品質管理を行うという古い慣行をやめ、成果物の諸小部分に対して頻繁に品質管理を行うことである。

    理論
    修正に着手するとき、開発者は動いている現在のリポジトリのコピーをローカルに取る。修正されたコードが他の開発者によってリポジトリにコミットされた場合、このローカルのコピーは徐々にリポジトリのコードを反映しなくなっていく。開発者がリポジトリにコードをコミットする時、彼らは、まず、リポジトリ内の修正をローカルのコードに反映させるために、自らのローカルのコードを最新のものにしなければならない。リポジトリ内の修正が多ければ多いほど、より多くの仕事を開発者は自らの修正をコミットする前に行わなければならない。

    そのうち、リポジトリは開発者のローカルのコピーとはあまりにかけ離れた物になり、彼らは統合地獄(integration hell)と呼ばれる状態に陥る。最悪の場合、開発者による修正を放棄し、仕事をやり直すことになる。

    継続的インテグレーションは、"統合地獄"という陥穽を避けるために、統合を早期に、頻繁に行う習慣である。究極の目標はやり直しを減らす。それによって経費を減らし、納期を短縮する。



    複数の開発者で、最新の状態を共有する=継続的統合と。
    逆に言えば、一人でやるなら要らん心配だわな。

    ●PHPMD
    Jenkinsはともかく、PHPMDってのが気になった。

    PHPMD(PHP Mess Detector) を試してみた - renoivのブログ

    ZendStudioに同梱されている「ZendCodeAnalyzer」というツールを業務で使ってたんですが,
    残念ながらZend Studio 7 評価版で確認したところ含まれていないようです。

    そこで代わりになるものを探してたらありました,PHP Mess Detector です。
    PHPMDとは,JavaでいうところのPMDで,以下のような問題を見つけてくれます。
    - バグの可能性
    - 準最適なコード
    - 複雑な式
    - 未使用パラメータ,メソッド,プロパティ



    しかし、アレだ。LLなスクリプト言語なのに「ビルド」とかって、エンタープライズの流儀に侵食されつつある。
    Javaで食ってたSIerな人が、PHPerに鞍替えしてるとか?

    ●イスラエルのZend
    Zendは、パレスチナ人を殺して国土と財産を奪い取っているイスラエルの企業だから、間接的ではあるが、PHPを使うほどに不幸な人の増加を助長している。
    イスラエルの功罪を、PHPと結び付けてしまったら、とても使える代物ではない。
    IntelのCPUもOUTだなw

    イスラエル―ユダヤパワーの源泉 (新潮新書)イスラエル―ユダヤパワーの源泉 (新潮新書)
    三井 美奈

    新潮社 2010-09

    Amazonで詳しく見る
    by G-Tools


    Zendの関与を意図的に忘れることによってようやく使えているPHPが、Zend抜きでもクソになるならさすがに引くわ。
    PHPの開発手法が手軽なものではなく、重量級になったら、使う利点が薄まる。

    「簡単にできることを複雑にやる必要はない。」

    Python3が普及したら、PHPの資産をPythonに移植すればOK。
    =人生は有限だから、simple is bestで行こう。
    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/658-9ca19cbd

    FC2Ad