java - 文字是否应该被通用接口(interface)替换

标签 java design-patterns literals

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

不同的算法有不同的文字返回类型,有些返回 Int,而另一些则返回 Floats 和 Double。

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

public interface ITYPEValuePicker
{
    public TYPE getTYPE();
}

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

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

GaussianValuePicker implements IFloatValuePicker, IDoubleValuePicker

UniformValuePicker implements IFloatValuePicker, IDoubleValuePicker, IIntValuePicker

ConstantValuePicker implements IIntValuePicker, IFloatValuePicker, IDoubleValuePicker

我的代码的很大一部分取决于随机选择的值和随机选择的算法来选择这些值。我的问题是: 我是否有理由不应该用这些通用的“IValuePicker”替换所有魔数(Magic Number),并将任何值的实际获取委托(delegate)给特定算法。

例如:

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 与上下文有关)还是这是接口(interface)的有效使用?

最佳答案

使用Numberint/double/BigDecimal 的计算代码中(全部都是 Number),例如:

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

我从未发现包装类有帮助 - 只是一种变量类型变量,例如 JavaScript 的 Basic,但它们也远非最佳。

API 用户必须准备数据,这就是生命。

关于java - 文字是否应该被通用接口(interface)替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58059306/

相关文章:

c - 字符串文字是否算作部分初始化器和零初始化?

c# - 如何在字符串文字中引用\"(斜杠双引号)?

java - Gradle + TestNG 仅将某些测试作为单个测试运行

java - 如何在不写入 "if statements"的情况下初始化输入字段?

c# - 在这种情况下使用什么设计模式?

.net - 什么是MVVM?有什么用? [复制]

python - 跨越一行以上的字节串

java - 用 Java 6 替换 Java 7

java.lang.NoSuchMethodError : org. springframework.http.MediaType.getCharset()Ljava/nio/charset/Charset 错误

java - Java 字符串 UTF8 和 String8 之间的区别?