1

これは、ランダムクラスのラッパー拡張機能を使用しているコードです。

public static class RandomHelper
{
    private static int currentSeed;
    private static Random rd = new Random();

    public static double Next()
    {
        return rd.NextDouble();
    }

    public static double Next(double min, double max)
    {
        return (rd.NextDouble() * (max - min)) + min;
    }

    public static double NextOnStep(double min, double max, double step)
    {
        int range = (int)Math.Floor((max - min) / step);
        int stepCount = rd.Next(0, range);
        return min + (step * stepCount);
    }

    public static double NextOnDecimalCount(double min, double max, int decimals)
    {
        double step = Math.Pow(10, decimals);
        return Math.Truncate(((rd.NextDouble() * (max - min)) + min) * step) / step;
    }

そして、この状況を想像してみてください。私は3つの範囲の数を含むクラスを持っています

public class ArithmeticProblemGenerator()
{
    Range Number1Range {get;set;}
    Range Number2Range {get;set;}
    ...
    Range Number5Range {get;set;}
}

public class Range
{
    public Range()
    {
    }

    public Range(double min, double max)
    {
        this.Min = min;
        this.Max = max;
    }

    public double Min { get; set; }
    public double Max { get; set; }
}

そして、問題を生成したいときは、RandomHelperにextesionとして別のメソッドを追加します。

    #region RandomHelper extensions

    public static double Next(Range range)
    {
        return Next(range.Min, range.Max);
    }

    public static double NextOnStep(Range range, double step)
    {
        return NextOnStep(range.Min, range.Max, step);
    }

    public static double NextOnDecimalCount(Range range, int decimals)
    {
        return NextOnDecimalCount(range.Min, range.Max, decimals);
    }

    #endregion

しかし、次にArithmeticProblemGeneratorの新機能を追加します。小数点以下の桁数が異なる数値が必要な場合や、ステップの後に数値が続く場合があります。

それで、私は、次の機能を追加するために、さらに2つのクラスを作成するのが良いと思いました。

public class RangeOnStep : Range
{
    public RangeOnStep()
    {
    }

    public RangeOnStep(double min, double max, double step)
        : base(min, max)
    {
        this.Step = step;
    }

    public double Step { get; set; }
}

public class RangeOnDecimalPlace : Range
{
    public RangeOnDecimalPlace()
    {
    }

    public RangeOnDecimalPlace(double min, double max, double decimalPlaces)
        : base(min, max)
    {
        this.DecimalPlaces = decimalPlaces;
    }

    public double DecimalPlaces { get; set; }
}

そして、これらの新しいクラスで別のメソッド拡張を追加します。私は良い仕事をしていると思いますか、それともデザインがめちゃくちゃだと思いますか?

提案や意見を聞きたいです。前もって感謝します。

4

2 に答える 2

1

ここではメソッド拡張は役に立ちません。基本クラスの範囲を使用して、次のようなオーバーライドされたメソッドを定義してみませんか。

public static class RandomHelper {private static int currentSeed; private static Random rd = new Random();

public static double Next() 
{ 
    return rd.NextDouble(); 
} 

public static double Next(double min, double max) 
{ 
    return (rd.NextDouble() * (max - min)) + min; 
} 

public static double Next(RangeOnStep r) 
{ 
    int range = (int)Math.Floor((r.max - r.min) / r.step); 
    int stepCount = rd.Next(0, range); 
    return r.min + (step * stepCount); 
} 

public static double Next(RangeOnDecimalPlace r)) 
{ 
    double step = Math.Pow(10, r.decimals); 
    return Math.Truncate(((rd.NextDouble() * (r.max - r.min)) + r.min) * step) / step; 
} 
于 2012-07-29T06:59:51.217 に答える
0

静的ヘルパークラス(拡張メソッドであるかどうかに関係なく)を使用するときに私が見つけた問題の1つは、これらの静的に依存する単体テストコードに関してはモックが難しいことです。乱数ジェネレーターが特定の範囲の値を返すケースをテストしたいのは間違いないので、これはあなたのケースにも当てはまります。

私は通常、静的ヘルパーをインターフェイス付きのインスタンスクラスに置き換えてから、IoCを使用して「ヘルパー」のシングルトンを依存クラスに注入しようとしました(つまり、インターフェイスでのみ結合されます)-このようにして、ヘルパーをモックしてクラスは完全にテストされています。

于 2012-07-29T06:25:34.143 に答える