JavaScript メッセージの柔軟性と多様性
出典: フリー教科書『ウィキブックス(Wikibooks)』
目次 |
[編集] 多様性(ポリモフィズム)
[編集] 多様性の考え方
まずはオブジェクトの多様性について話をする。
オブジェクト同士はそれぞれ連絡を取り合っている。
具体的には「走れ」等のメッセージをやりとりしている訳だが、時には
「”早く”走れ」、や「”時速○○キロ”で走れ」や「”今より早く”走れ」等、ひとつの動作にも様々な細かい規則を指定できると良い。
このように、オブジェクトに対するメッセージに柔軟さを与えるのが「オブジェクトの多様性(ポリモフィズム)」の目的である。
[編集] 多様性のプログラミング
動作に多様性を持たせるにはどうすれば良いかは簡単である。 メソッドの最初でどのような命令が送られたのかをチェックするようにすれば良い。
例えば、スピード調整の場合、「早く/遅く」をtrueとfalseで、具体的な数値を入れたい場合は数字型を入れるのが良いので
function speed( val ){
// 数字が指定されている場合
if("number"==typeof val){
}
// 真偽値型が指定されている場合
if( "boolean" == typeof val ){
}
}
typeof文は、データの型を返す演算子である。 これを利用してデータの型をチェックして、それに合わせてプログラムを変えている。
[編集] argumentsオブジェクト
関数に対して送られる引数は、関数の最初で代入が行われるのとは他に、argumentsという名の配列が作成されてそこにも格納が行われる。
つまり、次のコード内部の2つの関数は同じ意味である
function foo( a, b, c ){
}
function foo(){
var a = arguments[0];
var b = arguments[1];
var c = arguments[2];
}
これを理解して何故arguments変数が大事なのかを解説する。
argumentsでデータを配列として受け取ることで引数を柔軟に扱うことが出来る。
function foo(){
if(3==arguments.length){
return;
}
if(4==arguments.length){
return;
}
if(5==arguments.length){
return;
}
}
JavaやC++等で、ポリモフィズムを行うときは、同じ名前で引数だけが違うメソッドをたくさん作ることになるが、JavaScriptの場合は逆に一つの関数の中で、引数のチェックを行ってこれを再現する。
他の言語ではそれぞれのpublicなメソッドで値を整えた後、一括処理するprivateな関数にデータを送る場合があるが関数内関数と、argumentsによる引数のチェック、変換を行うことで再現できる。
[編集] 余談:ポリモーフィズムの必要性
オブジェクト指向を始めて学んで、実際にプログラムを始めると、問題をオブジェクトに分割すること以外にはその有用性というのはなかなか実感されないものです。 多様性(ポリモーフィズム)もその必要性というのはなかなか説明しづらいものがあります。 しかし、ソフトウェアというのは作られた時代や周りの環境で変更や機能の追加が起こるものです。 実際の開発の現場でも、今まで使っていたメソッドに新たに機能を追加する必要が出たときに「この関数がイメージに近いから、これにもう一つ引数を追加して使いまわしたいんだけどなぁ」と思うときがあり、その様な時に、既存の機能を変更しないまま新たに引数を追加する事が出来るこの機能が良く役に立ちます。 この様な事は機能のややコアな部分での機能追加などで現れがちです。 ちなみに。本当にコアな部分は影響範囲が大きいため変更しづらく、また良く検討されている"はず"なので普通は変更されません。