首页 > 解决方案 > 应该用通用接口替换文字

问题描述

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

不同的算法有不同的文字返回类型,一些返回 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;
    }
}

对比

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 是相当繁重的上下文)还是这是对接口的有效使用?

标签: javadesign-patternsliterals

解决方案


在您的计算器代码中使用Numberint/double/BigDecimal for (all are Number) 等:

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

包装类我从来没有发现有用 - 只有一种变量类型变量,如 JavaScript 的 Basic,但它们也远非最佳。

然后 API 用户必须准备数据就是生命。


推荐阅读