ある処理を記述しているとき,80%くらいの処理は一瞬で書けるんだけど,付帯する処理があって,そのときはなにやら複雑なことをしなければならない,ということがままある.
たとえばファイルを加工するソフトウェアを書くとき,加工自体は一瞬で正規表現とかパーサでできるぜ,という感じだけど,ファイルの入出力とかパラメタの処理とか一時ファイルの扱いなどの付帯処理が必要で,どっちかというとこちらのほうが大変.やりたい事とはあまり関係がないけど,適当にやるとファイルを開きっぱなしにしたり,ファイルを全部メモリに載せてしまったり,同時にファイルに書き込もうとしてしまう.
こういうのは純粋なビジネスロジックというよりは,それに付帯した,扱う対象の構造上の問題,ということができて,こういうときは構造がうまくできていると嬉しくて,すべてうまいこと作られていると,自然と合成がうまくいくし,コーナーケースも正しく処理される.するとテストもすぐ通ってうれしい.たとえばRAIIの仕組みがあると,そこにのっかるだけでリソース管理について考えなくて良くなる.言い換えると抽象化されて得な状態になる.
すべてうまいこと作るにはどうするかというと,合成にかかわる箇所,つまり構造的な箇所は別途作り込む,ということになると思う.
たとえば車だと,エンジンつけてタイヤとハンドルをつければ機能としてはだいたい完成しているんだけど,ちゃんとやるためにさらにこまかい作り込みが必要で,ウインカーは右か左か消灯のいずれかの状態しかとってはいけないし,ギアが同時に別のギアに接続されてはいけない.むしろそこが本体ということもできる.ソフトウェアの場合は内容よりも構造が重要だったりするかもしれない.
すると関数型言語便利ですね,みたいな話につながっていきそうだけれど,目下Perlを書くことになっているので謎抽象化みたいなことはできない.