見えすぎ問題
大きすぎるファイルを削除する関数と小さすぎるファイルを削除する関数を作りたいものとする。
この2つの関数は、ファイルに対する述語の部分を除いては、まったく同一のものになるだろう。クラス指向的プログラミングであれば、まとめたければベースクラス(FileRemoverとかそんな感じ?)を作って、それを継承する事になるのではないかと思う。プロトタイプ指向の場合はどうなるのかよくわからないけど、なんかそれっぽい関数オブジェクトを作って、それをコピーして一部書き換えてSmallFileRemoverとBigFileRemoverを作るとか、そんな感じになるのではあるまいか。
一方、関数型言語…少なくともSchemeの場合では、
(define (make-file-remover condition) (lambda (filename) (if (condition filename) (file-remove filename)))) (define small-file-remove (make-file-remover (lambda (filename) (if (< (file-size filename) small-threshold) #t #f)))) (define big-file-remove (make-file-remover (lambda (filename) (if (> (file-size filename) big-threshold) #t #f))))
みたいに定義するというやり方が(推奨されるかどうかは知らんけど)存在する。しかし、このやり方だとfile-removerが見える範囲が広すぎて気持ちが悪い。他にもfile-removerの使い道がいろいろとあるならよいけど、ここぐらいでしか使わなさそうだし。見えすぎるのは気持ちが悪い。
クラスベースのオブジェクト指向ならこの問題が解決できるのか…というと、CLOS的な総称関数を使うやり方では、結局この見えすぎる問題を解決することはできないような気がする。そもそも、この程度の問題にオブジェクトシステムを使うのは牛刀のように感じるし。
まぁ、見える範囲が広くてもせいぜいモジュールの範囲内で収まるんだから、実害はないと言えばないんだけど、なんだか気持ち悪い。