叙事詩「神曲」に登場する地獄をコールバック地獄で再現する

Blog Single

(注)ネタ記事です

13〜14世紀にダンテという詩人が執筆した「神曲」という叙事詩があります。
世界的にも有名な作品なのでご存知の方も多いとは思いますが、宗教色が強く表現も独特で、しかもかなり長いので通読するのはなかなか困難です。
祖父の家に置いてあるのを小六ぐらいの頃に見つけ、一度チャレンジしてみたのですが一切意味がわからず玉砕しました。
本はかなり好きだったので、読書で初めて挫折したのが「神曲」でした。

最近唐突にそれを思い出し、改めて書店で「神曲」を購入して読んだところ、相変わらず理解不能な部分も多かったのですがなんとか通読することができました。
読んでて一番印象に残ったのが地獄篇でした。

ここで、急にプログラミングの話になりますが、プログラミングにおいて”地獄”として通称されるものの代表はJavaScriptのコールバック地獄かと思います。
実際に、地獄篇を読んでいる間も一瞬コールバック関数が脳裏をよぎりました。
良くないです。職業病です。

今回は、叙事詩における”地獄”をJavaScriptにおける”地獄”で表現してみたいと思います。

地獄について

「神曲」は地獄編、煉獄篇、天国篇の三部で構成されています。

地獄篇において、ダンテは地獄を

第一圏 辺獄

第二圏 愛欲者の地獄

第三圏 貪食者の地獄

第四圏 貪欲者の地獄

第五圏 憤怒者の地獄

第六圏 異端者の地獄

第七圏 暴力者の地獄

第八圏 悪意者の地獄

第九圏 裏切り者の地獄

と九つの圏に分かれていると定義しています。並べて書くと怖い。
更に、罪深い者ほど下位層へと堕ちていくとも表現されています。

今回は1秒おきに一階層ずつ地獄を下っていく非常に罪深い者をコールバック関数で、極力地獄になるように実装します。

実装したものが以下のものになります。

function hellSphere(name, callback) {
    console.log(name);
    setTimeout(function () {
        callback();
    }, 1000);
}


hellSphere('辺獄', function () {
    hellSphere('愛欲者の地獄', function () {
        hellSphere('貪食者の地獄', function () {
            hellSphere('貪欲者の地獄', function () {
                hellSphere('憤怒者の地獄', function () {
                    hellSphere('異端者の地獄', function () {
                        hellSphere('暴力者の地獄', function () {
                            hellSphere('悪意者の地獄', function () {
                                hellSphere('裏切り者の地獄', function(){});
                            });
                        });
                    });
                });
            });
        });
    });
});

hellSphereという自分がいる地獄の圏の名称を1秒ごとに表示する関数を用意し、それを各階層ごとに呼び出しているわけです。実際にインデントの層が地獄と化しています。
上記のコードを”hell.js”と名付けたファイルに保存し実行すると、

無事、地獄を下れました。

コールバック地獄以外で地獄を表現する

コールバック地獄は本来避けるべきなので、出来るだけ先ほどのコードを踏襲しつつasync/awaitを用いて同様に結果が表示されるコードを書いてみると、

const hellSphere = (name) => new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log(name);
        resolve(name);
    }, 1000);
});


(async function(){
    await hellSphere('辺獄');
    await hellSphere('愛欲者の地獄');
    await hellSphere('貪食者の地獄');
    await hellSphere('貪欲者の地獄');
    await hellSphere('憤怒者の地獄');
    await hellSphere('異端者の地獄');
    await hellSphere('暴力者の地獄');
    await hellSphere('悪意者の地獄');
    await hellSphere('裏切り者の地獄');
})();

インデントによる層も削減され、先ほどよりも見通しの良い地獄を実装することが出来ました。

まとめ

今回は呼び出す関数自体がシンプルだったのでコールバック地獄のままでもある程度の可読性は保っていましたが、やはりasync/awaitによる同期処理は改めてわかりやすいなと思いました。
地獄には堕ちないようにしましょう。

技術書は勿論、本全般が好き。品揃えの良い本屋に行くとテンション上がりすぎて後で具合が悪くなる。

Other Posts: