应将文字替换为通用接口

时间:2019-09-23 09:21:43

标签: java design-patterns literals

我正在编写使用策略模式的代码,但是我不确定是否会过度使用我正在使用的抽象量。 我正在使用各种概率分布(例如正态分布或均匀分布)为应用程序随机生成数字,或者不断生成数字(根本不是随机生成的

不同的算法具有不同的文字返回类型,有些返回Ints,而另一些返回Floats和Doubles。

遵循接口隔离原则,我创建了ITYPEValuePicker接口,每个接口具有以下定义:

public interface ITYPEValuePicker
{
    public TYPE getTYPE();
}

其中“ TYPE”是特定的数据类型,例如float,int等。

现在我的随机算法实现了这些接口,并且可以在代码中使用

GaussianValuePicker implements IFloatValuePicker, IDoubleValuePicker

UniformValuePicker implements IFloatValuePicker, IDoubleValuePicker, IIntValuePicker

ConstantValuePicker implements IIntValuePicker, IFloatValuePicker, IDoubleValuePicker

我的代码的很大一部分取决于随机选择的值和随机选择的算法来选择这些值。我的问题是: 为什么我不应该用这些通用的“ IValuePicker”替换所有幻数,而将实际获得的任何值都委派给特定算法呢?

例如:

public class chicken
{
    float height;
    int age;

    public chicken(float height, int age)
    {
        this.height = height;
        this.age = age;
    }

    public boolean isSuperOld()
    {
        if (age > 99) 
        {
            return true;
        }
        return false;
    }
}

vs

public class chicken
{
    IFloatValuePicker height;
    IIntValuePicker age;

    public chicken(IFloatValuePicker height, IIntValuePicker age)
    {
        this.height = height;
        this.age = age;
    }

    public boolean isSuperOld()
    {
        if (age.getInt() > 99) 
        {
            return true;
        }
        return false;
    }
}
抱歉,对于人为的示例,但我希望它能说明对不同值的延迟评估,几乎是(懒惰的(我不确定这是正确的术语吗?)?)。这是YAGNI的一个示例(我知道它是否是YAGNI都是相当复杂的上下文),或者这是对接口的有效使用吗?

1 个答案:

答案 0 :(得分:0)

在您的计算器代码中将int/double/BigDecimal(全部为Number)中使用Number,例如:

float x = 0.12F;
Number n = x;
n = n.longValue() * 9;
x = n.doubleValue(); // 0.0F

包装类我从未发现有帮助-只有一种像JavaScript Basic一样的变量类型变量,但是它们也不是最优的。

那么API用户必须准备数据就是生命。