【发布时间】:2018-06-12 13:40:47
【问题描述】:
当您有两个通用名称方法执行相同的操作,而一个是不可变而另一个是可变时,命名约定是什么>?
示例
考虑接受 2 个数字数组的单元格操作:不可变版本创建一个新数组来放入结果,而可变版本将结果存储在第一个数组参数中。
由于方法名称是通用名称,例如apply,因为操作策略(add,sub,mul,div)由第三个参数指定,因此您不能使用add之类的常用词来实现可变性(a = a + 1 ) 和 plus 表示不变性 (c = a + b)。
代码(将被跳过)
以下细节可能是题外话,但为了说明我在说什么方法:
@FunctionalInterface
public interface BinaryOperation { double apply(double a, double b); }
public final class BinaryOperations {
private BinaryOperations() {}
public static final BinaryOperation ADD = (a, b) -> a + b;
public static final BinaryOperation SUB = (a, b) -> a - b;
public static final BinaryOperation MUL = (a, b) -> a * b;
public static final BinaryOperation DIV = (a, b) -> a / b;
}
public final class DoubleArraysMath {
private DoubleArrayMath() {}
// ---> METHOD NAME OF INTEREST
public static void applyAsMutable(double[] a, double[] b, BinaryOperation o) {
apply(a, a, b, o);
}
// ---> METHOD NAME OF INTEREST
public static double[] applyAsImmutable(double[] a, double[] b, BinaryOperation o) {
double[] c = new double[a.length];
return apply(c, a, b, o);
return c;
}
private static void apply(double[] result, double[] a, double[] b, BinaryOperation o) {
for (int i = 0; i < a.length; i++) { result[i] = o.apply(a[i], b[i]); }
}
}
// just an example of usage
double[] r = DoubleArraysMath.applyAsImmutable(a, b, BinaryOperations.MUL);
DoubleArraysMath.applyAsMutable(a, b, BinaryOperations.ADD);
DoubleArraysMath.applyAsMutable(a, b, (ai, bi) -> ai*ai + bi); // some custom operation
单独的类
在DoubleArraysMutableMath 和DoubleArraysImmutableMath 类中分隔可变和不可变方法可避免在每个方法名称的开头/结尾写入“可变/不可变”前缀/后缀。按照这种模式,您最终会得到任何名为“可变/不可变”的实用程序类(它是否好用,我将作为一个悬而未决的问题留下)。
单类问题
如果我们想在单个类中拥有这些方法(更好的维护),正确的命名“模式”是什么?我在代码示例中使用的模式“asMutable/asImmutable”或通常的“可变/不可变”可能与较长的方法名称不兼容。还有其他选择吗?
【问题讨论】:
标签: language-agnostic naming-conventions immutability