美文网首页
编码思路

编码思路

作者: 行走的鸡汤哥 | 来源:发表于2019-05-18 10:23 被阅读0次

编码,应按照总-分的思路编写:先写整体的大框架,后续再实现具体细节
假设要实现用户登录判断的需求,其中需要判断验证码、用户名、密码等是否合法及用户名与密码是否匹配,那么我们第一步的代码应如下:

第一步:编写整体框架

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;
    }
}

第二步:实现具体判断逻辑

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被计算了两次。但假如为了复用header中生成的sign,整个代码就不会这么清晰了。
具体实践中,应根据实际情况权衡是否要做到如此层次分明:
当sign的计算较简单时,可以重复计算;
当sign的计算较耗费资源时,则应复用。

相关文章

  • 编码思路

    编码,应按照总-分的思路编写:先写整体的大框架,后续再实现具体细节。假设要实现用户登录判断的需求,其中需要判断验证...

  • 生成一棵固定大小的随机结构的树(c++)

    思路 生成随机的 prufer 编码,再将 prufer 编码还原成树。 实现

  • 【课堂笔记】关于DES编码译码的结构相同的理解

    (作业P121-4.7) 思路: 用公式来表示编码结构的功能,将加密的文章用编码公式“编码”后得到原文来证明编码的...

  • iOS js与原生交互图片base64解码问题

    解决思路 正常解码思路 DataURL解码思路 问题分析 h5端对图片进行Base64编码,如果利用的是canva...

  • Stacking的思路及编码

     在kaggle上打比赛的时候发现,利用ensemble的思路对Base model进行集成是一个对最终模型影响较...

  • iOS H5与原生交互图片base64解码问题

    正常解码思路 DataURL解码思路 h5端对图片进行Base64编码,如果利用的是canvas.toDataUR...

  • 霍夫曼编码

    问题: 请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短 思路:使用霍夫曼编码构造字符串编码...

  • LCWechat -- socket编解码

    前言 正文 思路: 设计 文件结构 分块讲解 协议 - LCSocketCoderProtocol 编码器 - L...

  • 极限桥。

    极限桥的一种设计思路是:为常用单词编码,使用二维或者三维编码;根据矩长配组、解算;用单词编码解码计算结果,启动相关...

  • 直播项目笔记(五)

    GIF + 视频采集 + GPUImage + 视频编码 播放 Gif 图 需要使用ImageIO框架 思路:1....

网友评论

      本文标题:编码思路

      本文链接:https://www.haomeiwen.com/subject/ovmzaqtx.html