2011年9月18日日曜日

名前付き引数のすすめ

仕事でVB.NETとJavascriptを使い、自分のプロジェクトではC#とJavascriptにPythonと使っているのだけれど、プロジェクトをスイッチさせたときに頭の中のSyntaxがごちゃごちゃになっててスラスラと書き始めるまでしばらく時間がかかったりする。そのせいもあるのか自分のコードを忘れる時間も早くなっている気がする。

で、先日、自分の組んだJavascriptのコードに機能を追加しようと眺めていたら下記のようなコードがあってハタと手が止まってしまった。

$('.class').disable(true);

・・・disableにtrueってなんだろ?有効、非有効の表示を切り替えるためにjqueryのpluginを作ったのまでは覚えているけれど、その引数の意味が思い出せない。パッと見て類推できるのは、disableにする、しないのフラグかなと思ったのだが、enableというpluginも用意したはずなのでそれは当たらない。で、良く分からないのでpluginの実装を見たら下記のようだった。

disable:function(clearValue){
 if (clearValue){
  // code here
 }
}

ということであのbooleanはdisableついでに値も消去するかのフラグだった。これがC#、VB.NETだとまだ楽で優秀なVisual Studioのインテリセンスがすぐにどういう値なのか教えてくれるし、PythonにしてもPyDevなどがあればDocumentが表示されるので簡易に分かったりする。が、Visual StudioでJavascriptのインテリセンスを使用するためにはReferenceタグを各ファイルに追加しなければいけなかったりと若干面倒だったりするので、Syntaxとして名前付き引数が用意されていないJavascriptで、コードを用いて同じ機能を実現しようとするならば下記のようになる。

item.disable({clearValue:true});

disable:function(options){
 options = options || { clearValue:false};
 if ( options.clearValue){
  // code here
 }
}

これでコードの可読性はあがったけれど若干冗長なのは否めない。ただ冗長だからという理由だけで、常にBoolean、Integer、Stringなどのプリミティブな値を定数としてそのまま引数として渡すのは、コードを管理していく上で良い方法だとは思わない。なので、変数名などからその引数を類推できない場合などは極力名前付き引数を使用するほうが可読性の向上 → メンテナンス性の向上というコンボになるので、上記のような状況では名前付き引数を使用するのが良いだろう。


蛇足ながらそれぞれの言語で名前付き引数で上記のシグネチャの関数を呼び出すと以下のような感じになる。

// c#
item.Disable(clearValue:true);

' VB.NET
item.Disable(clearValue:=True);

# Python
item.disable(clearValue=True);

0 件のコメント:

コメントを投稿