x.x.x.x

| HOME | FrontPage | 記事編集 | RSS |

コーディング規約の作り方   Perl

  1. 1. 可読性
  2. 2. 画一化
  3. 3. 速度ベースのコーディング基準
  4. 4. 参考資料

今のプロジェクトにはコーディング規約があります。まぁ普通あります。次のプロジェクトは5月からの予定です。どちらもPerlの業務ですが、後者にはコーディング規約がありません。後者の社長さんから「ノウハウを持ってないから規約が無いだけで、持ってるなら教えろ」と言われましたが速やかにお断り致しました(;´Д`)y-~ ノウハウと言うのか、世の中の常識的な規約は一通り見てきましたが、Perlで積極的にコーディング規約を作るのは非常にバカげています。言語がCなら

ポインタ演算を全面的に禁止する

のはアリです。基本的に演算の必要が無く、C言語の発明の時点においては特に何の理念も無かったからです。ある理念に基づいて設計された物事は、その理念に基づいて利用した方が効率が良くなります。サラブレッドより自動車の方が速いからといって、サラブレッドにガソリンを飲ませても遅い。この点についてLarry先生はこう仰っています。

Perlのカルチャーでは、何かを禁止する代わりに、一定の徳目を奨励するようにしている。使徒パウロが指摘しているように、愛、喜び、平和、忍耐、親切心、善、優しさ、柔和さ、自制といったものに対して禁止法を定める者はいない。だから、我われも、悪を禁じることに専念するよりも、善を奨励することに専念しようというわけである。
http://www.oreilly.co.jp/BOOK/osp/OpenSource_Web_Version/chapter10/chapter10.html

従来のコーディング規約はまさしく悪を禁じるための文書でした。すなわちPerlでコーディング規約を作るのであれば、善を奨励する観点から作らなくては理念に沿わないわけです。

1. 可読性

従来のコーディング規約は可読性、すなわち素人視点の分かり易さを第一とし、代償として速度を支払ってきました。特にインターネット周りでは、そのような設計・開発を進めた結果、必ず後日「重い」と苦情が来ます。他愛のないコンテンツのために巨額を投じ、巨大なサーバファームを永遠に維持し続けなくてはなりません。10人のチームで一ヶ月かけて高速化するので、それで浮いたサーバの運用・保守代金を毎月我々の口座に振り込んで下さいと言えるなら、一生遊んで暮らせる金額が手に入ります。

2. 画一化

コーディング規約の意義としてはもう一つ、システム全体のコードの画一化があります。画一化によって、「ひとつわかれば全部分かる」的な状況を作るわけです。この命題は唯一絶対の理念があれば、その理念が何であれ解決されます。必ずしもコーディング規約でなくとも、30分以内50歳以上限定でもある方向の画一化はなされます。

3. 速度ベースのコーディング基準

そういうわけで、ひとつこれを作ろうじゃないかと漏れは言いたい( ´ ー ` )y-~

この世の中に絶対善なる物事が実在するならば、その内の一つが速度です。経費や副作用は別にして、所要時間を短縮する発明そのものは何であれ絶対善です。私が尊敬してやまない食えるキノコと食えないキノコを分類した人と、テレビのリモコンを発明した人の内、前者の方が超人に近いけれども、絶対善は後者です。速度ベースならコーディングレビューも単純明快です。

「ベンチマークどっちが速い?」

速度が絶対善である限り
「速いから」
または
「遅いから」
は十分な判断基準になります。可読性については転職をお勧めするとして、速度という善を奨励し、速度によって画一化する。プログラミング言語はもともとコンパイルを通るという画一化、コーディングは仕様上のIN-OUTの妥当性という画一化がなされているわけで、さらに何らかの画一化を追加するとすれば、それ自体が運用フェーズにとってプラスでなくては、くどい。もし速度ベースのコーディング基準として世界有数のドキュメントを書けたなら、\3,800でオライリーから出版できます。

もっともこれはPerlに閉じた話で、Cはコーディング規約が無いと危険。ただCから来た人々がCのノリで書いたPerlのコーディング規約は焼却したい。Perlのコーディング規約に「変数を初期化」とか真顔で書いてあるからね。

4. 参考資料
use Benchmark;
$t0 = new Benchmark;
#----------------------------------#
# ここに計測したいコードを書きます #
#----------------------------------#
$t1 = new Benchmark;
$td = timediff($t1, $t0);
print "the code took:",timestr($td),"\n";

BlogMode speed member / 2008.03.01 12:09

These pages are designed for NN7 & IE6.
BBSWiki ver.1.50 Final blogmode.
Copyleft (!C) 2005-2007 SUICIDE BLONDE JP.
All Lefts Reserved.

Valid XHTML 1.0 Strict Valid CSS!