読者です 読者をやめる 読者になる 読者になる

ホワイトプログラマー

40歳からSEを辞めてプログラマになりました

関数型言語としてのJavaScript(3)

実践的なJavaScriptを関数型を使ってを書いてみる

関数とは

以下の投稿でも記載したが最近のJavaScriptは関数を使用することが当たり前となってきている。
このことが他言語から乗り換えた時に「JavaScriptは多分簡単だからなんとなるだろう」というサーバーサイドプログラマの淡い期待を打ち砕く。 (これに気づいたときにはプロジェクトは炎上しているはず)
関数型言語としてのJavaScript(2) - サブローグ

できあいのWebフロントエンドを軽く修正するだけならば、コピー&ペーストでなんとかなるかもしれないが、「サーバーから欲しいデータで表示されない」などデータ加工の一手間が必要な場合、途端にハードルが高くなる。

関数型とはデータの受け渡しである

JavaScriptで実際に処理ロジックを記述する殆どはデータの変換である。もちろん最終的には画面に表示するための様々なテクニックが必要となるが、そこはそれぞれ有名なフレームワーク様がやってくれる。
SIerに必要なことは、そのフレームワークにデータを適切な形で渡すことだ。

データを適切な形で渡すためにはデータ構造を正しく理解する必要があるが、JavaScriptにはクラスという概念が基本的にはない(ECMAScript6以前は)のである。しかし、Javaなどのオブジェクト指向言語でサーバサイドを開発したシステムエンジニアは、クラスで解決しようとする。シンタックスとしてないものを作るということは、ソースコードのわかりづらさや、障害対応の困難さを生み出す。
さらに言うと、そういった特定クラスの処理を書くような分岐処理やループ文は汎用性がとても低い。(ほぼないとも言える)

JavaScriptではオブジェクト指向は一旦横において考えたほうが、物事をシンプルにできる。

データはオブジェクト配列でもいいし、ただの配列でもいい。それは最終的に画面表示に使うフレームワークに合わせればいい。
そういうデータ処理に最適なJavaScriptライブラリを紹介する。

Underscore.jsだ。
Underscore.js

Underscore.jsを使って記述してみた。

gistにサンプルをアップしているが、これはNode.js上で動作検証を行っている。
内部処理としては以下となる。

1.DB(postgresql)接続する
2.テーブルから全件を取得する(SQL)
3.データの形式は変わらないように特定の列からデータを取得する(JS)
4.データの形式は変わらないように特定の条件でフィルターを行う(JS)
5.グループ毎の件数を出力するため、特定の条件でカテゴリ化する(JS)
6.画面表示に必要な形式に変換する(JS)
7.特定の値でソートした結果で画面表示を行う(JS)

上記の処理を行ってもプログラムには一切ループ文は存在しない。また、それぞれの処理は関数化されているが、業務処理は入っていない。一部特定のカラムが入っているが、これもカリー化などの対応により外に追い出すことができる。
このように関数化するということは、具体的な業務処理を追い出して、処理を高度に抽象化する ということと同義である。抽象化された関数はプログラムのどのような場所でも利用可能となる。

是非とも、Underscore.jsを使って関数型プログラミングを行い、ロジックの抽象化ということを体験してほしい。