我有一个班级(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");
}
}
}
这看起来对你好吗?你会如何重构它?
答案 0 :(得分:3)
amount
发挥作用的地方。它不在实例变量列表中,也不在构造函数参数中。您需要在代码段中修复此问题以避免混淆。talk()
方法不应该像其名称所暗示的那样进行验证。isTalkSuccessful()
中调用getToken()
方法。我假设您希望客户端在调用getToken()
之前检查此项以避免异常。不是吗?如果客户没有拨打isTalkSuccessful()
,您就可以办理检查。正确?因此,如果避免异常是重点,为什么不抛出任何异常。让我们摆脱那个公共方法isTalkSuccessful()
,让客户打电话给getToken()
。在getToken()
方法中,检查私有字段isTalkSuccessful
,如果为false则返回null
。为什么不呢?setToken()
吗?谁会援引它?答案 1 :(得分:0)
假设您先调用talk()然后通过调用getToken()生成令牌:
您是否需要设置token
变量?它使用空值初始化,永远不会被修改。在您成功完成talkToSystem()调用之后,我猜您需要在talk()方法中将token
设置为您想要的任何内容。
哦,这里的“金额”是什么?
this.amount = amount;