実際に、仕様とコードとが対応しているのを確認すると、コードの流れが見えてくるような気がしませんか?如何に、Pythonのソースコード、Bram Cohenのソースコードがわかりやすいか。他実装のBitTorrentソースコードと比較してみましょう。
まずはRubyでの実装、
rubytorrent。ファイル構成はオリジナルのBitTorrentと似ています。bencoding.rbを見てみます。基本タイプ(文字列StringやリストArray)クラスを開いて、 to_bencoding(エンコード)、self.parse_bencoding(デコード)といったメソッドを追加定義している。
BStreamクラスのeachメソッドで振り分けを行っているが、ある意味トリッキーな方法で(Rubyistには当然かもしれませんが)、オリジナルBitTorrentのような関数の流れ(デリゲート、移譲)が明確でない。
クラスを中心に拡張していくのがRubyスタイルだと思うのですが、もちろん、関数っぽい書き方もできます(参照:
http://d.hatena.ne.jp/teamikl/200404)。
ちなみに、オリジナルのbencode.pyを比較的忠実に、phpで再現したバージョンもあります(
http://www.perlfu.co.uk/code/bt/bencode.php.txt)。コメントを読んで初めて、分岐部分の処理内容がわかる感じです。
Rubyのendキーワードは、コードを書く時には階段をだんだん降りるようで気持ちがいいかもしれないけど、読む時には、波のように見えて、読みづらい。
るびま6号:Rubyist Hotlinks 第 6 回 江渡浩一郎さん 前編
江渡:うーん、(Pythonは)なんか慣れなかったんだよね。お尻が座りが悪いっていうか、上る階段はあるけど下りる階段は無くて。
田中:インデントのこと?
江渡:階段を上っていくとスポッと抜けちゃうような。
Bram Cohenのソースコードを見ると、深いレベルのインデントがほとんど無く、各行の長さがほぼ均一であることに気付く。言語に関係なく、インデント、深いネストには不快感が伴う。いや、ネストには不快感を感じるべき。インデント指向のPythonでは、その不快感が顕著。階段をいくつも上ってる時点で、プログラムのデザインが間違えていると感じる(code smells)。高いとこから飛び下りないように、各行の長さを短く、ほぼ均一に保つ。各関数・メソッドを分割していく。それがPython(Bram Cohen)スタイル。