4

この問題にどのようにアプローチするのか気になります

商品に適用できる 2 つの税率があります。特に、税率をデータベースに永続化することは避けたいのですが、中央の場所で税率を変更することはできます (税率を 20% から 19% に変更するなど)。

そのため、それらをアプリケーションにコンパイルするだけでよいと判断しました (これは内部的なものです)。問題は、税率だけでなく、税率の名前も知りたいということです。

値にマップする Enum を使用できます。しかし、英語の列挙値の税率のドイツ語名を取得するメソッドを作成する必要があります (コードは英語で記述し、アプリはドイツ語です)。

これを反映するためにハードコーディングされたオブジェクトを使用することを考えました。

public interface Taxrate
{
    string Name { get; }
    decimal Rate { get; }
}

public class NormalTaxRate : Taxrate
{
    public string Name
    { get { return "Regelsteuersatz"; } }

    public decimal Rate
    { get { return 20m; } }
}

しかしその後、これら 2 つのオブジェクトの 2 つのインスタンスを保持するある種のリストを作成する必要があります。静的にするとうまくいくかもしれませんが、それでもある種のリストを保持する必要があります。また、フィールドの値に応じてNHibernateが正しいオブジェクトをインスタンス化できるとは思えないため、POCOドメインオブジェクトをこれにマップする方法を見つける必要があります。

それは本当に気分が悪いです、そして私はここで何かが欠けていると思います. 誰かがより良い解決策を持っていることを願っていますが、私には思いつきません。

こんにちは、ダニエル

Ps: また、適切なものが見つかった場合は、この質問に再度タグを付けてください。今のところ、これ以上意味のあるタグは考えられません。

4

5 に答える 5

6

編集: ここのコードは、税率と名前を取得するプライベート コンストラクターを使用することで簡単に省略できることに注意してください。実生活では、税率の間に実際の行動上の違いがあるかもしれないと仮定しています。

Javaの列挙型のようなものが欲しいようです。

C# ではこれがかなり難しくなりますが、プライベート コンストラクターと入れ子になったクラスを使用して、ある程度は行うことができます。

 public abstract class TaxRate
 {
     public static readonly TaxRate Normal = new NormalTaxRate();
     public static readonly TaxRate Whatever = new OtherTaxRate();

     // Only allow nested classes to derive from this - and we trust those!
     private TaxRate() {}

     public abstract string Name { get; }
     public abstract decimal Rate { get; }

     private class NormalTaxRate : TaxRate
     {
         public override string Name { get { return "Regelsteuersatz"; } }
         public override decimal Rate { get { return 20m; } }
     }

     private class OtherTaxRate : TaxRate
     {
         public override string Name { get { return "Something else"; } }
         public override decimal Rate { get { return 120m; } }
     }
 }

おそらく、名前などに基づいて適切なインスタンスを返すために、TaxRate のある種の静的メソッドが必要になるでしょう。

これが NHibernate にどれほど簡単に適合するかはわかりませんが、ある程度は役立つことを願っています...

コメントで述べたように、それはかなり醜いです-または、少なくとも、さまざまな値がたくさんある場合はかなり醜くなる可能性があります. ここで部分クラスが役立ちます。

// TaxRate.cs
public partial abstract class TaxRate
{
    // All the stuff apart from the nested classes
}

// TaxRate.Normal.cs
public partial abstract class TaxRate
{
    private class NormalTaxRate : TaxRate
    {
        public override string Name { get { return "Regelsteuersatz"; } }
        public override decimal Rate { get { return 20m; } }
    }
}

// TaxRate.Other.cs
public partial abstract class TaxRate
{
    private class OtherTaxRate : TaxRate
    {
        public override string Name { get { return "Something else"; } }
        public override decimal Rate { get { return 120m; } }
    }
}

この SO questionに示すように、ネストされたクラスを外部クラスの子として表示するようにプロジェクト ファイルを変更できます。

于 2008-11-28T11:25:53.240 に答える
3

私は次のようにします:

public class TaxRate
{
    public readonly string Name;
    public readonly decimal Rate;

    private TaxRate(string name, decimal rate)
    {
        this.Name = name;
        this.Rate = rate;
    }


    public static readonly TaxRate NormalRate = new TaxRate("Normal rate", 20);
    public static readonly TaxRate HighRate = new TaxRate("High rate", 80);
}

このようにするとTaxRate、列挙値のような静的メンバーにアクセスするだけで簡単に使用できます。これを NHibernate で使用するには、独自のカスタム NHibernate 型クラスを作成する必要があります (ドキュメントを参照してください) が、それほど難しくありません。もう1回やったことがあります。

于 2008-11-28T12:00:19.040 に答える
1

ネストされたクラスを使用するという考えは、主流の要件であると思われるものに対して、やや奇妙だと言わざるを得ません。

レートをデータベース (またはアプリケーション構成ファイルなどの他の永続化媒体) に保存することの何が問題になっていますか? 製品と税率の関係に使用される、税率ごとに一意の ID が必要だと思いました。

Id/Description/Rate (*) を持つ TaxRate クラスがあります。Id によるレート/説明の迅速な検索のために、すべての可能な値を含む辞書をロードできます。

(*) 多言語アプリでは、カルチャ/ID のペアごとにローカライズされた説明を検索する必要があります - データベースの 2 番目のテーブルまたはリソースなどから...

いずれにせよ、固定金利は間違っているように見えます - 特に政府が経済を後押ししようとして税率で遊んでいる今。

于 2008-11-28T14:33:42.553 に答える
1

ご質問の主旨に反することは承知しておりますが、この問題について少し考えてみたいと思います。

現時点では、VAT と税率をデータベースに保持することを避けることは論理的な決定のように思えるかもしれませんが、時間が経てばそれが間違っていることが証明されます。まず、特定の時点のデータを常に抽出できるようにする必要があります。そのためには、レートのバージョン管理が必要です。

私たちが知っているように、唯一の定数は変化です。料金が変わるとしましょう(変わるでしょう)。ソースへのアクセスを失った場合、適切なメンテナンスに対応できません。税率が一律の VAT から別の税率に分割された場合、システムの更新はさらに困難になります。

この問題は起きているわけではありません。英国では、12 月 1 日から VAT が 17.5% から 15% に引き下げられました。多くの人は、料金を更新することができない古いソフトウェアを使い続けています。この間違いをしないようにしてください (また、レートをデータベースに分割すると、他にも多くの改善が得られます)。

于 2008-11-28T15:01:47.987 に答える
1

税率をアプリケーション構成 (web.config ファイルや app.config ファイルなど) に保存しないのはなぜですか? これらは単純な XML ファイルで、キーと値でカスタム パラメーターを指定できるというセクションがあります。例えば:

<appSettings>
    <add key="BaseTaxRate" value=20"/>
    <add key="HigherTaxRate" value=40"/>
</appSettings>

次に、アプリケーションでこれらを簡単に取得できます。

string baseTaxRate = ConfigurationSettings.AppSettings["BaseTaxRate"];

このように、それらは簡単に変更でき、アプリケーションの再コンパイルと再デプロイは必要ありません。

もちろん、税率の名前を追加設定として構成ファイルに保存することもできます。

于 2008-11-28T11:22:33.870 に答える