メッセージをやり取りするオブジェクトをJavaScriptで実装してみた
メッセージングのオブジェクト指向
オブジェクト指向については、具体的な定義をここで定めることができませんが、コードで実現することで、なんとかイメージを近づけておきたいというのが私の考えです。
以下の記事に「メッセージング」という面白い言葉が載っていたので、さっそく、JavaScriptで実装してみました。
その後のJoe Armstrongのオブジェクト指向に対する見解
オブジェクト指向の概念の発明者は誰ですか?(改訂版)
使い方
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
課題
今は、文字列を配列に変換するようにしています。文字列は文字列で、分けて処理するコードを作るのが課題です。