更改函数返回类型的手动重构步骤是什么。 我从 Web 服务端点中提取了一个方法,然后又提取了一个方法对象,以将业务逻辑与 Web 机制分开。但我仍然有一个 Response 的返回类型。 我希望将业务逻辑与 Web 功能完全分离。
public class BusinessLogic {
private boolean flag = true;
public BusinessLogic(String payload) {
flag = Boolean.parseBoolean(payload);
}
/*
The problem with the doLogic method is that the network logic of the response is mixed up in the business logic.
Changing the return value allows us to separate the concerns.
*/
public JavaxWsResponse doLogic() {
if (flag) {
return JavaxWsResponse.build("Success");
}
else {
return JavaxWsResponse.build("Failure");
}
}
您必须能够从旧的返回值映射到新的返回值,然后再映射回来,这样重构才能起作用。
public JavaxWsResponse doLogic() {
return newMethod();
}
public enum BusinessResult {
OK, FAIL;
}
public class ReturnHolder {
public BusinessResult result;
}
public JavaxWsResponse newMethod(ReturnHolder ret) {
if (flag) {
return JavaxWsResponse.build("Success");
}
else {
return JavaxWsResponse.build("Failure");
}
}
public JavaxWsResponse newMethod(ReturnHolder ret) {
if (flag) {
ret.result = BusinessResult.OK; // change 1
return JavaxWsResponse.build("Success");
}
else {
ret.result = BusinessResult.FAIL; // change 2
return JavaxWsResponse.build("Failure");
}
}
public static JavaxWsResponse transmute(BusinessResult businessResult) {
switch (businessResult) {
case OK:
return JavaxWsResponse.build("Success");
case FAIL:
return JavaxWsResponse.build("Failure");
default:
// I review of the code should show that this case is exceptional. but the compiler is picky.
return JavaxWsResponse.build("Unexpected Failure");
}
}
public JavaxWsResponse doLogic() {
ReturnHolder ret = new ReturnHolder();
newMethod(ret);
return HttpEndPoint.transmute(ret.result);
}
public BusinessResult newMethod(ReturnHolder ret) { // change 1. causes compile errors
if (flag) {
return BusinessResult.OK; // change 2. fixes one compile error
}
else {
return BusinessResult.FAIL; // change 3. fixes last error.
}
}
public JavaxWsResponse doLogic() {
ReturnHolder ret = new ReturnHolder();
return HttpEndPoint.transmute(newMethod(ret)); // pass result of new method to transmute.
}
从新方法签名中删除 Holder 参数。
删除 Holder 类。
对于旧方法的每次使用:内联旧方法,删除其使用。 如果旧函数被子类覆盖,则需要对子类执行相同的重构以更改为新签名。
// BFORE
public JavaxWsResponse runBusinessLogic(String payload) {
if (isValid (payload)) {
return new BusinessLogic(payload).doLogic();
}
else {
return JavaxWsResponse.build("error");
}
}
// AFTER
public JavaxWsResponse runBusinessLogic(String payload) {
if (isValid (payload)) {
return HttpEndPoint.transmute(new BusinessLogic(payload).newMethod());
}
else {
return JavaxWsResponse.build("error");
}
}
对于映射函数的每次使用,请考虑是否可以简化或使逻辑更清晰。
将新方法重命名为旧方法。除非你更喜欢这个新名字。