Java类接口设计问题

时间:2010-11-22 01:42:34

标签: java oop design-patterns

我有一个班级(MiddleMan)与系统进行对话,这个讲话由MiddleMan的客户初始化。

如果'talk'成功完成,MiddleMan将生成一个令牌并将其返回给其客户端。

我目前的课堂设计如下:


class MiddleMan{
    private String token = null;
    private String param1;
    private String param2;
    private String amount;

    boolean isTalkSuccessful = false;

    public MiddleMan(String param1, String param2){
    this.amount = amount;
    this.param1 = param1;
    this.param2 = param2;
    }

    public String talk() throws ValidationException{

      //a private method validates param1 and param2
    validateParameters();

     //talk to backend system;
    isTalkSuccessful = talkToSystem();


    }

    Private void validateParameters() throws ValidationException {

    }

    private boolen talkToSystem(){

    }


    public boolean isTalkSuccessful(){
      return isTalkSuccessful;
    }

    public String getToken() throws Exception{
       if(isTalkSuccessful()){
          return token;
      }else{
        throw new Exception("cannot return token because talk is not  successful");
      }

     }



}

这看起来对你好吗?你会如何重构它?

2 个答案:

答案 0 :(得分:3)

  1. amount发挥作用的地方。它不在实例变量列表中,也不在构造函数参数中。您需要在代码段中修复此问题以避免混淆。
  2. 参数的验证应该在构造函数中完成。如果参数无效,则从构造函数中抛出一些适当的异常。 talk()方法不应该像其名称所暗示的那样进行验证。
  3. 我可以看到您在isTalkSuccessful()中调用getToken()方法。我假设您希望客户端在调用getToken()之前检查此项以避免异常。不是吗?如果客户没有拨打isTalkSuccessful(),您就可以办理检查。正确?因此,如果避免异常是重点,为什么不抛出任何异常。让我们摆脱那个公共方法isTalkSuccessful(),让客户打电话给getToken()。在getToken()方法中,检查私有字段isTalkSuccessful,如果为false则返回null。为什么不呢?
  4. 你真的需要setToken()吗?谁会援引它?

答案 1 :(得分:0)

假设您先调用talk()然后通过调用getToken()生成令牌:

您是否需要设置token变量?它使用空值初始化,永远不会被修改。在您成功完成talkToSystem()调用之后,我猜您需要在talk()方法中将token设置为您想要的任何内容。

哦,这里的“金额”是什么?

this.amount = amount;