ローカルクラスという考え方

先日、手続き型プログラミングをしていて手続き型言語ではうまく組めないところがオブジェクト指向言語では、すっきり組めることに気がついた。


それは、関数の定義内の途中経過で出てくる変数の値を関数の呼び出し側でも使いたい場合に問題が発生する。通常、呼び出し側に返したい変数の値は、全て引数で渡した変数に詰め込んで呼び出し側に返してあげる。しかし、呼び出し側が何階層にもなっていたり、変数の個数が多かったり、そういう部分がたくさんあってメインの階層に返してあげたいときは、多くの下請け用の関数の定義が無駄な多数の引数でよごれる。


この回避方法は、DRY原則を破って同じ処理を何度も書くことによって回避できる場合がある。しかし、それは実行速度の問題を無視しても明らかに良くない。コードが分かりづらくなる。


オブジェクト指向では、途中経過の変数をクラスの変数とすることで簡単に回避できることが分かる。引数で渡すときもオブジェクト1つのみで良い。というか外部の関数でなくクラス内のメソッドとした方が良い。しかし、C++Javaなどでは、こういった無駄な変数を含むクラスを作成するという概念があまりないような気がする。つまり一時的にだけ利用するクラスをあまり作成しない。


これは、一時的に利用するという意味でローカルクラスと考えると分かりやすい。つまり、プログラム全体に渡って利用するクラスとは別に、一時的にしか利用しないクラスというのがあっても良い。もちろん、C++Javaでも名前空間の概念があるので可能だが、テクニックとしてはあまり一般的ではない気がする。


Pythonでこういうことをやったら、かなりうまくいった。Cなら単に構造体を使用すれば良いと思うかもしれないが、全くその通りである。しかし、クラスの方が状態に関連するメソッドをクラス内というローカル空間に定義できるという点で、より分かりやすい。