国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

消除代碼壞味道:及時(shí)重構(gòu)降低過長(zhǎng)代碼行數(shù)

共 28046字,需瀏覽 57分鐘

 ·

2021-04-12 16:29

本文是筆者新書中關(guān)于編碼與重構(gòu)技巧的一節(jié),希望文章中的案例與思考能夠幫助讀者在日常開發(fā)中,消除過長(zhǎng)代碼帶來的壞味道,提升代碼可讀性。

在日常開發(fā)過程中,過長(zhǎng)的代碼行數(shù)也是一種壞味道。

筆者認(rèn)為一個(gè)方法行數(shù)至少不能超過一屏,換算成行數(shù)大約是50行左右。這是一種偏感性的認(rèn)識(shí),如果超過一屏,就需要不斷上下翻動(dòng),影響代碼的閱讀體驗(yàn)。

代碼行數(shù)過長(zhǎng)之所以會(huì)出現(xiàn),主要原因在于對(duì)業(yè)務(wù)邏輯的編寫過程是平鋪直敘的,或者通俗的講,代碼是“面條式”的,將各種業(yè)務(wù)邏輯都放在一個(gè)方法中。有的程序員會(huì)細(xì)心的通過分段以及配合注釋的方式便于維護(hù)者理解代碼邏輯,而大多數(shù)情況下是幾百行的代碼既沒有注釋有沒有層次感,讓閱讀者心力交瘁。

來看一段這樣的“面條式”代碼,感受一下過長(zhǎng)的代碼行數(shù)帶來的壞味道。

    public PlayerRealNameCheckResponse checkReal(String userCode) throws IOException {
        RestTemplate restTemplate = new RestTemplate();
        PlayerRealNameCheckResponse playerRealNameCheckResponse = new PlayerRealNameCheckResponse();
        // 1. 設(shè)置請(qǐng)求頭
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        // 2. 設(shè)置請(qǐng)求參數(shù)
        String requestUrl = GlobalConstant.CHECK_URL;
        // 要求10位時(shí)間戳,即精確到秒
        String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
        String sign = SignUtil.realCheckSign(userCode, timeStamp, GlobalConstant.KEY);
        MultiValueMap<String, String> requestParam= new LinkedMultiValueMap<>();
        requestParam.add("UserCode", userCode);
        requestParam.add("Timestamp", timeStamp);
        requestParam.add("Sign", sign);
        LOGGER.info("請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證,地址:{}, 入?yún)?{}", requestUrl, JSON.toJSONString(requestParam));
        // 3. 請(qǐng)求開始
        HttpEntity<MultiValueMap<String, String>> requestEntity =
                new HttpEntity<>(requestParam, headers);
        ResponseEntity<String> responseEntity = restTemplate.exchange(
                requestUrl, HttpMethod.POST, requestEntity, String.class);
        // 4. 返回參校驗(yàn)
        if (responseEntity == null) {
            LOGGER.error("[checkReal失敗]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證為空, userCode:{}", userCode);
            return null;
        }
        // 5. 解析返回參
        String checkResponseBody = responseEntity.getBody();
        if (StringUtils.isBlank(checkResponseBody)) {
            LOGGER.error("[checkReal失敗]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證responseBody為空,userCode:{}", userCode);
            return null;
        }
        // 反序列化為JsonNode
        JsonNode responseNode = OBJECT_MAPPER.readTree(checkResponseBody);
        String status = responseNode.get("Status").asText();
        String msg = responseNode.get("Msg").asText();
        JsonNode dataNode = responseNode.get("Data");
        if (dataNode == null) {
            LOGGER.error("[checkReal失敗]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證Json格式異常,缺失data節(jié)點(diǎn).userCode:{}, status:{}, msg:{}",
                    userCode, status, msg);
            return null;
        }
        JsonNode userCodeNode = dataNode.get(userCode);
        if (userCodeNode == null) {
            LOGGER.error("[checkReal失敗]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證Json格式異常,缺失data.userCode節(jié)點(diǎn).userCode:{}, status:{}, msg:{}",
                    userCode, status, msg);
            return null;
        }
        String originUserCode = userCodeNode.get("UserCode").asText();
        String code = userCodeNode.get("Code").asText();
        String isReal = userCodeNode.get("IsReal").asText();
        String isAdult = userCodeNode.get("IsAdult").asText();

        if (GlobalConstant.CODE_REAL_CHECK_STATUS_SUCCESS.equals(status)) {
            LOGGER.info("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證, [獲取數(shù)據(jù)成功!], userCode:{}, userCode:{}, status:{}",
                    userCode, status, msg);
            if (!userCode.equals(originUserCode)) {
                LOGGER.error("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證, [請(qǐng)求userCode與返回userCode不匹配], userCode:{}, originUserCode:{}, status:{}, msg:{}",
                        userCode, originUserCode, status, msg);
                return null;
            }

            playerRealNameCheckResponse.setUserCode(userCode);
            if (code.equals("0")) {
                // 正常游戲用戶
                playerRealNameCheckResponse.setUserStatusCode(PlayerStatusCodeEnum.STATUS_LEGAL.getType());
            } else {
                LOGGER.warn("當(dāng)前用戶為非法用戶,請(qǐng)關(guān)注! userCode:{}", userCode);
                playerRealNameCheckResponse.setUserStatusCode(PlayerStatusCodeEnum.STATUS_ILLEGAL.getType());
            }

            // isREAL 是 0 才校驗(yàn)isAdult 否則不校驗(yàn),因?yàn)閷?duì)面默認(rèn)對(duì)未實(shí)名的玩家標(biāo)記為未成年人
            if (isReal.equals("0")) {
                // 已經(jīng)實(shí)名認(rèn)證
                playerRealNameCheckResponse.setRealCheckStatus(RealCheckStatusEnum.HAS_REAL_CHECK.getType());

                if (isAdult.equals("0")) {
                    playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.ADULT.getType());
                } else if (isAdult.equals("1")) {
                    playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.CHILDREN.getType());
                } else {
                    playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.VISITOR.getType());
                }
                LOGGER.info("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證,[實(shí)名認(rèn)證成功], 返回參playerRealNameCheckResponse:[{}]", JSON.toJSONString(playerRealNameCheckResponse));
            } else {
                // 未進(jìn)行實(shí)名驗(yàn)證的用戶可以判斷為游客模式
                playerRealNameCheckResponse.setRealCheckStatus(RealCheckStatusEnum.NOT_REAL_CHECK.getType());
                playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.VISITOR.getType());
                LOGGER.info("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證,[未成功進(jìn)行實(shí)名認(rèn)證], 返回參playerRealNameCheckResponse:[{}]", JSON.toJSONString(playerRealNameCheckResponse));
            }
            return playerRealNameCheckResponse;
        } else {
            LOGGER.error("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證, [獲取數(shù)據(jù)失敗或異常!], userCode:{}, status:{}, msg:{}",
                    userCode, status, msg);
            return null;
        }
    }

這段代碼主要含義為:請(qǐng)求遠(yuǎn)程的實(shí)名認(rèn)證接口判斷當(dāng)前用戶角色是否為實(shí)名用戶,如圖所示。

這段代碼的主要流程為:

  1. 首先初始化RestTemplate與返回體PlayerRealNameCheckResponse,設(shè)置HTTP請(qǐng)求頭、并將請(qǐng)求參數(shù)設(shè)置到請(qǐng)求體HttpEntity中;
  2. 向遠(yuǎn)程接口發(fā)起HTTP調(diào)用,獲取返回結(jié)果,判斷返回結(jié)果是否為空,如果不為空則獲取返回結(jié)果的ResponseBody,否則請(qǐng)求結(jié)束;
  3. 解析ResponseBody中的狀態(tài)碼、業(yè)務(wù)參數(shù)Data,判斷Data是否為空,如果非空則獲取具體業(yè)務(wù)參數(shù),否則請(qǐng)求結(jié)束;
  4. 獲取用戶狀態(tài)code,判斷code是否為0,如果為0則為正常用戶,否則為非法用戶請(qǐng)求結(jié)束;
  5. 獲取用戶實(shí)名認(rèn)證標(biāo)識(shí)isReal,對(duì)isReal具體值進(jìn)行判斷,如果為0則用戶角色為成年人,如果為1則用戶角色為未成年人,否則為游客;
  6. 組裝實(shí)名認(rèn)證返回體,結(jié)束請(qǐng)求。

回過頭看代碼,會(huì)發(fā)現(xiàn)這段代碼比較長(zhǎng),筆者的開發(fā)環(huán)境中顯示有124行,這已經(jīng)屬于過長(zhǎng)方法的范疇了.

因此需要考慮對(duì)其進(jìn)行重構(gòu)。

(1)首先將請(qǐng)求頭、請(qǐng)求參數(shù)的設(shè)置以及發(fā)送HTTP請(qǐng)求相關(guān)的代碼進(jìn)行抽取,方法名為sendHttpRequest(),代碼如下:

private ResponseEntity<String> sendHttpRequest(String userCode, RestTemplate restTemplate) {
        // 1. 設(shè)置請(qǐng)求頭
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        // 2. 設(shè)置請(qǐng)求參數(shù)
        String requestUrl = GlobalConstant.CHECK_URL;
        // 要求10位時(shí)間戳,即精確到秒
        String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
        String sign = SignUtil.realCheckSign(userCode, timeStamp, GlobalConstant.KEY);
        MultiValueMap<String, String> requestParam= new LinkedMultiValueMap<>();
        requestParam.add("UserCode", userCode);
        requestParam.add("Timestamp", timeStamp);
        requestParam.add("Sign", sign);
        LOGGER.info("請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證,地址:{}, 入?yún)?{}", requestUrl, JSON.toJSONString(requestParam));
        // 3. 請(qǐng)求開始
        HttpEntity<MultiValueMap<String, String>> requestEntity =
                new HttpEntity<>(requestParam, headers);
        return restTemplate.exchange(
                requestUrl, HttpMethod.POST, requestEntity, String.class);
    }

(2)將從responseBody中獲取Data參數(shù)的代碼抽取為獨(dú)立的方法,命名為parseDataFromResponse(),代碼如下:

    private JsonNode parseDataFromResponse(String userCode, JsonNode responseNode) {
        JsonNode dataNode = responseNode.get("Data");
        if (dataNode == null) {
            LOGGER.error("[checkReal失敗]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證Json格式異常,缺失data節(jié)點(diǎn).userCode:{}", userCode);
            return null;
        }
        return dataNode;
    }

(3)將業(yè)務(wù)邏輯中對(duì)用戶角色的判斷單獨(dú)抽取為一個(gè)方法,方法名為selectUserRole,代碼如下:

    private PlayerRealNameCheckResponse selectUserRole(String userCode, PlayerRealNameCheckResponse playerRealNameCheckResponse, String checkResponseBody, JsonNode responseNode, JsonNode dataNode) {
        String msg = responseNode.get("Msg").asText();
        JsonNode userCodeNode = dataNode.get(userCode);
        if (userCodeNode == null) {
            LOGGER.error("[checkReal失敗]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證Json格式異常,缺失data.userCode節(jié)點(diǎn).userCode:{}, msg:{}",
                    userCode, msg);
            return null;
        }

        String status = responseNode.get("Status").asText();
        String originUserCode = userCodeNode.get("UserCode").asText();
        String code = userCodeNode.get("Code").asText();
        String isReal = userCodeNode.get("IsReal").asText();
        String isAdult = userCodeNode.get("IsAdult").asText();

        if (GlobalConstant.CODE_REAL_CHECK_STATUS_SUCCESS.equals(status)) {
            LOGGER.info("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證, [獲取數(shù)據(jù)成功!], userCode:{}", userCode);
            if (!userCode.equals(originUserCode)) {
                LOGGER.error("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證, [請(qǐng)求userCode與返回userCode不匹配], userCode:{}, originUserCode:{}",
                        userCode, originUserCode);
                return null;
            }

            playerRealNameCheckResponse.setUserCode(userCode);
            if (code.equals("0")) {
                // 正常游戲用戶
                playerRealNameCheckResponse.setUserStatusCode(PlayerStatusCodeEnum.STATUS_LEGAL.getType());
            } else {
                LOGGER.warn("當(dāng)前用戶為非法用戶,請(qǐng)關(guān)注! userCode:{}", userCode);
                playerRealNameCheckResponse.setUserStatusCode(PlayerStatusCodeEnum.STATUS_ILLEGAL.getType());
            }

            // isREAL 是 0 才校驗(yàn)isAdult 否則不校驗(yàn),因?yàn)閷?duì)面默認(rèn)對(duì)未實(shí)名的玩家標(biāo)記為未成年人
            if (isReal.equals("0")) {
                // 已經(jīng)實(shí)名認(rèn)證
                playerRealNameCheckResponse.setRealCheckStatus(RealCheckStatusEnum.HAS_REAL_CHECK.getType());

                if (isAdult.equals("0")) {
                    playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.ADULT.getType());
                } else if (isAdult.equals("1")) {
                    playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.CHILDREN.getType());
                } else {
                    playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.VISITOR.getType());
                }
                LOGGER.info("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證,[實(shí)名認(rèn)證成功], 返回參playerRealNameCheckResponse:[{}]", JSON.toJSONString(playerRealNameCheckResponse));
            } else {
                // 未進(jìn)行實(shí)名驗(yàn)證的用戶可以判斷為游客模式
                playerRealNameCheckResponse.setRealCheckStatus(RealCheckStatusEnum.NOT_REAL_CHECK.getType());
                playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.VISITOR.getType());
                LOGGER.info("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證,[未成功進(jìn)行實(shí)名認(rèn)證], 返回參playerRealNameCheckResponse:[{}]", JSON.toJSONString(playerRealNameCheckResponse));
            }
            return playerRealNameCheckResponse;
        } else {
            LOGGER.error("[checkReal]-請(qǐng)求遠(yuǎn)程接口進(jìn)行實(shí)名認(rèn)證, [獲取數(shù)據(jù)失敗或異常!], checkResponseBody:{}", checkResponseBody);
            return null;
        }
    }

(4)對(duì)第(3)步中的代碼繼續(xù)進(jìn)行重構(gòu),將設(shè)置用戶狀態(tài)碼StatusCode的業(yè)務(wù)邏輯進(jìn)行抽取,根據(jù)code設(shè)置用戶為正常用戶還是非法用戶,代碼如下:

    private void setUserStatusCode(String userCode, PlayerRealNameCheckResponse playerRealNameCheckResponse, String code) {
        if (code.equals("0")) {
            // 正常游戲用戶
            playerRealNameCheckResponse.setUserStatusCode(
                    PlayerStatusCodeEnum.STATUS_LEGAL.getType());
        } else {
            LOGGER.warn("當(dāng)前用戶為非法用戶,請(qǐng)關(guān)注! userCode:{}", userCode);
            playerRealNameCheckResponse.setUserStatusCode(
                    PlayerStatusCodeEnum.STATUS_ILLEGAL.getType());
        }
    }

(5)將選擇用戶角色的代碼進(jìn)行抽取,根據(jù)isReal具體值返回用戶角色,代碼如下:

    private void setUserRole(PlayerRealNameCheckResponse playerRealNameCheckResponse, String isReal, String isAdult) {
        // isREAL 是 0 才校驗(yàn)isAdult 否則不校驗(yàn),因?yàn)閷?duì)面默認(rèn)對(duì)未實(shí)名的玩家標(biāo)記為未成年人
        if (isReal.equals("0")) {
            // 已經(jīng)實(shí)名認(rèn)證
            playerRealNameCheckResponse.setRealCheckStatus(RealCheckStatusEnum.HAS_REAL_CHECK.getType());

            if (isAdult.equals("0")) {
                playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.ADULT.getType());
            } else if (isAdult.equals("1")) {
                playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.CHILDREN.getType());
            } else {
                playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.VISITOR.getType());
            }
        } else {
            // 未進(jìn)行實(shí)名驗(yàn)證的用戶可以判斷為游客模式
            playerRealNameCheckResponse.setRealCheckStatus(RealCheckStatusEnum.NOT_REAL_CHECK.getType());
            playerRealNameCheckResponse.setUserRole(PlayerRoleEnum.VISITOR.getType());
        }
    }

(6)主流程checkReal方法重構(gòu)后的代碼如下:

    public PlayerRealNameCheckResponse checkReal(String userCode) throws IOException {
        RestTemplate restTemplate = new RestTemplate();
        PlayerRealNameCheckResponse playerRealNameCheckResponse = new PlayerRealNameCheckResponse();

        // 發(fā)送HTTP請(qǐng)求
        ResponseEntity<String> responseEntity = sendHttpRequest(userCode, restTemplate);

        // 返回參校驗(yàn)
        if (responseEntity == null) {
            return null;
        }

        // 解析返回參
        String checkResponseBody = responseEntity.getBody();
        if (StringUtils.isBlank(checkResponseBody)) {
            return null;
        }

        // 反序列化為JsonNode
        JsonNode responseNode = OBJECT_MAPPER.readTree(checkResponseBody);

        // 解析Data
        JsonNode dataNode = parseDataFromResponse(userCode, responseNode);
        if (dataNode == null) {
            return null;
        }

        // 選擇用戶角色
        return selectUserRole(userCode, playerRealNameCheckResponse, checkResponseBody, responseNode, dataNode);
    }

小結(jié)與思考

可以看到,將不同的操作都封裝為單獨(dú)的方法,在主流程中只保留重要的操作步驟,不僅提升了閱讀者的體驗(yàn),而且使得代碼的邏輯更加有條理。對(duì)于主流程而言,代碼行數(shù)得到了明顯減少,相比重構(gòu)前代碼行數(shù)減少了一半以上。

通過對(duì)方法進(jìn)行重構(gòu),是降低代碼行數(shù)的一種行之有效的方法。在開發(fā)階段就應(yīng)當(dāng)不斷地對(duì)代碼進(jìn)行重構(gòu),使代碼邏輯更加具備層次感,避免過長(zhǎng)的代碼行所帶來的壞味道。


瀏覽 89
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 97久久综合| 亚州激情| 久草新视频| 亚洲乱伦小说网| 扒开让我91看片在线看| 99在线视频播放| 欧美婷婷| 亭亭五月天| 亚洲黄片免费| 成人伊人综合| 91人人操人人爽| 北条麻妃91人妻互换| 梁祝艳谭A级毛片| 黄色av免费看| 欧美成人A级片| 秋霞福利| 99精品视频在线| 毛片区| 国产福利电影在线观看| 日韩中文字码无砖| 无码123区| 777三级| 久久永久免费| 国产一级a免一级a免费| 久久久久一区二区三区| 影音先锋久久久久AV综合网成人| 久久久一级| 色第一页| 免费一级婬片AA片观看| 日本大胆中出| 99国产精品| 91玖玖| 福利导航网| 国产精品夜夜爽7777777 | 天天无码视频| 亚洲在线成人视频| 无码不卡中文字幕| 黄色在线观看国产| 99三级片| 久久久精品在线| 一大高清日韩| 黄色免费福利视频| 亚洲激情偷拍| 日本四级片| 欧美一二三区黄色免费视屏| 免费操逼| 国产三级电影| 日韩毛片在线| 国产福利视频在线| 99国产在线视频| 丁香五月欧美| 亚洲黄片免费观看| 91狠狠综合久久久| 九九九亚洲| 黄片小视频| 日逼A片| 欧美午夜视频| 精品视频国产| 一级A片免费视频| 俺要操| 在线观看免费A片| av在线免费观看网站| 天天爱综合| 小h片| 大香蕉大香蕉视频网| 日产精品久久久一区二区| 亚洲狠狠撸| 69成人在线电影| 亚洲天天在线| 国产熟女av| 激情五月俺也去| 超碰一区二区三区| 91A视频| 丰满人妻一区二区三区四区53| 国产三级无码视频| 风流老熟女一区二区三区| 超碰操一操| 99免费在线视频| 欧美色图另类图片| 大香蕉大香蕉网| 精品动漫3D一区二区三区免费版 | 专业操美女视频网站| 操逼片| 亚洲一区欧美二区gay| 日韩视频免费观看高清完整版在线观| 日韩精品在线免费视频| 国产在线欧美在线| 国产vA| 国产最新在线| 在线高清无码不卡| gogogo免费高清在线偷拍| 怡红院成人AV| 霸道总裁雷总各种姿势白浆爱情岛论坛| 日本精品视频在线| 天堂无码高清| 米奇狠狠干| 婷婷亚洲精品| 大香蕉在线网站| 综合色亚洲| 四虎麻豆| 亚洲成人五月天| 国产在线视频导航| 超碰人人草| 懂色av,蜜臀AV粉嫩av| 亚洲的天堂的αⅴ| 日本18禁网站| 国产成人免费视频| 亚洲三区视频| 成人三级片视频| 无码欧美人XXXXX日本无码| 2026AV天堂网| 久久九一| 亚洲三级片无码| 中文字幕av第一页| 激情黄色视频| 欧美一区视频| 91色色色| 黄色视频在线免费看| 最新AV在线播放| 18+免费网站| 亚洲日韩色色| 超碰综合| av影片在线播放| 黄色无遮挡| 337p西西人体大胆瓣开下部| 台湾无码在线| 精品91| 国产高清在线| 天天三级片| 女人18片毛片60分钟翻译| 2018天天日天天操| 亚洲成人av无码| 综合久久亚洲| 欧美不卡一区二区三区| 免费日韩| 国产一级内射| 无码日韩AV| 亚洲视频三区| 欧美成人网址在线观看| 天堂网在线播放| 热久久这里只有精品| 在线播放JUY-925被丈夫上司侵犯的第7天 | 精品国产91乱码一区二区三区| 国产激情综合五月久久| 成人a一级片| 四川BBB搡BBB爽爽爽欧美| 无码欧精品亚洲日韩一区| 黄色电影网页| 免费人成网站| 91女人18毛片水多的意思| 青娱乐国产在线| 国产无套在线观看| 久久久无码人妻精品无码| 亚洲婷婷视频| 中文字幕免费MV第一季歌词| 日日爽| 操大香蕉| 亚洲三级片在线观看| 婷婷深爱五月丁香网| 人人人干| 亚洲青青| 日本精品中文字幕| 熟妇人妻中文字幕无码老熟妇| 亚洲无码播放| 五月花在线视频| 免费色色网站| 免费黄色视频在线| 最近中文字幕mv第三季歌词| 国产精品色哟哟| 国产香蕉视屏| 国产噜噜噜噜噜久久久久久久久| 日韩美女久久| 中文字幕在线视频免费观看| 影音先锋成人资源站| 黄色内射在线播放| 最新av网| 加勒比人妻| 深夜福利18| 欧美操逼图片| 人妻77777| 超碰在线观看免费版| 蜜臀久久99精品久久久久久婷婷| 欧美成人午夜福利| 欧美日韩国产一区| 免费的黄色A片| av无码不卡| 肏屄视频在线播放| 人人干人人干人人| 综合久久99| 波多野结衣99| 亚洲男人的天堂av| A片视频免费| 国产AA| 天天视频狠狠狠狠| 精品一区二区三区四区五区六区七区八区九区 | 中文字幕性爱电影| 亚洲女人视频| 亚洲无码网| 天干天干天夜夜操| 黄片网站入口| 久久久久麻豆V国产精华液好用吗| HEZ-502搭讪绝品人妻系列| 99视频免费在线观看| 久久成人一区| 国产91视频在线观看| 亚洲精品国产av| 久久一级片| 影音先锋女人aV鲁色资源网站| 黄色视频日本免费| 亚洲天堂欧美| 国产777| 五月天福利网| 99精品免费在线观看| 在线中文av| 蜜臀AⅤ在线| 18禁在线看| 狠狠躁日日躁夜夜躁A片小说免费 色综合久久久无码中文字幕999 | 青娱乐网站| 亚洲一区在线免费观看| 日韩精品成人| 蝌蚪窝免费在线视频| 激情久久av| 精品视频国产| 狼人亚洲伊人| 全国男人的天堂网站| 狠狠躁18三区二区一区免费人| 一级黄色电影网站| 国产一级性爱视频| 日本成人电影一区二区三区 | 黄色成人视频在线观看| 日韩欧美偷拍| 国产精品porn| 日本无码人妻| 欧美高清久久| 毛片资源| 四虎黄色| 黄色电影一区二区三区| 男人天堂视频网站| 大色网小色网| 久久水密桃| 97国产精品手机| 亚洲在线视频免费观看| 久久久久久久久久国产精品免费观看-百度 | 水果派AV解说| 亚洲三级无码在线观看| 亚洲成人综合网站| 亚洲国产91| 伊人三级网| 99在线视频免费| 免费看一级无码成人片| 西西午夜视频| 国产一片黑夜内射| 黄色片在线看| 欧美在线A片| 波多野结衣av中文字幕| 五十路在线| 成人在线日韩| 中文字幕五月久久| 亚洲吹箫| 精品人妻一区二区免费蜜桃| 草久影院| 草视频在线| 毛茸茸BBBBBB毛茸茸| 超碰777| 日本高清中文字幕| 久久无码一区二区| 欧美激情在线| 日韩色爱| 成人无码日韩| 色吧视频| 成年人国产| 国产有码视频| 97精品人妻一区| 超碰97在线免费| 青娱乐青青草| 人人摸在线视频| 国产婷婷色一区二区在线观看| 欧美亚洲国产精品| 久久久久99精品成人片三人毛片| 一区二区三区毛片| 蜜乳av红桃嫩久久| 高清无码做爱视频| 国产嫩草久久久一二三久久免费观看 | 国产日韩欧美综合在线| 殴殴美日韩在线| 亚洲淫秽视频| 亚洲艹逼| 91香蕉视频在线看| 激情五月在线| 欧美性视频网站| 台湾无码片| 中文一级片| 日韩一级免费观看| 欧美操逼的| 久久久18禁一区二区三区精品| 久久婷婷五月综合伊人| 成人午夜精品| 久久久久久久9999| 人人看人人做| 99久久精彩视频| 大香蕉国产精品视频| 青草社区在线观看| 国产精彩无码视频| 免费在线观看黄色视频网站| 日韩成人无码电影网站| 亚洲v天堂| 亚洲一区二区三区免费视频| 精品有码| 人人操人人干人人操| 国产人妻在线| 中文午夜福利| 丁香网五月天| 人人色人人| 日本一级黄| 老欧性老太色HD大全| www天天日| 中日韩在线视频| 巨爆乳肉感一区二区三区视频 | 一区二区AV| 久久五月亭亭| 99色| 国产精品宾馆| 青青青视频在线| 99视频自拍| 水蜜桃视频免费观看| 天天色天天干天天| 欧美日韩国产在线播放| 成人国产片女人爽到高潮| 91人妻人人爽人人澡人人爽| 久久久久久国际四虎免费精品视频| www久久99| 日韩一区二区三区四区| 欧美草逼网| 日韩中文在线观看| 国产人妻一区二区精选| 国产福利av| 成人免费视频一区二区三区| 亚洲无码影音先锋| 国语偷拍| 学生妹毛片| 国产又爽又黄免费观看| 俺来也俺也去| 日韩美在线| 日本一区二区在线| 国产成人精品无码片子的价格| 欧美黄色免费看| 操操操综合| 国产黄色网| 青青草成人AV| 国产黄色免费网站| 亚洲AV无码秘翔田| www.日韩| 日韩中文字幕精品| 东京热久久综合色五月老师| AV资源网站| 中文字幕日韩无码电影| 久久久人妻熟妇精品无码蜜桃| 精品中文字幕在线播放| 牛牛免费视频| 影音先锋AV成人| 欧美V| 无码国精品一区二区免费蜜桃| 中文字幕一区二区三区四区在线视频 | 国产精品久久久久久久久久王安宇 | 囯产一级黄片| 亚洲激情综合网| 蜜桃久久精品成人无码AV| 少妇熟女网| 亚洲黄色在线观看视频| 91日韩| 一本色道久久| 蜜臀AⅤ在线| AV手机在线| 亚洲精品三级在线观看| www天天干| 亚洲国产精品成人综合色在线婷婷| 操一操影院| 免费在线观看AV片| 黄色视频网站免费| 色色五月丁香婷婷| 无码不卡视频在线观看| 亚洲成人大香蕉| 猫咪亚洲AV成人无码电影| 正在播放JUQ-878木下凛凛子| 2021国产精品视频| 手机看片久久| 久久天堂AV综合合色蜜桃网| 国产一级美女操逼视频免费播放| 2022黄片| 特级西西444www高清大胆免费看| 操一操影院| 99免费小视频| 亚洲视频免费观看| 大地99中文在线观看| 欧美色图网址| 怡红院男人的天堂| 日本一级黄色| 国产天堂| 欧美成人精品在线观看| 久草在线资源| 亚洲天堂精品在线观看| 天天激情站| 蜜桃黄片AV在线观看| 婷婷无码在线| 国产资源网| 国产免费操逼视频| 久久综合在线| 五月天婷婷在线无码| 欧美成人激情视频| 第一色网站| 午夜黄色| 激情人妻AV| 中文字幕无吗| 亚洲欧美视频在线观看| 五月婷婷丁香网| 成人伦理聚合| 在线无码av| 99免费小视频| 北条麻妃一区二区三区-免费免费高清观看 | 青青草东路热vv| 婷婷五月综合在线| 久久久极品| 91在线无码精品秘国产三年| 激情伊人| 伊人网视频在线播放| 精品中文字幕在线观看| 97AV人妻无码视频二区| 操逼大毛片| 第一福利视频| 欧美熟妇BBB搡BBB| 久草视频在线免费| 日本中文字幕电影| 亚洲91网站| 香蕉视频免费| 欧美三P囗交做爰XXXⅩ| 婷婷五月国产| 成人资源站| 一级女婬片A片AAAA片| 校园春色亚洲无码| 青娱乐国产精品| 久久亚洲成人| 狼友视频首页| 嫩BBB搡BBBB搡BBBB| 久久精品一区二区三区四区| 午夜福利成人网站| 午夜福利av电影| 国产在线激情| 亚洲无码视频一区二区| 免费看国产黄色| 欧美色色网| 亚洲自拍无码| 二区三区视频| AV性爱社区| 五十路无码| 欧美啪啪网站| 久久福利网| 国产A片免费看| 超碰爱爱| 麻豆午夜福利视频| 日本AI高清无码在线观看网址 | 黄片一区二区三区| 51精品日本| 夜夜爽日日爽| 国产精品扒开腿做爽爽爽A片唱戏| 涩五月婷婷| AV大全在线免费观看| 97人人操| 日韩黄色在线| 在线观看免费黄网站| 好吊AV| 日本亚洲欧美| 先锋资源av在线| 久久99视频免费观看| 日韩成人在线视频| 亚洲精品成人7777777| 久久婷婷婬片A片AAA| 人人澡人人妻人人爽| 天天干天天添| 日韩欧美国产精品| 亚洲一区二区久久| 国内成人自拍| 日韩黄色网址| 91丨九色丨老农村| 超碰国产97| 高清的日逼| 在线观看黄色小视频| 免费一级A毛片夜夜看| 91熊猫| 国产A级黄色片| 亚洲人成在线观看| 天天干天天舔| 中文字幕少妇| 婚闹不堪入目A片| 午夜操一操| 国产黄色在线免费观看| 中文字幕日本无码| 1204手机看片| 午夜成人福利视频在线观看| 欧美成视频| 亚洲精品乱码久久久久久| 五月天婷婷综合网| 五月天婷婷AV| 人人干人人草| 99久| AV天堂电影网| 先锋资源日韩| AV天堂小说| 欧美日韩成人电影| 日韩久久电影| 五月激情六月| 亚洲色a| 日本少妇黄色视频| 操日本老女人| 综合色播| 亚洲无码视频看看| 日本免费在线黄色视频| 亚洲精品成人av| 日本人妻中文字幕| 妻子互换被高潮了三次| 91香蕉视频免费在线观看| 人妻综合第一页| 国外亚洲成AV人片在线观看| 91人妻成人精品一区二区| 91在线无码精品秘蜜桃入口| 高清无码免费看| 欧美色图俺去了| 亚洲国产精品欧美久久| 蜜柚av| 亚洲成人视频在线| 在线免费看黄色视频| 欧美一级成人| 免费看片av| 永久免费看片视频5355| 1024在线视频| 99一区二区| 九九九在线视频| 69欧美视频| 国产欧美第一页| 伊人在线成人视频| 日韩国产一区| 国产成人av在线| 天天撸一撸视频| 精品成人在线视频| 欧美视频自拍| 日韩在线视频网| 麻豆一区二区| 日韩在线视频播放| 国产无码在线看| 国产女人18毛片水18精品| 久久久77| 91成人三级| 精品国产乱子伦一区二区三区,小小扐 | 亚洲黄片在线| 一区二区三区四区不卡| 91人妻人人操| 日韩A级毛片| 天天摸夜夜操| 蜜桃精品视频在线观看| 激情五月激情综合网| 六十路老熟女码视频| 国产精品久久久91| 伊人狼人香蕉| 成人网站在线免费| 国产在线拍揄自揄拍无码福利| 三级网站免费观看| 欧洲性爱视频| 免费在线观看AV网站| www.黄色av| 人人摸人人操人人爽| 成人视频三级| 亚洲精品视频在线| 99综合网| 亚洲免费观看高清完整版在va线观 | 看一级黄色片| 日韩一级片免费| 国产八区| 午夜激情国产| 亚洲日韩AV电影| 四虎在线视频观看96| 天堂在线视频| 51成人网站免费| 国产一二三视频| 狼友无码| 国产中文在线观看| 91毛片在线观看| 亚洲无码久久精品| 九九九九综合| 9I成人免费版视频| 特级西西444www| 国产在线观看97| 国精产品秘一区二区| 亚洲无码成人| 国产精品揄拍一区二区| 久久99免费视频| av日韩无码| 中文字幕观看在线| 国产在线视频一区二区| 黄色99| 大香蕉大香蕉视频网| 国产迷奸在线| 久热思思| 黄色视频在线观看地址| 国产白嫩精品久久久久久| 欧美性爱无码在线| 日韩无码黄色片| 嫩草Av| 成人在线免费观看国产| 五月婷婷中文字幕| 秋霞福利视频| 高清无码在线观看视频| 久久91视频| 亚洲第一页在线| 无码AV大香线蕉伊人| 国产精品欧美精品| 日韩中文字幕高清| 久色悠悠| 91蝌蚪在线观看| 国产老熟女久久久| 国产成人AV免费无码| 3D动漫精品一区二区在线播放免费| 国产精品毛片一区二区在线看| 99精品99| 91婷婷在线| 久久国产精彩视频| 国产免费AV片在线无码| 无码人妻丰满熟妇啪啪| 欧美成人一级a片| 一区在线看| 亚洲视频二| 久久久中文| 91成人免费电影片| www.怡春院| 青青草人人| 一级大毛片| 91无码成人视频| 汇聚全球淫荡熟女| 夜夜看| 国产操比网| 久久肏屄视频| 成人AV电影在线观看| 操逼逼一区二区三区| 三级乱伦86丝袜无码| 亚洲无码免费视频| 无码一区精品久久久成人| 亚洲视频在线免费观看| av一区二区三区| 久久久久久久人妻丝袜| 日批视频| 久久久久国产| 亚洲美眉综合网| 激情一一区二区三区| 按摩忍不住BD中文字幕| 午色婷婷国产无码| 一级毛AA片| 三级片在线观看网站| 亚洲日韩免费在线观看| 亚洲va欧美va天堂v国产综合| 精品孕妇一级A片免费看| 尤物综合网| 大香蕉精品一区| 国产成人免费观看视频| 51嘿嘿嘿国产精品伦理| 一级a一级a爰片免费免免中国A片 一级一级a免一级a做免费线看内裤 | 欧美成人视频大全| a色视频| 日本a一级片| 亚洲北条麻妃一级A片| 97精品人妻麻豆一区二区| 97夜色| 久久国产日韩| 在线免费观看成人网站| 日本熟妇无码一区二区| 综合色在线| 特级西西人体444www高清大胆| 大香蕉网伊人在线| 亚洲a√| 日韩无码操逼视频| 日韩色综合| 中文字幕视频在线播放| 国产一区二区三区免费播放| 久久99免费视频| 中文字幕有码在线| 亚洲在线免费观看| 久九视频| 黄色网址五月天| 大香蕉玖玖| 91麻豆国产福利在线观看| 伊人色五月天| 亚洲无码AV在线观看| 日韩黄色在线视频| 青娱乐最新官网| 久久久久久久久免费看无码| 久久视频精品| 最新中文字幕在线| 操逼大片| 天天玩夜夜玩天天玩国产99| 做aAAAAA免费视频| 伊人大香蕉在线网| 中文亚洲视频| 大伊香蕉久久| 日韩大香蕉网| 欧美18禁网站| 七十路の高齢熟妇无码| 操操影视| 青春草视频在线观看| 天堂A片电影网站在线观看| 婷婷国产成人精品| 无码专区av| 国产黄色Av| 亚洲国产成人AV| 91无码AⅤ在线| 日韩高清无码人妻| 91精品国自产在线观看| 亚洲日韩中文字幕| 午夜毛片| 91精品酒店视频| 欧美色图视频在线观看| A免费在线观看| 亚洲一本之道| 91黄色在线观看| 亚洲小说区图片区| 俺去日| 精品一区国产探花| 中国少妇xxx| 狠狠91| 一级免费黄色视频| 一区二区无码区| 91天堂网| 麻豆AV96熟妇人妻| 动图综合亚洲综合欧美男男| 欧美日韩AV| 97成人精品| 精品国产天线2024| 牛牛精品视频| 大香焦久久| 北条麻妃视频在线| 在线中文字幕777| 日韩视频免费在线| 自慰影院| 亚洲成人Av| 欧美性爱一区二区三区| 果冻传媒A片一二三区| 精品一区二区三区蜜桃臀www| 天天干少妇| 国产无码高清在线观看| 你懂的国产| 五月丁香婷婷色| 在线观看国产视频| 国产最新在线| 国产影视av| 免费无码在线视频| 亚洲激情视频在线观看| 囯产精品久久久久久久久久| 逼特逼视频| 大黑逼AV| 国产高清第一页| 欧美日韩亚洲中文字幕| 少妇综合网| 精品无码一区二区三区爱与| 国产变态另类| 精品久久免费一区二区三区| 九九精品在线视频| 中文字幕视频网站| 三级片在线观看视频| 美女黄色视频永费在线观看网站 | wwwxx国产| 中日韩特黄A片免费视频| 丁香九月婷婷| 波多野结衣不卡| 日韩精品一区二区三免费视频| 乱伦播放五月天| 国产av一区二区三区四区| 亚洲乱码日产精品BD在线观看| 一区二区三区在线观看视频| 在线免费看AV片| 亚洲一在线| 三级片免费网址| 精品一二三| 五月丁香六月| 99在线精品视频在线观看| 2024国产精品| 午夜精品视频在线观看| 色播五月婷婷| 2019中文字幕在线免费观看| 簧片网站免费| 欧美熟妇BBB搡BBB| 人妻无码电影推荐| 91在线视频免费观看| 北岛玲视频在线| 亚洲一区翔田千里无码| 亚洲A级| 人人看人人爽| 美女裸体视频网站| 成人午夜天堂| 麻豆视频一区| GOGO人体做爰大胆视频| 操一线天逼| 亚洲欧美成人视频| 久久99久久99精品免视看婷婷 | 91传媒在线观看| 三级片网站国产| 青青草小视频| 一级全黄120分钟免费| 玩弄小怮女在线观看| 亚洲精品一区二区三区四区高清| 5D肉蒲团| 51av在线| 一级免费毛片| 国产欧美一区二区三区特黄手机版 | 国产96在线亚洲| 乱伦播放五月天| 欧美级毛片一进一出夜本色| 偷拍综合网| 国产成人片色情AAAA片| 国产又爽又黄视频在线看| 成人黄色视频免费| jizzjizz国产| 国产成人毛片18女人18精品| 一个人看的www日本高清视频 | 911精品国产一区二区在线| 黄色视频网站免费| 大香蕉伊人青青草| 男人天堂新地址| 婷婷五月精品中文字幕| 99精品视频播放| 免费涩涩无遮挡18国产| 91蝌蚪视频在线观看| 欧美日韩中文字幕无码| 国产欧美一区二区三区特黄手机版 | 极品美女扒开粉嫩小泬高潮一| 丰满人妻一区二区三区46| 三区在线| 波多野结衣一区| 国产在线色视频| 亚洲小穴| 国产一级特黄A片| 精品人妻中文字幕视频| 1插菊花网| 在线无码av| 农村新婚夜一级A片| 欧美黄色成人视频| 日韩小电影免费观看高清完整版在线观| 亚洲日韩在线视频| 99re视频在线播放| 日韩精品一区二区三区中文在线 | 日韩最新无码发布| av资源在线看| 18XXX亚洲HD护士JD| 级婬片AAAAAAA免费| 俺去俺来也www色官网黑人| 四虎黄色| AV1区二区| 91无码人妻精品一区二区蜜桃| 黄片大全在线观看| 日韩av中文字幕在线播放| 欧美二区三区| 欧美后门菊门交| 一区二区成人免费视频| 日韩成人高清| 激情综合五月天| 肉色超薄丝袜脚交一区二区| 四虎影院在线| 东方成人AV| 国产无码a| 狠狠干五月天| 久久99视频| 国产精品一区二区在线播放 | 午夜免费福利| 日韩色爱| 嫩BBB槡BBBB槡BBBB撒尿| 国产九九九| 久久久黄色电影| 黄色福利在线观看| 米奇电影777无码| 日韩少妇无码视频| 天天日天天操天天射| 996精品在线| 婷婷无码在线| 高清无码一区| 韩国无码高清视频| 国产激情| 亚洲国产精品欧美久久| 色婷婷18禁| 亚洲无码高清在线观看| 亚洲无码AV免费观看| 安徽妇搡BBBB搡BBBB| 风情万种AV| 午夜视频在线看| 婷婷久久综合久色综| 青草香蕉视频| 欧一美一色一伦一A片| A片免费在线观看| 色在线视频| 嫩BBB搡BBB槡BBB小号| 无码日逼视频| 日韩操逼电影| 欧美一区二区三区婷婷五月| AV五月| 青青青视频在线| 52妺嘿嘿午夜福利在线|