Google のソフトウェア技術者で Microsoft C# MVP の Jon Skeet 氏が Noda Time バージョン 1.0 を発表した。Java の日時処理ライブラリとして有名な Joda Time を .NET に移植したものだ。
Noda Time は .NET の日時処理ライブラリの欠点を修正すると同時に,それを使用する際の煩わしさを解消しようとするものだ。Noda Time には基本となる概念が複数ある - Unix エポックからの経過時間を表す Instant,日付あるいは時刻を部分的に表現する Partial,ある時点からのインターバルを ms 単位で表す Interval,ms 単位の継続的な時間周期を示す Duration,フィールドの組み合わせで (5ヶ月3日6時間のように) 時間間隔を表現する Period,差し替え可能なカレンダーシステムである Chronology などだ。またタイムゾーンは tz データベースに基づいて更新される。
Joda Time を .NET に移植するというこの開発は,すでに3年間を費やした現在もなお作業の残る状態である。しかし発言を見る限りでは,Skeet 氏はその出来映えに満足しているようだ。"ドメインに *特有な* 複雑性に注目すると同時に *付随的な* 複雑性を削減したクリアな API を提供する,という意味においては,従来のほとんどの日時処理 API に対して,すでに大きく先行しています。"
InfoQ は Skeet 氏とコンタクトを取り,Noda Time の詳細と氏の今後の計画について話を聞いた。
InfoQ: Noda Time 1.0 が提供する .NET 4.5 に不足している機能,とはどのようなものでしょう?
JS: 根本的に BCL(基本ライブラリ) は,サポートするデータ型が少なすぎるのです。ユーザが希望するすべての範囲の概念を表現するのに,基本的には2つの型 (DateTime と DateTimeOffset) しかありません。Noda Time にはもっと幅広いデータ型が用意されています。ですから,開発者は使いたいと思う種類のデータを重点的に使用すればよいのです。ただし,まったく意味をなさない操作を実行できないようにするため,API には意図的な制限を設けています。
その他に私が BCL で問題だと思っている点については,DateTime に関する私のブログポストを読んで頂ければと思います。
API は基本的に4つの目標を念頭において機能を公開すべきだ,というのが私の考えです。
- ユーザにある種の意思決定をさせる (そのドメインにおける重要な部分をユーザから隠そうとするのではなく) こと。
- ユーザが判断をしたならば,それをクリアなコードで表現可能なこと – その判断に基づいて行動するため必要なすべての作業を舞台裏で行うこと。
- 可能な限り,意味のある操作のみを実行可能とすること。
- 検証可能な方法でコードが書かれるようにすること。
日付や時刻に関するおおよそ妥当な API に加えて,Noda Time は TZDB/zoneinfo/Olson/IANA などのタイムゾーン情報も提供します。
InfoQ: 今後の計画はどのようなものでしょうか?
JS: ユーザ次第という部分はもちろんあります。不完全な部分があることは間違いありません。テキスト操作 (まずはパースや ZonedDateTime,OffsetDateTime など) や PCL サポートなどを充実したいと思っています。さまざまな形式のシリアライゼーションも大きな問題です - Json.NET サポートについては,試験的な形式 (メインアセンブリとは分離されている) ですが,ある程度はサポートしています。v1.0 で基本概念に問題がないと確信できれば,XML やバイナリシリアライゼーションなども加えたいと思っています。
InfoQ: Noda Time はどのバージョンの .NET でも動作するのでしょうか? Mono ではどうでしょう?
JS: 現在の対象は NET 3.5 以上ですが,デスクトップのみです。PCL (Portable Class Library) もサポートしたいと思っているのですが,かなりの作業が必要になります。PCL では利用できないフレームワークサポートの必要な機能の削除がほとんどです。
コードは Mono でも動作するように設計されていますし,可能な範囲ではテストも行っています。ただし Mono の安定版では,おもにカルチャと TimeZoneInfo の関係でいくつか問題がありました。Mono 3.0 でこれらの問題が,多少なりとも改善されているとよいのですが。通常の計算処理に関しては,TZDB を使えば Mono でも正常に動作します。ある意味これは,動く標的です。今後もずっとそうであり続けることは間違いないでしょう - OS/バージョンの組み合わせによってどのような問題が発生するのかについては,正確に文書化できるように今後も力を入れていくつもりです。