使いやすいシステムと読みやすいコード

先日の情報共有では荒砂さんから「オブジェクト指向のデザイン」についてお話があった。なんとなく話は聞いたことがあったが、詳しい説明を聞いて理解が深まった。

その中でGUIとCLIの話があった。使いやすいGUIは「対象 -> 動作」のように、最初に対象を選んでから行いたい動作を選ぶように設計されていることが多いらしい。たとえばOSのファイルマネージャではアイコンを右クリックしてから「名前を変更」したり、「削除」したりするような手順になる。

一方CLIのコマンドは「動作 -> 対象」という文法になっている。memo.txtというファイルをnew-name.txtにリネームするならmv memo.txt new-name.txtというふうになる。最初に「mv」という動作を宣言してから、「memo.txt」という対象を選んでいる。

だが、一般にCLIでは前のコマンドの出力を次のコマンドの入力として扱うことができ、これによって別の見方ができる。テキストファイルの中身を表示する「cat」コマンドと正規表現で行を抽出できる「grep」というコマンドを合わせて使うとcat memo.txt | grep "text"のようになる。

これは「動作 -> 対象」 と 「動作 -> 対象」をつないだものだが、前のコマンドを「対象」として、後のコマンドを「動作」として考えると、「memo.txtの内容」から「textという文字列を抽出する」のように2つで「対象 -> 動作」という構造としてとらえることもできる。

プログラミングでもオブジェクト指向言語でいうところのメソッドチェーンや関数型言語でいうところのパイプ演算子は、これと同じように考えることができそうだ。Rubyでメソッドをつなげて配列を処理できるということをはじめて学んだときや、OCamlでパイプ演算子を使ってうまく処理をつなげられたときになんともいえない満足感、気持ちよさがあったが、「オブジェクト指向のデザイン」の使いやすさというのも同じようなイメージかもしれない。

このへんの話を頭の片隅に置いておくことで、自分の書くプログラムの読みやすさ / わかりやすさを向上させるためのヒントになるかもしれないと感じた。