編碼,應(yīng)按照總-分的思路編寫:先寫整體的大框架,后續(xù)再實現(xiàn)具體細節(jié)。
假設(shè)要實現(xiàn)用戶登錄判斷的需求,其中需要判斷驗證碼、用戶名、密碼等是否合法及用戶名與密碼是否匹配,那么我們第一步的代碼應(yīng)如下:
第一步:編寫整體框架
public class LoginService {
public String login(UserInfo userInfo) {
boolean codeIsLegal = verifyCode(userInfo.getCode());
if (!codeIsLegal) {
return "驗證碼錯誤!";
}
boolean nameIsLegal = verifyName(userInfo.getName());
if (!nameIsLegal) {
return "用戶名不合法!";
}
boolean passIsLegal = verifyPass(userInfo.getPassword());
if (!passIsLegal) {
return "密碼不合法";
}
boolean nameMatchedPass = verifyNameNPass(userInfo.getName(), userInfo.getPassword());
if (!nameMatchedPass) {
return "用戶名與密碼不匹配!";
}
return "登錄成功";
}
}
class UserInfo {
private String name;
private String password;
private String code;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
第二步:實現(xiàn)具體判斷邏輯
public class LoginService {
public String login(UserInfo userInfo) {
boolean codeIsLegal = verifyCode(userInfo.getCode());
if (!codeIsLegal) {
return "驗證碼錯誤!";
}
boolean nameIsLegal = verifyName(userInfo.getName());
if (!nameIsLegal) {
return "用戶名不合法!";
}
boolean passIsLegal = verifyPass(userInfo.getPassword());
if (!passIsLegal) {
return "密碼不合法";
}
boolean nameMatchedPass = verifyNameNPass(userInfo.getName(), userInfo.getPassword());
if (!nameMatchedPass) {
return "用戶名與密碼不匹配!";
}
return "登錄成功";
}
private boolean verifyCode(String code) {
return code.equals("6666");
}
private boolean verifyName(String name) {
return name.equals("admin");
}
private boolean verifyPass(String password) {
return password.equals("admin");
}
private boolean verifyNameNPass(String name, String password) {
return true;
}
}
class UserInfo {
private String name;
private String password;
private String code;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
醬紫寫,思路清晰代碼層次分明,易于閱讀及維護。
但代碼層次太分明時,也會有弊端。如下所示:模擬請求API接口
public class HttpService {
public JSONObject queryData(RequestVO vo) {
Map<String, String> header = buildHeader(vo);
JSONObject body = buildBody(vo);
String result = exeHttpRequest(header, body);
return JSON.parseObject(result);
}
private String exeHttpRequest(Map<String, String> header, JSONObject body) {
return "{\"code\":0,\"msg\":\"請求成功\"}";
}
private JSONObject buildBody(RequestVO vo) {
String sign = generateSign(vo);
JSONObject body = new JSONObject();
body.put("name", vo.name);
body.put("phone", vo.phone);
body.put("sign", sign);
return body;
}
private Map<String, String> buildHeader(RequestVO vo) {
String sign = generateSign(vo);
Map<String, String> header = new HashMap<>(2);
header.put("content-type", "application/json");
header.put("sign", sign);
return header;
}
private String generateSign(RequestVO vo) {
return MD5Encoder.encode((vo.name + vo.phone).getBytes());
}
}
class RequestVO {
String name;
String phone;
}
從代碼中可看出,sign被計算了兩次。但假如為了復(fù)用header中生成的sign,整個代碼就不會這么清晰了。
具體實踐中,應(yīng)根據(jù)實際情況權(quán)衡是否要做到如此層次分明:
當sign的計算較簡單時,可以重復(fù)計算;
當sign的計算較耗費資源時,則應(yīng)復(fù)用。