メッセージをやり取りするオブジェクトをJavaScriptで実装してみた

メッセージングのオブジェクト指向

オブジェクト指向については、具体的な定義をここで定めることができませんが、コードで実現することで、なんとかイメージを近づけておきたいというのが私の考えです。
以下の記事に「メッセージング」という面白い言葉が載っていたので、さっそく、JavaScriptで実装してみました。

オブジェクト指向の概念の発明者は誰ですか?(改訂版)

http://d.hatena.ne.jp/sumim/20040525#p1

使い方

var message = [12, 15];

var a = function(x){
          return x+1;
        };

a.map(message); // [ 13, 16]

var b = function(x) {
          return x+2;
        },
    c = function(y) {
          return y*3;
        };

b.map(c.map(message)); // [ 38, 47 ]

考え方としては、オブジェクト a, c を用意して、メッセージングであるmessage を渡しています。さらに、最後の一行では、そのmessage に加工したメッセージングをオブジェクト b に渡しています。下の図のとおり、かなり単純です。

 user -> message -> object a
 user -> message -> object c -> (message1) -> object b

なお、オブジェクトa, b, cは状態やデータ構造を持たず、また、messageそのものは加工されていません。

 var message = [12, 15];

 a.map(message);

 message; // [ 12, 15] のまま

再帰のサポート

Array.prototype.mapに影響を受けていますが、大きな違いとして、再帰のサポートがあります。thisを使えば、コールバック関数のネストが厄介な2次元配列の処理もできます。

    var dlist = [ [12, 15], [0, 1] ],
        c = function(x) {
          if (x === 1) {
            return 1200;
          };
          return this.map(x);
        };

    c.map(dlist); // [ [12, 15], [0, 1200] ]

コード

最後にFunction.prototype.mapを実装したコードを書いておきます。ライセンスはMITライセンスですが、他のオープンソースライセンスで提供してもOKです。テストはしましたが、動作は保障しません。

  Function.prototype.map = function(list){
    if (!list) {
      return null;
    } else if (!list.length){
      return list;
    }
    var s = [];
    for (var i=0;i

課題

今は、文字列を配列に変換するようにしています。文字列は文字列で、分けて処理するコードを作るのが課題です。