JavaのFluentインターフェイスを使用してドメインオブジェクトを記述する例

免責事項:私の下書きで記事を見つけました。 私は約1年半前に書いた、なぜそれを公開しなかったのか-覚えていない。 まったく役に立たないように見えましたが、パブリックドメインに入れましょう。



最近、ドメイン固有言語(DSL)を使用することが非常に重要になりました-特定の主題分野に「合わせた」言語。 この文脈での「言語」という言葉は、必ずしも新しいプログラミング言語を意味するものではなく、古き良き時代の言語でうまくいくことがよくあります。



habrでは、Javaコンテキストでの流れるようなインターフェースに関する記事は見当たりませんでしたので、アプリケーションで私の経験を共有したいと思います。



Fowler (DSLの大ファン) による記事指摘してくれたAleparに感謝



流れるようなインターフェイスの背後にある考え方は、APIがドメイン固有の記述言語のサブセットであるということです。 さらに、この幸福は基本プログラミング言語から利用できます。



Fowlerのテキストはリンク上で読むことができますが、例を挙げます。



このxmlに対応するオブジェクトをプログラムで構築する必要があるとします。

<Results> <unit>123</unit> <unit>321</unit> <ResultSet> <ResultsType> <ResultType>ABC</ResultType> <resAllTime>4.000000000000000</resAllTime> <resAllTime>5.000000000000000</resAllTime> <ResultsTimeBucket> <bucketDate>777</bucketDate> <value>3.000000000000000</value> <value>0.000000000000000</value> </ResultsTimeBucket> <ResultsTimeBucket> <bucketDate>888</bucketDate> <value>1.000000000000000</value> <value>5.000000000000000</value> </ResultsTimeBucket> </ResultsType> </ResultSet> </Results>
      
      







記述されている内容の意味は、ユニット123の合計値が4であり、日付777で3、日付888で別の1で構成されることです。また、ユニット321の合計値は5であり、完全に日付888でした。



このようなオブジェクトの構築に使用されるAPIは、プラスアドオン(JNI)です。



 Results r = new Results(); r.CallocResults(new int[] {123, 321}, new int[] {777, 888}); r.SetValue(4.0, "ABC", 0); // 0 - unit index in this case corresponds to "123" r.SetValue(5.0, "ABC", 1); r.SetBucketedValue(3.0, "ABC", 0, 0); r.SetBucketedValue(1.0, "ABC", 1, 0); // 1 - bucketDate index (corresponds to 888), 0 - unit index r.SetBucketedValue(5.0, "ABC", 1, 1);
      
      







一般的に、すべてが事実であり、文句を言うことは何もありませんが、結果として何が起こるかを読んで想像することは事実上非現実的です...

当初、これは単体テストに必要でした。そのため、明らかでない結果を伴うコードを使用することはあまり良い考えではありません。 単体テストとその文書化コンポーネントの明確さが失われます。



私は一生懸命に考え、同じために流なインターフェイスを描写しようとしました。 その実装は驚くほど簡単ではないことが判明しました(基礎となるJNIインターフェースの特性のため)が、非常に見栄えが良いです:



 Results r = new ResultsBuilder() .withUnits(123, 321) .result("ABC") .value(123, 4.) .value(321, 5.) .on(777) .value(123, 3.) .on(888) .value(123, 1.) .value(321, 5.) .build();
      
      







一般に、JavaでDSLを構築するためのいくつかのテクニックを習得すると、タスクは技術的になります:目が怖くて、手がしています。



All Articles