Hash引数の是非考察

フロントエンド周りのプログラムを書いていると、コンストラクタやイニシャライズメソッドの引数がHashやJSON形式オブジェクト一本勝負パターンをよく目にする。

$("#dialog-start").dialog({
    title: '条件を設定・選択してください',
    height: 670,
    width: 900,
    resizable: false,
    modal: true,
    draggable: false,
    close: function () {
	document.location.href = 'series.php';
    }
});


前々から、この方法に関する是非が気になっていたのだけれど、調べてみるとどうもこの件に関するアンチパターン、ベストプラクティス、デザインパターンのようなものが見当たらない。
個人の見解は出てくるけど。と言うわけで自分なりに考察してみた。
ruby - Passing hashes instead of method parameters - Stack Overflow


Hash引数のメリット

(1) 引数の数、組み合わせが多い場合
  • 幾つもメソッドを定義しなくて良い
  • 呼び出す際に引数の順番を気にしなくて良い

例えば、C#のSystem.IO.StreamReaderはコンストラクタが11個あったりする。
StreamReader クラス (System.IO)

(2) オプションが多い場合

省略する引数へのデフォルト値の指定が不要

(3) 可読性
  • 関数・メソッドの定義を見なくても、値が何を意味するのかが明確
  • 省略する引数へのデフォルト値の指定が不要
(4) 変更に強い

引数を増やす必要があった場合でも、呼び出し側に影響がない

(5) コーディング量の削減

引数用のクラスの定義、それにまつわるExceptionクラスの定義などを行わなくて良い
(※) 行わなくて良いことの是非は別として


Hash引数のデメリット

(1) 引数の型だけが異なる場合の対応

オーバーロードのほうが綺麗にに定義ができる

(2) オーバーライドの目的が不明確

オーバーライドが一つになるので、どの引数のパターンに対するオーバーライドなのかが定義かわからない

(3) インタフェースに使うとインタフェースの意味がなくなる

そのまま

(4) メソッド呼び出し時の型チェックに引っかからない

そのまま

(5) その他

テストフレームワークとの親和性も気になる所


弱い結論

  • 弱い動的型付けの言語において、利益を享受できる気がする
  • でも、Railsでも多用されているから、強い動的型付けの言語もかも
  • ガチガチのOOPには不向き


というわけで、自分としては普段メリットだけに目が行ってついつい多用してしまう、Hash引数に付いて考察してみました。
個人的にはJavaでプログラムを書く際のオーバーロードによる幾つものメソッド定義が余り好きではなかったので、Hash引数好きです。