Java Fluent数学API约定
我目前正在为四元数、矩阵等制作小型数学api。。。我在开发这些方法的时候遇到了一个问题,那就是如何正确地设计这些方法,使其能够流畅地使用 给出这个例子Java Fluent数学API约定,java,coding-style,fluent,api-design,calling-convention,Java,Coding Style,Fluent,Api Design,Calling Convention,我目前正在为四元数、矩阵等制作小型数学api。。。我在开发这些方法的时候遇到了一个问题,那就是如何正确地设计这些方法,使其能够流畅地使用 给出这个例子 public class Quaternion { private double q0,q1,q2,q3; public Quaternion slerp(Quaternion other, float amt){ // Some calculations // First option return
public class Quaternion {
private double q0,q1,q2,q3;
public Quaternion slerp(Quaternion other, float amt){
// Some calculations
// First option return this and update the object
return this;
// Second option - Create a new Instance
return new Quaternion(res.getQ0(), res.getQ1(), res.getQ2(), res.getQ3());
}
。。。返回结果有两种可能。首先是更新的实例或全新的实例
是否有任何惯例如何设计这样的方法,以便与其他功能(多重、旋转、共轭)一起流畅地使用
例如,Java BigDecimal、BigInteger类被设计为返回一个新对象,而不是返回实际实例
另一方面,一些图书馆正在使用返回此方法
从我这边我发现
Quaternion result = start.slerp(other, 0.25f); // return new object
。。。比这更合理
start.slerp(other, 0.25f); // return this
想象一下,使用第二种方法,您希望在下面使用原始[start]对象进行另一次计算。然后需要在slerp方法之前创建一个temp变量
你方对此有什么经验吗?这些方法中的一种(例如,对于immutabel是新的,对于mutable是返回此值)更常用,还是这只是一个决定一种方法而不是在孔API中坚持它的问题?您希望您的对象是不可变的,比如
bigdecim
,还是希望它们更像构建器模式,像StringBuilder
,您在其中不断修改对象的状态?两种方式都很流利。我认为两者之间的选择与fluent无关。您是希望对象是不可变的,如bigdecimic
,还是希望它们更像构建器模式,如StringBuilder
,在其中不断修改对象的状态?两种方式都很流利。我不相信两者之间的选择与流利无关。