ClojureでWebアプリケーションをつくるときに、Joda-Timeに依存しないようにする
Java界隈では当然のようにJoda-Timeへの依存度が下がっていると思うんですが、Clojure界隈ではどうでしょう。あなたのお手元のプロジェクトはJoda-Timeに依存していないと言えますか?
今日はそんな話を少しだけさせてほしいです。
何故、Joda-Timeに依存してはいけない?
依存していても問題ない、と言えば問題ないです。ですが、JSR-310(Date and Time API)がリリースされたJava 8以降を使っていれば、あえてJoda-Timeを使う必然性はありません。
Java 8がリリースされたのが2014年なので、いい加減Joda-Timeに依存しなくてもいいのではないでしょうか。
何故、今更Joda-Timeの話?
上述の通り、Java 8がリリースされて既に5年が経過しています。Java界隈的にはJava 13, 14あたりに興味津々といったところでしょうか。個人的には、Java 14のRecordsあたりに興味があります(JEP 359: Records (Preview))。
閑話休題。最初に書いた通り、あなたのお手元のプロジェクトはJoda-Timeに依存していませんか?というお話。今更こんな話を書くのも理由があって、数日前にTweetしたんですがRingがついにJoda-Timeに依存しなくなりました(changelog)。正確に言えば、Joda-Timeに依存しているclj-timeに対して直接的に依存しなくなったということです。今までむしろどこで利用していたんだって感じなんですが、Cookieのミドルウェアでずっと使われていました。
色々工夫してもなんだかんだRingが邪魔になっていたので、遂に依存から外れてくれると思うと清々しい気分です。
clj-timeは使ったらダメなの?
端的に言えば、Java 8以降を使っている、かつ新しいプロジェクトを始めたばかり、であれば一考の余地はあります。後述する通り、ClojureコミュニティにおいてもDate and Time APIを利用する動きはあります。また、clj-timeのREADMEには以下のように書かれています。
If you are using Java 8 or later, consider using the built-in Java Time instead of Joda Time -- and look at clojure.java-time if you want a Clojure wrapper for that, or cljc.java-time for a thin Clojure(Script) wrapper. See Converting from Joda Time to java.time for more details about the similarities and differences between the two libraries.
clj-timeのREADMEから引用
こちらもDate and Time APIを使うことを考えてくれ、という見解です。
Date and Time API wrapper群雄割拠問題
さて、Joda-Timeを利用しているclj-timeを依存関係から外したのはいいですが、じゃあ次は何を使えばいいんでしょうか。Date and Time APIをラップしたライブラリが既に2,3あるので、何も知らなければ戸惑うでしょう。
これに対する僕の答えはわりと明確で、単にサーバーサイドやClojureだけで完結する、なおかつ対して難しいことをやるわけでなければJava interopでDate and Time APIを直接利用してしまえば良いです。ただし、interopに不慣れであったりする場合は、Clojure.Java-Timeが現実的かもしれません。ClojureScriptも使ってなおかつコードを共有したいケースがあれば、cljc.java-time、tickを使う方がよいでしょう。といったように使いたいシーンによって、使い分けてもよいと思っています。
ただ、cljc.java-timeやtickを使いたいなと思ったときに、本当に透過的に扱えるライブラリを使うべきかは考慮した方が良いでしょう。根本的にプラットフォームが違う以上、どうしても差異が生まれることがありますし、ライブラリを使うことにこだわって苦労するくらいなら、違うものだと割り切って扱った方がよいこともあるはずです。
まとめ
Ring 1.8.0からclj-timeの依存がなくなったよ
Date and Time APIを使っていこう