4

.NET で給与計算アプリケーションを作成しています。要件の 1 つは、出勤規則と控除規則が可能な限り動的で柔軟であることです。ユーザーは、すべての従業員が出席ルールにバインドされる独自のルールを定義できる必要があります。

1 つの解決策は、すべての出席規則のコードがデータベースに格納され、実行時にコンパイルされる C# コードをオンザフライでコンパイルすることですが、規則は技術者のみが読み取り/理解できるため、これは最も洗練された解決策ではありません。 、コードのパフォーマンスと可読性も可能な限り最高のものではありません。

スクリプトを記述したり C# コードを動的にコンパイルしたりせずに、出席規則を定義して適用し、それらに基づいて控除を計算できるソリューション \ アーキテクチャ パターンがあるかどうか疑問に思っています。

4

3 に答える 3

2

Booは、拡張可能なコンパイラを備えた本格的な .NET 言語です。Ayende は「 Building Domain Specific Languages in Boo 」という素晴らしい本を書きました。そこで彼は、コンパイラを拡張して次のようなことを可能にするトピックについて議論しています。

when User.is_preferred and Order.total_cost > 1000: 
    add_discount_precentage 5 
    apply_free_shipping 
when not User.is_preferred and Order.total_cost > 1000: 
   suggest_upgrade_to_preferred  
    apply_free_shipping 
when User.is_not_preferred and Order.total_cost > 500: 
   apply_free_shipping

.NET アセンブリにコンパイルすると、これらのルールは非常に高速に実行されます。ただし、ルールが変更された場合にアンロードできるように、生成されたコードを別の AppDomain で実行する必要があります。

于 2009-08-24T12:48:56.887 に答える
2

システムを変更するためにコードのコンパイルに頼るのは本当に悪い習慣です。「ルールはいつでも変更できます。必要なのは開発者だけです」と言うかもしれません。

ルールを定義すると、パラメーターを DB に保存し、実行時にパラメーターを読み取るコードに適用できます。コードはより複雑になりますが、それは構成のために支払う代償です。

ルールを定義する必要があります。つまり、どのパラメーターを使用するか、およびそれらをどのように適用できるかを正式に述べます。

例えば。90% の出席が 5% の控除を意味する場合、これら 2 つの値を DB に保存します。次に、コードは実際の出席を取得し、対応する行を見つけて控除を適用します。ルールが非常に複雑で、このようなパラメーターでモデル化できない場合を除き、構成システムを使用することが最善の方法です。次に、単純な GUI をユーザーに提供して、ルールの値を微調整できます。

于 2009-08-24T12:59:42.723 に答える
0

インタープリターを埋め込み、いくつかのテンプレートやビジュアル ツールを使用して、ユーザーがコードの新しい部分を追加できるようにすることができます。

于 2009-08-24T12:51:02.877 に答える