フォーチュンサモナーズ
«前の日記(2008-02-17) 最新 次の日記(2008-02-19)» 編集

Don'tStopMusic

2003|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|02|03|04|05|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|09|10|

カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年

知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。


2008-02-18

_ [rails][OpenFL] OpenFL ことオープンソース版 Fastladder のコードを読む その1 このエントリーを含むブックマーク

先日公開されたオープンソース版 Fastladder を遅ればせながらダウンロードしてみました。オープンソース版は Rails 製。せっかくなのでコードを読んでみることにします。

ダウンロードする

Fastladder Open Source / Free Downloadのページから、Unix / Linux 版をダウンロードします。

$ wget http://fastladder.org/downloads/fastladder-0.0.2-src.tar.gz
$ tar fxz fastladder-0.0.2-src.tar.gz
$ cd fastladder

依存ライブラリを調べる

INSTALL.txt に書いてある通りです。

  • rFeedFinder: RSS autodiscovery や ATOM autodiscovery してフィードを探してくれます。hpricothtmlentities を必要とします。
  • Feed Normalizer: RSS パーサ。Ruby 標準添付の rss と gem で配布されてる simple-rss のラッパとして働きます。RSS 0.9/1.0/2.0 のときは rss、ATOM のときは simple-rss を使うようですね。どっちのパーサを使っても返すオブジェクトは統一されるので、フィードのフォーマットの違いを気にせずに済むと。simple-rss と hpricot を必要とします。
  • opml: REXML ラッパの OPML パーサ。rubyforge のプロジェクトページはなくなっていて、gem ファイルだけ存在しているという微妙な状態のライブラリです。下手するとそのうちなくなるんじゃないかなあ。
  • mongrel: 高速ウェブサーバ。先行き不安ですが、何だかんだいって ML には投稿しているので大丈夫かも知れません。
  • sqlite3-ruby: sqlite3 バインディングです。

プラグインを調べる

どんなプラグインを使っているかを調べるため、vendor/plugins を見ます。

$ ls vendor/plugins
restful_authentication

restful_authentication は Rails 2.0 でデファクトスタンダードな認証プラグインです。使っているのはこれのみのようですね。

LoC を調べる

とりあえずアプリの規模を知るために LoC を調べます。rake のタスクにコードのメトリクスを得る stats というのがあります。

$ rake stats
(in /home/date/tmp/fastladder)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |  1015 |   886 |      22 |      73 |   3 |    10 |
| Helpers              |    90 |    85 |       0 |       9 |   0 |     7 |
| Models               |   282 |   232 |       8 |      29 |   3 |     6 |
| Libraries            |   602 |   484 |       2 |      37 |  18 |    11 |
| Integration tests    |     0 |     0 |       0 |       0 |   0 |     0 |
| Functional tests     |   366 |   274 |      28 |      57 |   2 |     2 |
| Unit tests           |   171 |   133 |       8 |      21 |   2 |     4 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |  2526 |  2094 |      68 |     226 |   3 |     7 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 1687     Test LOC: 407     Code to Test Ratio: 1:0.2

Code LOC: 1687 なので、サーバ側は結構コンパクトなコードだと言えます。余り時間を書けずに読めそうですね。

他の値も少し見てみます。全体の規模からするとコントローラのクラス数が多いですね。画面数あるいは機能数が多いのかもしれません。コントローラとモデルの Methods/Class が 3 と少なめですから、(コード的に)軽量な画面や機能が多いか細かく分割していると考えられます。統合テストが 0 ですが、Code to Test Ratio は 1:0.2 なので TDD でない Rails アプリでは普通くらいでしょうか。まあ、この辺のメトリクスの値は多いから良いとか悪いとかではないので、傾向が多少分かるくらいの話ですが。

参考までに他の Rails アプリの stats の結果を挙げておきます。

redMine 0.6.3 の場合
(in /home/date/tmp/redmine-0.6.3)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |  3888 |  2814 |      36 |     242 |   6 |     9 |
| Helpers              |  1850 |  1026 |       2 |      84 |  42 |    10 |
| Models               |  3748 |  2293 |      54 |     276 |   5 |     6 |
| Libraries            |  7111 |  4838 |      39 |     313 |   8 |    13 |
| APIs                 |    25 |     8 |       1 |       0 |   0 |     0 |
| Integration tests    |   268 |   166 |       4 |      10 |   2 |    14 |
| Functional tests     |  1686 |  1140 |      40 |     163 |   4 |     4 |
| Unit tests           |  1938 |  1125 |      32 |     149 |   4 |     5 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                | 20514 | 13410 |     208 |    1237 |   5 |     8 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 10979     Test LOC: 2431     Code to Test Ratio: 1:0.2

多機能なだけあって Code LOC は 10000 超えです。ライブラリが約半分を占めていますが、サードパーティー製で大きいのは SVG グラフくらいなのでそれを除いても 10000 前後でしょう。モデルがやたら多いですね。ヘルパーの Methods/Class が 42 なので、これは明らかに詰め込みすぎ。

typo 5.0.2 の場合
(in /home/date/tmp/typo-5.0.2)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |  2124 |  1752 |      37 |     220 |   5 |     5 |
| Helpers              |   765 |   608 |       0 |     104 |   0 |     3 |
| Models               |  3041 |  2432 |      57 |     415 |   7 |     3 |
| Libraries            |  1446 |  1047 |      33 |     161 |   4 |     4 |
| APIs                 |   437 |   355 |      17 |      23 |   1 |    13 |
| Components           |     0 |     0 |       0 |       0 |   0 |     0 |
| Model specs          |  1022 |   805 |       2 |      19 |   9 |    40 |
| View specs           |   118 |    94 |       0 |       9 |   0 |     8 |
| Controller specs     |   870 |   675 |       1 |      19 |  19 |    33 |
| Helper specs         |    50 |    37 |       0 |       0 |   0 |     0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |  9873 |  7805 |     147 |     970 |   6 |     6 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 6194     Test LOC: 1611     Code to Test Ratio: 1:0.3

こちらもモデルクラスが多いですね。LOC/Method が総じて低いので、すっきりしたコードなのでしょう。

島根県CMSの場合
(in /home/date/tmp/pref-shimane-cms-1.0)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Helpers              |   317 |   288 |       0 |      23 |   0 |    10 |
| Controllers          |  2860 |  2576 |       8 |     199 |  24 |    10 |
| APIs                 |     4 |     2 |       1 |       0 |   0 |     0 |
| Components           |     0 |     0 |       0 |       0 |   0 |     0 |
|   Functional tests   |  2660 |  2358 |      12 |     165 |  13 |    12 |
| Models               |  1817 |  1536 |      22 |     149 |   6 |     8 |
|   Unit tests         |  1510 |  1270 |      24 |     131 |   5 |     7 |
| Libraries            |  8275 |  6270 |     128 |     414 |   3 |    13 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                | 17443 | 14300 |     195 |    1081 |   5 |    11 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 10672     Test LOC: 3628     Code to Test Ratio: 1:0.3

LOC が 2576 と大きいわりに、コントローラ数が少なく、Methods/Class が 24 と大きいです。あまり画面遷移をさせずに色々できるようにしているのかもしれません。LOC/Method も 8〜10 と大き目ですね。リファクタリングの余地がありそうです。

わき道に逸れたので今回はここまで。

お名前:
E-mail:
コメント:
[]

最近のコメント:

  1. だて (02-23)
  2. fukuoka (02-22)

RSS
Creative Commons License
This work is licensed under a Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).