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;
    }

想象一下这种情况,我有一个包含三个数字范围的类

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 中添加另一个方法作为扩展。

    #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 的一个新功能,我想要具有不同小数位的数字,或者有时数字跟随一个步骤。

所以,我想,创建另外两个类来添加以下功能会很好。

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

方法扩展在这里没有用,为什么不使用基类范围并定义覆盖的方法,例如:

公共静态类 RandomHelper { 私有静态 int currentSeed; 私有静态随机 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

我在使用静态辅助类(无论是否扩展方法)时发现的一个问题是,当涉及到依赖于这些静态的单元测试代码时,它们很难模拟。这也适用于您的案例,因为您无疑希望测试随机数生成器返回特定范围内的值的案例。

我通常尝试用带接口的实例类替换静态助手,然后使用 IoC 将“助手”的单例注入到我的依赖类中(即仅耦合到接口上)——这样可以模拟助手并您的课程经过全面测试。

于 2012-07-29T06:25:34.143 回答