我正在使用坐标/向量构建数学库。
有一个ReadableCoord
和WritableCoord
个互动。
AbstractCoordValue
可以扩展为覆盖坐标getter。
问题是,不可变coord(AbstractCoordValue)中的方法可以通过两种方式实现,如 VARIANT 1 和 VARIANT 2 。
我的DRY胆量告诉我去第一个(然后impl只在一个地方),但我不确定第二个没有更少的开销。
使用哪一个?
public abstract class AbstractCoordValue implements ReadableCoord {
// x(), y(), z() are abstract getters from the interface
@Override
public WritableCoord copy()
{
return new CoordVariable(x(), y(), z());
}
/* VARIANT 1 */
@Override
public WritableCoord add(double x, double y, double z)
{
return copy().add_ip(x(), y(), z()));
}
/* VARIANT 2 */
@Override
public WritableCoord add(double x, double y, double z)
{
return new CoordVariable(x()+x, y()+y, z()+z));
}
// --- snip ---
}
扩展类,可变:
public class CoordVariable extends AbstractCoordValue implements WritableCoord {
private double x, y, z;
// implements x(), y(), z() as getters
public CoordVar(double x, double y, double x) {
this.x = x;
this.y = y;
this.z = z;
}
@Override // "_ip" stands for "in place"
public WritableCoord add_ip(double x, double y, double z)
{
this.x += x;
this.y += y;
this.z += z;
return this;
}
// --- snip ---
}
答案 0 :(得分:0)
我建议使用实现Readable
接口的不可变坐标实现final类,使用实现Readable
和Writable
接口的可变坐标实现另一个类 - 即避免使用继承,因为扩展了不可变使用mutable的实现违反了LSP(Liskov替换)原则,并且包含了像可变类一样处理可变类的潜在漏洞。