是否应将文字替换为通用接口
Should literals be replaced by generic interfaces
我正在编写使用策略模式的代码,但是我不确定我是否过度使用了我正在使用的抽象量。
我使用正态分布或均匀分布等各种概率分布为我的应用程序随机生成数字,或者不断生成数字(根本不是随机的)
不同的算法有不同的文字 return 类型,一些是 return 整数,而另一些是 return 浮点数和双精度数。
遵循接口隔离原则,我创建了 ITYPEValuePicker 接口,每个接口都有以下定义:
public interface ITYPEValuePicker
{
public TYPE getTYPE();
}
其中"TYPE"是特定的数据类型,如float、int等
现在我的随机算法实现了这些接口,可以在代码中使用
GaussianValuePicker implements IFloatValuePicker, IDoubleValuePicker
和
UniformValuePicker implements IFloatValuePicker, IDoubleValuePicker, IIntValuePicker
和
ConstantValuePicker implements IIntValuePicker, IFloatValuePicker, IDoubleValuePicker
我的代码的很大一部分依赖于随机 selected 值和随机 selected 算法到 select 这些值。我的问题是:
为什么我不应该用这些通用 "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 的上下文很重)还是接口的有效使用?
在你的计算代码中使用 Number int/double/BigDecimal
(都是 Number
)等等:
float x = 0.12F;
Number n = x;
n = n.longValue() * 9;
x = n.doubleValue(); // 0.0F
Wrapping 类 我从来没有发现有用的 - 只有一种变量类型变量,比如 JavaScript 的 Basic,但它们也远非最佳。
那么 API 用户必须准备数据就是生命。
我正在编写使用策略模式的代码,但是我不确定我是否过度使用了我正在使用的抽象量。 我使用正态分布或均匀分布等各种概率分布为我的应用程序随机生成数字,或者不断生成数字(根本不是随机的)
不同的算法有不同的文字 return 类型,一些是 return 整数,而另一些是 return 浮点数和双精度数。
遵循接口隔离原则,我创建了 ITYPEValuePicker 接口,每个接口都有以下定义:
public interface ITYPEValuePicker
{
public TYPE getTYPE();
}
其中"TYPE"是特定的数据类型,如float、int等
现在我的随机算法实现了这些接口,可以在代码中使用
GaussianValuePicker implements IFloatValuePicker, IDoubleValuePicker
和
UniformValuePicker implements IFloatValuePicker, IDoubleValuePicker, IIntValuePicker
和
ConstantValuePicker implements IIntValuePicker, IFloatValuePicker, IDoubleValuePicker
我的代码的很大一部分依赖于随机 selected 值和随机 selected 算法到 select 这些值。我的问题是: 为什么我不应该用这些通用 "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 的上下文很重)还是接口的有效使用?
在你的计算代码中使用 Number int/double/BigDecimal
(都是 Number
)等等:
float x = 0.12F;
Number n = x;
n = n.longValue() * 9;
x = n.doubleValue(); // 0.0F
Wrapping 类 我从来没有发现有用的 - 只有一种变量类型变量,比如 JavaScript 的 Basic,但它们也远非最佳。
那么 API 用户必须准备数据就是生命。