JavaやRubyのコード、とりわけ複雑なフレームワークで作られたソースを見て、それが何をしているのか読み解くには言語そのものの知識だけでなくフレームワークの知識も必要になり、何倍も時間が掛かります。そもそもJavaはパッケージによってクラス名が被っていたりとか、名前が死ぬほど長かったりして恐怖感すら感じます。
InputStream is = new BufferedInputStream(new FileInputStream("foo"));を見てですよ、なぜInputStream = new FileInputStream("foo")ではだめなのか、なぜBufferedInputStreamを介す必要があるのか、理解するだけで数分は浪費します。こんなの
$fp = fopen("foo");と書けるPHPの方がラクに決まっています。
http://blog.so-net.ne.jp/shi3z/2008-01-30
言語云々とは少し離れますが.
プログラマーは“汎用性”,“拡張性”,“構造化”という言葉に非常に弱いような気がします.もちろん,それらは非常に重要で常にそれらの事を考えてコーディングしていかなければならないのですが,それらを重要視し過ぎた結果User Interface (UI)をまったく考慮に入れられていないようなプログラム(ライブラリ)が出来上がってしまったりします.
例えば,ある1つのエントリが決まったフォーマットで1行に書かれているデータファイルの処理を行うライブラリを作成する場合には,しばしば以下のような方針で作成されます.
- 1行を処理するクラス(and/or 関数)を作成する
- 対象となるファイルから1行読み込んでそのクラスへ渡すという作業を繰り返すクラス(and/or 関数)を作成する
ですが,このプログラムを利用する際には,まず1行を処理するためのクラスのインスタンスを作成して,次にそれを引数にして実際にファイルを処理するためのクラスのインスタンスを生成する,と言うように2ステップを要します.
A line_manager = A(...); B file_manager = B(line_manager);
作成した側から見ればたった1ステップ増えるだけにしか見えませんが,(背景?を知らない)利用者からしてみれば,なぜこのような段階を追って生成しなければならないのかが分からずに戸惑ってしまいます.個人的な経験則ですが,2ステップになるだけでもかなり(利用者側からすれば)敷居が上がってしまい,それ以上のステップを要するようだと気軽に利用していくのはほとんど不可能になってしまうように感じます.
プログラムにおけるUI(引数の数/順番や先に述べたインスタンス生成の順序)の分かりやすさは個人の慣れなど主観的な要素も強いため,なかなか適切な方法を一つに絞ることができません.ですが,UIの事ももう少し考慮に入れて書いていると(特に他人に自分のプログラムを使ってもらう場合には)良いのだろうと思います.
# この辺りは,ラッパクラスを書くときに頑張ることなのかなぁ.