API设计 - 指定方法顺序是一个好习惯吗?

时间:2014-04-18 06:51:28

标签: java api

public abstract class A { 
    private int result=-1;
    public void final doExecuteMySpecialAlgorithm() {
         result=0;
         //do something here and get a new result
         //it won't be -1.
    }
    public int getResult() { 
        if(result==-1) 
             throw new RuntimeException("Invoke my special algorithm first!");
        return result;
    }
}

Isn的getResult方法设计不好 - 强制用户在调用之前调用另一个方法?你会如何解决这个问题?你宁愿返回-1还是说null(如果是对象类型)并让调用者弄清楚要做什么就会返回null?或者如果你确定它不会为null,但是为了返回不为null,你必须在调用getResult方法之前调用另一个方法,你会抛出一个RuntimeException吗? (或检查过的例外?)

2 个答案:

答案 0 :(得分:2)

这里有两种方式。使其同步(即doExecuteMySpecialAlgorithm实际返回结果)或异步。

第一个是显而易见的,第二个可以通过返回Future对象来完成。无论哪种方式,调用者都不需要考虑调用方法的正确顺序。

在某些情况下,强制执行方法的调用顺序(例如加密类中的doFinal方法)可能没问题,但是您仍然应该避免以用户必须仔细思考的方式编写代码关于他如何打电话给你的方法。显然他需要知道要调用什么,但如果他需要按特定顺序调用5个方法,则可能意味着应该只有1个方法。

我的意思是,如果你想强迫来电者按顺序拨打method1()method2()method3(),你应该让他打电话给method(),内部调用私有方法method1()method2()method3()。这样你就可以很好地构建代码,但是调用者可以通过以错误的顺序调用方法来捏造代码。

答案 1 :(得分:1)

在您的示例中,我会执行以下操作:

public abstract class A { 
    private int result=-1;
    public void final doExecuteMySpecialAlgorithm() {
         result=0;
         //do something here and get a new result
         //it won't be -1.
    }
    public int getResult() { 
        if(result==-1) 
             doExecuteMySpecialAlgorithm();
        return result;
    }
}

这样一来,用户可以先执行'特殊'算法,或者如果他们'忘记',你(作为API编写者)抓住它并执行此操作(而不是抛出错误)。

这样做可以让你的对象为你工作(面向对象的设计),当然这是你的API设计,我会假设有大量文档规定如果我打电话给getResult我必须首先调用doExecuteMySpecialAlgorithm ...无论你选择实现什么,你必须记录用户被命令在函数Y之前调用函数X或者可能导致未定义的行为(或抛出错误)。