1

更新主な質問は例の下にあるもののままですが、私はそれが要約すると:

**値の99%を1つの高速で強力なタイプで表現でき、非常に重いタイプでは1%しか表現できないタイプがある場合(たとえば、intとBigInteger)それを表現する方法は?? ****

私たちが内部表現について多くを学んだ学校ですが、実行時にそれを変更する方法は決してありません。つまり、小数を表すクラスがあるが、実際に整数よりも大きな値が必要になるまで、そして表現を変更するだけで、整数を使用して内部を表すとします。

私はこれまでこれについて考えたことはありませんでした、そしてそれを考えるとき、すべてのチェックがそれを殺すので、それは決してうまくいかないと思いました。しかし、私は自分の利益のためにあまりにも興味があり、表現の変更がより永続的である状況が存在するため、テストを行いました:このインターフェイスを考えると:

interface INumber
    {
        void add1000();
        void SetValue(decimal d);
        decimal GetValue();                     
    } 

2つの実装の後者は、多くの状況でより強力であることがわかりました。これには、この問題についてできるだけ多くのアイデアを引き付けるために作成したものも含まれます(担当者ではなく、コミュニティです)。

    1. Representation by only a decimal

        public class Number1:INumber
        {

            private decimal d { get; set; }


            public void add1000()
            {
                d += 1000;
            }



            public decimal GetValue()
            {
                return d;
            }



            public void SetValue(decimal d)
            {
                this.d = d;
            }

        }


2. Representation by a decimal and an int

public class Number2:INumber
    {
        private bool usedecimal; 
        private int i;
        private decimal d;

        public void add1000()
        {
            if (usedecimal)
            {
                d += 1000;
                return; 
            }

            i += 1000;

            if (i > 2147480000)
            {
                d = i;              
                usedecimal = true;              
            }


        }

        public void SetValue(decimal d)
        {
            try
            {
                i = (int)d;

            }
            catch (OverflowException e)
            {

                this.d = d;
            }

        }

        public decimal GetValue()
        {
            return Math.Max(i,d);
        }
    }
}

私の質問は次のとおりです。

これはsthのようです。私は行方不明になっていますが、これは明らかな出血であるに違いありません。誰かがこれで私を助けることができますか?

  • 混合表現のガイドラインはありますか、使用する場合と使用しない場合はありますか?
  • 混合表現がベンチマークなしでより速くなることができるとき、どのように予感を持っていますか?
  • 例はありますか?
  • パターンはありますか?
  • この問題について何かアイデアはありますか?
4

2 に答える 2

8

値の99%を1つの高速で強力なタイプで表現でき、非常に重いタイプでは1%しか表現できないタイプがある場合(たとえば、intとBigInteger)、どのように表現するのですか?

BigIntegerの実装は通常、まさにそれを実行します。それらは、何かがオーバーフローするまですべてをintまたはlongに保持し、その後、より重い実装に進みます。

それを表現する方法はいくつもあります。私が好きなパターンは次のとおりです。

public abstract class Thing
{
    private class LightThing : Thing
    { ... }
    private class HeavyThing : Thing 
    { ... }
    public static Thing MakeThing(whatever) 
    { /* make a heavy or light thing, depending */ }
    ... etc ...
}

混合表現のガイドラインはありますか、使用する場合と使用しない場合はありますか?

もちろん。このようなリストは簡単に編集できます。この手法は、次の場合に意味があります。

(1)軽量の実装は重量のある実装よりもはるかに軽量です

(2)通常の使用法は、ほとんどの場合、軽量のコードパスに分類されます。

(3)遷移を検出するコストは、ヘビーウェイトソリューションのコストと比較して重要なコストではありません

(4)顧客重視の現実的なパフォーマンス目標を達成するには、より複雑な2表現ソリューションが必要です。

混合表現がベンチマークなしでより速くなることができるとき、どのように予感を持っていますか?

しないでください。勘に基づいてパフォーマンスを決定することは、事実に先立って推論することです。ハンチではなく、現実的顧客重視データ駆動型分析でパフォーマンスの決定を推進します。何年にもわたってパフォーマンス分析について1つのことを学んだとしたら、それは私の勘が通常間違っているということです。

例はありますか?

BigIntegerの任意の数の実装。

パターンはありますか?

私の一体を打ち負かす。私はパターン分類法を覚えるのはあまり好きではありません。

この問題について何かアイデアはありますか?

上記を参照。

于 2009-11-10T21:47:11.253 に答える
0

おそらくあなたはブリッジパターンを探しています。

于 2009-11-10T20:14:33.953 に答える