1

私の UI の要素の 1 つは、いくつかの数式を使用して、カテゴリ別に集計されたアイテムのリストを示すテーブルです (以下のターゲット出力を参照)。

ユーザーがセルをスプレッドシートのような数式にバインドできるようにするための最良のアプローチは何でしょうか?

  • パフォーマンス: 実際のデータは頻繁に変更され、テーブルが大きくなり、数式が複雑になる可能性があるため、パフォーマンスと CPU 使用率が懸念されます。
  • 構成の容易さ (構成は開発者によって行われるため、プログラミングが必要になる場合があります)
  • 構成の保守性

これまでに想定したアプローチは次のとおりです。

  1. Java Scripting API を使用しますが、パフォーマンスを向上させるために JVM ベースのアプローチに固執したいと思います
  2. 実行時に実装を作成しinterface Formula { double calculate(); }、生成、コンパイル、およびロードします。これにより、JIT は生成されたメソッドをコンパイルできます。
  3. 2 と同じですが、clojure などの別の JVM ベースの言語を使用します。これにより、オンザフライでのコンパイルが容易になり、適切な機能的アプローチが可能になります (たとえば、以下の平均と合計の計算には map/reduce が役立ちます) - よくわかりませんただし、パフォーマンスへの影響については。

どちらのアプローチがより理にかなっていますか? 他に検討すべきソリューションやライブラリはありますか?


目標をより明確にするために、ここに不自然な例を示します。表の項目が次のとおりであると仮定します。

public class Item() {
    public String category;
    public String name;
    public int quantity;
    public double price;
}

目標出力

Category     Name        Quantity    Price (avg)     Value (sum)
All                                      82            1,090

Bikes                                    45              650
             Bike 1         10           40              400
             Bike 2          5           50              250

Cars                                    120              440
             Car 1           3          100              300
             Car 2           1          140              140

列の構成

列は次のように定義できます。

Column #      Formula
    1         item.name;
    2         item.quantity;
    3         item.price;
    4         Math.abs(column_2 * column_3); //calls a JDK method

集計構成

また、集計カテゴリと集計式は次のように定義できます。

AGGREGATION #1: Category cat = item.category();
Column #      Formula
    1         cat;
    2         "";
    3         thisColumn.filter(cat).items().average(); //utility method
    //this one is more complex
    4         { double sum = 0;
                for (double value : thisColumn.filter(cat).items())
                    sum += value;
                return sum;
              }
4

1 に答える 1

0

ユーザーが使用できるカスタムドメイン固有言語を使用し、ANTLRに、式を実行可能関数に解析するJavaでネイティブパーサーを生成させます。

同様のことを行った例については、たとえばhttp://arcanecoder.blogspot.be/2008/04/using-antlr-to-create-excel-like.html 、またはhttp://www.antlr.org/wiki/を参照してください。最新のものについては、 display / ANTLR3 / Expression+evaluator

'sum'、'average'などの関数を定義し、それをカスタムJavaコードにマップし、たとえば$1または${name}を使用してプロパティを参照させることができます。

ユーザーに使用させたい関数のみを定義するため、一般的なスクリプト言語で使用できる有害な関数を使用することはできません。

于 2013-01-11T15:32:06.840 に答える