プログラミングにある程度慣れてくると色々と欲が出てきて「ここはこうやったほうが良いのではないか?」といった考えが浮かぶようになってくるかと思います。
無数にあるそういった考えの中の一つとして、「ラッパー関数」というものを説明しようと思います。
ラッパー関数とは
ラッパー関数とは一言でいうと「関数をラッピングして使いやすくする為の関数」というものです。少し分かり難いと思うのでサンプル(JavaScript)をご覧ください。
//パラメーターが沢山!分かりにくいかも・・・ funcA(paramA, paramB, paramC, paramD, paramE, paramF);
この例ではfuncAという関数を呼び出していますが引数が6つも指定されています。作った直後は問題なくとも時間が立てば引数の意味、型、順番などが分からなくなるでしょう。
WordPressのテンプレートを作られる方は分かるかと思いますが、get_postsというWordPress用の関数は引数が10つ以上(省略も可能ですが)もあるので使いにくいんですよね。
そんな使いにくさを解消するのがラッパー関数です。早速ラッパー関数を利用したサンプルを紹介しましょう。
function funcA_wrapper(paramA){ //ラッパー関数を使い指定可能なパラメータを限定することでシンプルに! funcA(paramA, 111, 222, 333, 444, 555); } //パラメータを限定することで自由度が下がるが扱いが簡単に! funcA_wrapper(paramA);
1~6行目がラッパー関数の定義部分です。funcAの第一引数だけを自由に設定できるようにして、他の引数は直接リテラル値を指定しています。利用者はfuncAの代わりにfuncA_wrapperを使います。今まで6つもの引数が必要でしたが、たった一つになりました!利用者にとっては簡潔で分かりやすいですよね。
つまり、あえて自由度を無くすことで使いやすさを向上さえているわけです。もちろん、使いどころが肝心です。たとえば上記の例なら第一引数以外の引数は固定されていますが、固定されていても問題ないようなケースじゃないといけないわけです。
またラッパー関数は引数を限定して使いやすくする他にも、付加機能を持たせて活用の幅を広げることも可能です。サンプルをご覧ください。
function funcA_wrapper(paramA){ funcA(paramA, 111, 222, 333, 444, 555); //別の機能を内包して利便性をさらに高めることも有効! funcB(); } funcA_wrapper(paramA);
先ほどのサンプルとの違いはfuncA_wrapper関数内でfuncBが実行されるようになった点です。先ほどまでのfuncA_wrapper関数はfuncA関数の機能限定版という位置付けでしたが、このサンプルではfuncB関数の効果が付加されパワーアップしたということになります。うまく活用すれば簡潔なプログラムを書くことができるでしょう。
闇雲な機能の追加に注意!使い回せるプログラムを書こう
しかし、闇雲な機能の追加は考え物です。複数の機能を組み合わせると特定の状況への依存性(結合度)が高まり、他で使い回すことが出来なくなってしまう為です。結合度を極力低く保ち独立性の高い機能(モジュール)を作ることが重要です。
このノウハウについては下記の書籍に詳しく書かれています。言語問わず全てのプログラマーにオススメできる良書です。
コメント