リファクタリング

つい最近 本家のblogにsymfonyでのリファクタリング方法についての実例が5日間にわたって紹介されました。もちろんsymfonyを使っている方はもちろん参考になりますし、ファビアンが言いたいことなんかはsymfonyに関係なくリファクタリングのポイントでまとめられています。

ref:
http://www.symfony-project.org/blog/2008/09/18/call-the-expert-a-refactoring-story-part-1-5
http://www.symfony-project.org/blog/2008/09/19/call-the-expert-a-refactoring-story-part-2-5
http://www.symfony-project.org/blog/2008/09/20/call-the-expert-a-refactoring-story-part-3-5
http://www.symfony-project.org/blog/2008/09/21/call-the-expert-a-refactoring-story-part-4-5
http://www.symfony-project.org/blog/2008/09/22/call-the-expert-a-refactoring-story-part-5-5

メンテナンス性チーム開発で必要となるポイントを指摘しています。
symfonyを知っていればそれほど難しい内容ではありませんがファビアンの意見を簡単にまとめてみました。
それに、設計勉強会にも都合により出れないのでここで発表代わりに。。(苦笑

1日目

2日目

  • リファクタリングリングするとプログラムの動き変わるかもしれないよね?
    • sfTestBrowserでブラウザをシミュレーションしてテストした方がいいよ
    • sfTestBrowserの使い方

3日目

  • コントローラー(actionクラス)のリファクタリング
    • コントローラーはフロー部分の担当。それ以外は書くな
      • Criteriaなんてactionクラスに入れちゃ駄目。それはモデルの担当
        • PropelだったらPeerクラスに書くのが正解
      • Userクラスの属性はmyUserクラスでちゃんとラッパすること
        • $this->getUser()->getAttribute('id') と $this->getUser()->getId() どっちが使いやすい?
      • メソッド名はよーく考えて命名することが重要
        • 正しく命名できればドキュメントがなくても何をするメソッドか解るから

4日目

  • 新しいFormフレームワークの使いかた
    • Formフレームワークも小さなMVC構造。Controller部分(sfForm),Model部分(sfValidator),View部分(sfWidget)で構成
      • だからアクションクラスからフォーム部分の処理を完全に分離できるよ
      • たとえば受け取った値を加工してupdateしたいときは updateObjectメソッドで $this->ogjectに変更を加えるのがお作法

5日目

  • Viewに関する部分は極力コントローラーに書くな
<?php use_stylesheet('homepage.css'); ?>

順番を指定したいなら第2引数でfirst, lastが指定可

<?php use_javascript('homopage.js'); ?> 

順番を(ry

    • タイトルを動的に変更したいならレイアウトにinclude_slot('title')を記述。テンプレート側からslot('title', 'my page')で指定すればよい
  • ショートカットメソッドで見通しをよくする
    • bindAndSave()など

まとめ

結果としてコントローラーのコーディング量を減らすことができ、見通しがよくなったよ
リファクタリングの最終目標はなんであれ以下の3つ

  1. よりメンテナンスが容易になるように考慮したコードにすること
  2. 拡張性が優れたコードにすること
  3. 既存のコードをうまく再利用することで新しい機能を書くためのコーディング量を減らすこと

わざわざこういう記事があることからもわかるように、
symfony(他のフレームワークの然り)を使ったからといってすぐにメンテナンス性がよいアプリケーションはできません。
プログラマがしっかりと設計理念を理解しておくことが必要ということですね。

にしても、symfonyってAskeetにしてもそうですがドキュメントの作り方が巧みだなと思う。