グループ編成はメソッド抽出に似ている
---
プログラマはしばしばrefactoringと呼ばれる作業を行う。
refactoringは、プログラムの振る舞いを変えずに、ソースコードの構造を変える作業だ。
なぜそれをするのか。
それはリファクタリングによって「理解のしやすさ」が改善するからだ
ソースコードは「多すぎる情報」であって、それを人間が扱うためには認知的なコストを下げる必要がある、プログラミング言語はそのためのツールをたくさん生み出してきた。
モジュールやインターフェースもそう。ここで紹介するメソッドやその前身である関数もそうだ。
プログラミング経験のない人のために簡単に説明すると、ここでいう"method"は手段という意味ではない。コンピュータに対する命令の塊である。メソッドは名前を持っている。
メソッド抽出はリファクタリングの一種である。
ソースコードの一部の関連している行を新しいメソッドに括りだす。
そしてそのメソッドに処理の内容を表現する「名前」を付ける。
これはグループ編成と表札付けに似ている。
このアナロジーを使うと
「この行は条件分岐だから集めよう」はNG。
「この行には同じ名前の変数が出てくるからまとめよう」もNG。
プログラムの行が互いに関連しあってひとかたまりの機能を表現している時にそれを括り出すのが正しい。
どこをどう括り出すかに正解はない。だが、良い単位で括りだし、良い名前をつけると、その後のプログラミングが楽になる。括り出して名前をつけることによって、考えるための「取って」ができる。何行ものソースコードが一つのメソッド名に圧縮される。
そうやってコードをどんどん圧縮して行くことによって、
人間は大規模なプログラムを作ることが可能になったのだ。
-----
プログラムを書いていてプログラマ向けに「KJ法でのグループ編成と表札付け」を解説する上ですごく良い例を思いついた。プログラムを書いてからそれを関数にくくりだすとき、「互いに関係しているコード」を関数の形でくくりだし、その関数に処理の内容を表現する「名前」を付ける。それこそグループ編成と表札付けだ。 「関数にくくりだす」と「メソッド抽出」のどちらが伝わりやすいのだろう。JavaやC#ではリファクタリング機能で範囲を選択してメソッド抽出するよね。
そう考えると「似ているものを集める」が間違いなのもわかる。コードの中のif文を「これはif文だ」って言って集めて「if文」って名前の関数にしても意味がないよね。
複数行のコードを関数にくくりだして「名前を付ける」ことによって、その一連の処理を1つの関数名に「圧縮する」ことができる。同じ処理をプログラムの複数個所で使う場合に、その名前を使って関数を呼び出して使うことができる。
名前がつくことによって考えるための「取っ手」ができる。
よい名前を付けることが重要。
そうやって末端のコードをどんどん圧縮して行くことによって、一人の人間ではすべてを脳内に展開できないような大規模なソースコードのプログラムを作ることが可能になったわけだ。