精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

通過Python腳本支持OC代碼重構實踐:模塊調用關系分析

開發 前端
在軟件開發中,經常會遇到一些代碼問題,例如邏輯結構復雜、依賴關系混亂、代碼冗余、不易讀懂的命名等。這些問題可能導致代碼的可維護性下降,增加維護成本,同時也會影響到開發效率。

在軟件開發中,經常會遇到一些代碼問題,例如邏輯結構復雜、依賴關系混亂、代碼冗余、不易讀懂的命名等。這些問題可能導致代碼的可維護性下降,增加維護成本,同時也會影響到開發效率。

這時通常通過重構的方式,在不改變軟件的功能和行為的前提下,對軟件的代碼進行重新組織和優化。達到增強代碼的可讀性,降低維護成本,提升研發效率和質量的目的。通過合理的重構,可以大大提高軟件的可維護性和可擴展性,從而延長其生命。

本系列的內容介紹了百度App搜索側業務如何使用Python腳本實現自動化工具,以支持百度App配置數據項調用方式升級為數據通路的重構過程。通過Python腳本,我們實現一些自動化的工具,包括配置數據項調用關系分析、配置數據項接入數據通路的實現、數據項使用方接入數據通路的適配等,以期提高工作效率、減少出錯率。

01、代碼重構時的關鍵步驟及挑戰

在代碼重構過程中,需要考慮重構的效率和重構后的代碼質量。與其相關的關鍵的步驟如下,這些步驟先后依賴,相互影響:

熟悉業務及技術現狀:在開始重構之前,研發首先要理解業務邏輯和流程,熟悉業務能力及技術實現時存在的問題,確定重構的范圍。

確定重構方案:基于對業務邏輯和現有代碼問題的理解,確定重構方案,重點關注有兩點,有問題的代碼如何重構和依賴于該代碼的調用如何適配。

分階段實施:根據重構方案,分階段的修改代碼,并測試代碼的功能是否正常。在修改過程中,應該盡量避免影響到不相關模塊,這樣可以更好地控制風險。

效果評估及監控:重構方案開發完成,線下對實現的效果進行評估,線上對實現的效果進行監控,及時發現異常止損和重構的效果。

在重構的工作中,大部分的工作是人工的方式完成,是一個耗時且容易出錯的過程。對于研發人員來講,在不改變軟件的功能和行為的前提下,保證質量和效率完成對已有功能的重構,是一個極大的挑戰。

02、百度App(iOS)搜索側的配置數據項重構

為了更好的提升系統穩定性和降低配置數據項變更時對上層依賴方組件的影響, 我們決定對百度App(iOS)搜索側的配置數據項進行重構。重構過程的關鍵節點中有超過80%的工作是由自動化工具完成,支持重構工作上線后零bug,和全部的配置數據項接口內斂,提升了系統的安全性和穩定性。

2.1 重構背景

百度App(iOS)-搜索側的配置數據項,大部分集中在一個類(XXXSetting)中管理。該類(XXXSetting)以獨立組件的方式發布,被超過30個其它組件依賴。

如圖-1 所示數據項使用模塊直接調用數據項提供模塊(XXXSetting),是直接依賴的關系,數據項的增刪相當于接口的變更,對上層的依賴方會產生影響,當接口存在不兼容變更時,連帶上層的依賴方組件也需要二次的發布。且該組件中的數據項主要為實驗類開關,變動較為頻繁,影響面也被放大,故需使用比較穩定的方式實現不同模塊之間的數據項共享。

圖-1圖-1

2.2 技術方案

在技術實現的層面,主要分為兩步

1、第一步為實現多模塊之間數據通訊的模塊,在本系列的內容中以數據通路代指該模塊。

2、第二步為基于數據通路提供的能力,XXXSetting組件為作數據提供方接入數據通路,原使用XXXSetting組件的使用方接入數據通路,這樣就完成了XXXSetting組件中的數據項遷移。

數據通路的實現,目標實現以Key-Value的方式讀取及更新配置項,需要從無到有的構建,在本系列的其它章節中內容會有介紹。但XXXSetting組件對應的重構工作,是基于已有的線上能力的改造,Setting中的數據項超過百個,外部的調用點也是以百為計算單位,涉及的組件有30+。影響面如何評估,如何保證重構的過程質量和效果是可控的?結合對重構過程的理解,我們采用了Python腳本來支持第二步的工作。

2.3 使用Python支持重構過程

要規避以人工方式為主的重構過程,引入錯誤的風險,提升重構過程的質量及效率。需要引入Python腳本實現自動化工具支持重構過程的工作。下面以重構的關鍵步驟,自動化工具的應用目標進行列舉。

1、在熟悉業務及技術現狀階段,可以使用自動化工具對工程中現有的代碼、技術架構進行分析,獲取當前需要重構的代碼的依賴和調用關系信息,確定重構過程的變動影響,使用自動化的方式會更加的精準。

2、在確定重構方案階段,可以基于自動化工具產生的數據,支持重構方案的決策,包括是否需要重構,如何重構,調用方如何適配等。

3、在分階段實施階段,可以使用自動化的方式支持代碼的重構工作,包括需要重構的模塊的升級、調用方代碼的適配等。對比IDE提供的查找、替換等基礎工具,自動化工具可以批量處理更加復雜的重構工作。同時實施的階段通常是繁瑣且容易出錯的,但使用自動化的方式可以自動完成這些任務,并減少人為錯誤。

4、在效果評估及監控階段,可以使用自動化的方式對重構前后的代碼進行對比測試保證功能的一致性,收集關鍵指標數據,發現指標的異常。

03、用Python腳本實現模塊的調用關析分析

在實際的配置數據項的調用關系來看,公開的數據項可為幾種情況,對應的重構方案可有不同。

1、配置數據項僅在XXXSetting模塊內使用,這部分數據項不需要接入數據通路。

2、配置數據項在XXXSetting模塊內使用,也在其它的模塊中使用,這類數據項在XXXSetting模塊中維護,數據項需要接入數據通路。

3、配置數據項在XXXSetting模塊內沒有使用,只在一個模塊中使用,這類數據項應該遷移到使用該數據項的模塊中。

4、配置數據項在XXXSetting模塊內沒有使用,但在一個以上模塊中使用,這類數據項可以在XXXSetting模塊中維護,但數據項需要接入數據通路。

基于這樣的改造,XXXSetting模塊的數據項接口就可以全部不公開,對于配置數據項的變更,只影響依賴配置數據項的模塊。那么每個數據項的調用應該是如何重構呢,用手動查找及分析的方式成本過高,在項目實際過程評估及修改出錯的概率也會增高,我們使用Python腳本實現了調用關系的分析工具,為重構工作提前進行數據支持及決策。

3.1 提取公開數據項及類型

在分析數據項的外部調用情況之前,需要先提取XXXSetting類中所有公開的數據項。

3.1.1 公開數據項在OC類中的寫法

Setting文件由OC語言開發,在Setting頭文件件中公開的數據項的定義,OC類中成員變量的定義,書寫方式如下

@property (nonatomic, assign) BOOL value;
@property (nonatomic, copy) NSString *value1

3.1.2 提取的是變量類型和變量的名稱

因頭文件中,包含其它非成員變量的代碼,比如include、前置聲明、類定義、空代碼行、注釋、函數等,需要預處理下代碼及使用正則表達式變量定義代碼段,依次的讀取.h文件中的每一行代碼,以相關實現及的關鍵代碼如下。

去除注釋

因代碼中的注釋寫法存在不確定性,會對后面的正則匹配產生影響,故先把注釋刪除。

# 原代碼行 @property (nonatomic, copy) NSString *value1; // 注釋 ; * () 這些字符都有可能有,會影響后面的正則判斷
newline = re.sub(r'//.+', "", line)
# 處理過后的代碼行 @property (nonatomic, copy) NSString *value1;
提取數據項類型及數據項

去除注釋代碼之后,下一步為提取成員變量名稱及類型,可以使用正則中的分組匹配的能力,提取變量類型及變量名。這里使用了正則的原因是代碼的寫法存在不確定性,@property的寫法也會因變量類型不同而變化,故通過分組匹配的方式來實現。

# 原代碼行 @property (nonatomic, copy) NSString *value1;
matchObj = re.match(r"@property.+\)\s+(.*)", line, re.M|re.I)
if matchObj:
    # matchObj.group(1) 是成員變量類型和變量名 -- NSString *value1;

去除無用字符

這時的代碼行,因為寫法的不同及變量的不同,需要進行標準化,才能提取出變量類型及變量名,主要為去除 星號(*)。代碼行頭中的空格已經過濾(上行代碼中的\s+)。

# 原代碼行 NSString *value1;
newline = line.replace('*', '')
# 處理后的代碼行 NSString value1;

提取標準化后的數據項類型及數據項

這時代碼行中只剩下類型 空格 變量名 分號,使用正則的分組匹配,提取類型及變量名。

# 原代碼行 NSString value1;
# 正則表達式中\s匹配任何空白字符,包括空格、制表符、換頁符等等, 等價于[ \f\n\r\t\v],\s+代表一個或多個這類的字符
matchObj = re.match(r"(.*)\s+(.*);", line, re.M|re.I)
if matchObj:
    # valueType = NSString
    valueType = matchObj.group(1) 
     # valueName = value1  
    valueName = matchObj.group(2)

到這了一步,公開可訪問的數據項及類型的提取就已級完成,這時就可以轉換代碼,如果這時轉換代碼,會存在冗余,因為如果公開的變量在其它模塊中沒有使用,那實際上就不需要使用數據通路進行封裝,下一步應該分析調用關系之后,再進行。

3.2 數據項關聯調用組件

確定了公開的數據項之后,需要在工程源碼中查找每個數據項的調用點,之后再跟據調用點數據確定每個數據項在不同的組件中調用的情況。

數據項調用代碼常見于以下寫法,OC中也有其它的寫法,本文中以下寫法作為示例介紹調用關系的生成。

[XXXSetting share].value1

3.2.1. 查找每個數據項在文件中的調用

  • 原始數據項調用字串使用數據通路的數據項綁定。
  • 整體的思路為,依次的從每個文件中,全字匹配字符串,查找到一次,算作調用一次,保存到字典中,統一輸出到表格中。
# 定義個全局字典,存放每個數據項在不同的文件中調用的次數
# {數據項:{文件名:該文件內數據項調用的次數}}
valueCallInfoDic = {}


# 使用上節中,提取出來的數據項名,拼裝為實際調和時的寫法
realValueName = '[XXXSetting share].' + valueName


# fileNameList 為所有源碼文件(.m 和 .mm)
for fileName in fileNameList:
    # 記錄該文件調用數據項的次數
    callNum = 0
    # 記錄文件每個文件調用該數據項的次數信息
    fileCallInfoDic = {}
    # 依次的讀取源文件的每一行,匹配調用情況,記錄調用次數,及文件名,line 為代碼行
    for line in f:
        # 使用正則全字匹配,查找替換
        regAbKey = realValueName.replace('[', '\[')
        regAbKey = regAbKey.replace(']', '\]')
        regAbKey = regAbKey.replace('.', '\.')
        # pattern = \[XXXSetting share\]\.value1\b  主要為了防止數據項名有子串的情況
        pattern = r'' + fromstr + r'\b'
        matchObj = re.match(r'.*' + regAbKey +'', line, re.M|re.I)
        if matchObj:
            callNum = callNum + 1 
    if callNum > 0
        fileCallInfoDic[fileName] = str(callNum)
    # 如果有調用關系,則存儲
    if len(fileCallInfoDic) 
        valueCallInfoDic[valueName] = fileCallInfoDic

3.3 輸出為excel表格文件

使用Python分析的數據還是以機器語言的形式表式,需要以人類語言描述,將數據輸出為excel表格,這樣就可以借助于表格工具進行數據的查看及分析。

3.3.1 數據項的詳細使用情況輸出

表格的輸出Python沒有使用有excel操作的相關庫,使用 ,(逗號)作為分隔符,存儲為.csv文件,在excel中導入csv文件使用。

具體的實現為依次的將每個數據項的使用的組件,使用的文件及在這個文件文件中使用次數,輸出到.csv文件中。

# 表頭分別為,數據項,使用的組件,使用的文件,文件中使用次數
outfiledata = 'value , uselib , usefile , usenum\n'
# 遍歷全局字典valueCallInfoDic,獲取每個數據項 及數據項的調用信息
# {數據項:{文件名:該文件內數據項調用的次數}}
for.valueName , valueInfo in valueCallInfoDic.items():
    # 從數據項的調用信息中獲取,文件名和該文件內數據項調用的次數
    # {文件名:該文件內數據項調用的次數}
    for.fileName , callNum in valueCallInfoDic.items():
        outfiledata += valueName + " , "
        # libByFile 函數,實現根據文件獲取所在的組件名
        outfiledata += libByFile(fileName) + " , "
        outfiledata += fileName + " , "
        outfiledata += callNum + " \n"
表格數據示例

基于輸出的表格數據,可以比較容易的判斷每個數據項的優化影響范圍,下表為表格數據的示例。

△注:表格數據非真實業務場景數據△注:表格數據非真實業務場景數據

3.3.2 數據項的預分析統計輸出

基于數據的調用關系數據,確定每個數據項被每個組件使用的情況,并確定重構的方式。

同樣,表格的輸出Python沒有使用有excel操作的相關庫,使用 ,(逗號)作為分隔符,存儲為.csv文件,在excel中導入csv文件使用。

具體的實現為依次的讀取數據項,計算每個數據項被組件的使用情況,并將結果輸出到.csv文件中。

# 表頭分別為 ,數據項 ,使用的組件 ,組件中總使用次數 , 使用類型
outfiledata = 'value , uselib , usenum , usetype \n'
# 遍歷全局字典,獲取每個數據項 及數據項的調用信息
# {數據項:{文件名:該文件內數據項調用的次數}}
for.valueName , valueInfo in valueCallInfoDic.items():
    libCallInfo = {}
    # 從數據項的調用信息中獲取,文件名和該文件內數據項調用的次數
    # {文件名:該文件內數據項調用的次數}
    for.fileName , callNum in valueCallInfoDic.items():
        # libByFile 函數,實現根據文件獲取所在的組件名
        libName =  libByFile(fileName)
        if libName in libCallInfo:
            libCallInfo[libName] = int(libCallInfo[libName]) + int(callNum)
        else:
            libCallInfo[libName] = callNum
    # 每個組件的使用XXXSetting 的數據項情況
    hasSelfCall = False
    useType = ""
    for.libName in libCallInfo:
        if libName == "XXXSetting":
            hasSelfCall = True
            break
    if len(libCallInfo) == 1:
        if hasSelfCall:
            # 配置數據項僅在XXXSetting模塊內使用,這部分數據項不需要接入數據通路。
            useType = "selfCall"
        else:
            # 配置數據項在XXXSetting模塊內沒有使用,只在一個模塊中使用,這類數據項應該遷移到使用該數據項的模塊中。
            useType = "otherCall"
    else:
        if hasSelfCall:
            # 配置數據項在XXXSetting模塊內使用,也在其它的模塊中使用,這類數據項在XXXSetting模塊中維護,數據項需要接入數據通路。
            useType = "selfAndOtherCall"
        else:
            # 配置數據項在XXXSetting模塊內沒有使用,但在一個以上模塊中使用,這類數據項可以在XXXSetting模塊中維護,但數據項需要接入數據通路。
            useType = "othersCall"
    for.libName , libCallNum in libCallInfo.items():
        outfiledata += valueName + " , "
        outfiledata += libName + " , "
        outfiledata += libCallNum + " \n"
表格數據示例

基于輸出的表格數據,可以比較容易的判斷每個數據項應該如何整改,下表為表格數據的示例。

注:表格數據非真實業務場景數據注:表格數據非真實業務場景數據

04小結

以上的內容,介紹了代碼重構過程的工作及挑戰,同時以Python腳本實現分析模塊的調用關系的統計,基于該腳本,在重構工作開始之前,可以精確統計每個XXXSetting類對外公開的類成員屬性,被其它組件使用的情況。基于統計的數據,可以感知對應的每個成員屬性在App中的使用情況,且可容易的評估XXXSetting數據項重構升級為數據通路工作所帶來的影響。

當這部分工作,使用人工的方式實現,依次查找每個成員屬性的在App中的使用情況及分類記錄,是一件重復性高,出錯概率高的工作。而使用自動化工具,很好的規避了這些問題,且長期可積累。

責任編輯:武曉燕 來源: 百度Geek說
相關推薦

2022-07-04 07:37:51

模板模式重構

2021-05-26 08:50:37

JavaScript代碼重構函數

2017-07-13 11:08:52

PythonC模塊性能分析

2023-06-28 08:12:49

Python代碼重構

2017-08-08 16:07:57

Android 模塊化架構

2017-08-11 16:10:36

微信Android實踐

2010-03-26 15:55:47

Python腳本

2023-10-19 08:00:00

2010-03-25 16:31:55

Python代碼

2017-05-12 09:24:21

Python代碼Logger

2022-02-21 11:24:14

代碼工具開發

2024-02-20 22:13:48

Python項目Java

2022-08-08 08:10:42

Antlr解釋器工具

2021-08-03 08:13:48

重構API代碼

2024-02-22 10:27:00

Python開發

2012-07-27 10:30:12

重構

2023-07-26 06:43:07

函數調用

2024-04-26 13:21:32

可視化拖拽模塊

2011-06-09 15:27:01

JavaScript

2019-04-03 08:10:17

代碼架構信息
點贊
收藏

51CTO技術棧公眾號

亚洲国产天堂| 麻豆影视国产在线观看| 久久午夜精品| 日韩一中文字幕| 美国黄色一级视频| 日韩高清中文字幕一区二区| 中文字幕日本不卡| 久久爱av电影| 国产毛片毛片毛片毛片毛片| 99综合在线| 俺去亚洲欧洲欧美日韩| 亚洲观看黄色网| 四虎国产精品免费久久| 精品欧美一区二区三区| 国产精品亚洲天堂| 免费一级毛片在线观看| 国产精品一级黄| 国产精国产精品| 日本三级视频在线| 久久久久久久久久久9不雅视频| 精品视频—区二区三区免费| 一级黄色片在线免费观看| 肉色欧美久久久久久久免费看| 一区二区三区在线视频观看 | 久久久久久99精品| 成人午夜电影免费在线观看| 怡红院男人的天堂| 亚洲综合精品四区| 国内精品400部情侣激情| 神马久久精品综合| 日本大胆欧美| 亚洲人成在线一二| 日本护士做爰视频| 成人av影音| 欧美一区二区女人| 欧美特黄aaa| jizz免费一区二区三区| 色综合天天在线| 香港三级韩国三级日本三级| 免费在线观看av电影| 亚洲免费观看高清完整版在线| 亚洲不卡1区| 奇米影视888狠狠狠777不卡| 国产成人免费在线观看不卡| 成人网址在线观看| 亚洲图片欧美在线| 久久99久久久久| 国产欧美一区二区三区四区| 中文字幕一区二区三区人妻四季| 狂野欧美性猛交xxxx巴西| 欧美一级在线亚洲天堂| 天天综合网久久综合网| 国产情侣久久| 欧美性在线视频| 99精品在线播放| 日韩av一区二区三区四区| 国产精品黄视频| 在线免费观看日韩视频| 精品一区二区三区视频| 91精品国产综合久久久久久蜜臀 | 久久视频免费看| 欧美视频不卡| 97在线视频免费观看| 国产福利拍拍拍| 午夜亚洲视频| 国产精品久久久亚洲| 中文字幕黄色av| 久久精品久久精品| 91久热免费在线视频| 国产wwwxxx| 丰满放荡岳乱妇91ww| 国产另类自拍| 精品999视频| 国产精品麻豆久久久| 日本精品免费视频| 成人av影院在线观看| 欧美日韩美女在线观看| 成年人在线看片| 色综合久久久| 精品粉嫩超白一线天av| wwwwww日本| 色综合五月天| 欧美精品福利视频| 午夜精品一区二| 国内国产精品久久| 精品国产区在线| av在线播放免费| 亚洲欧洲中文日韩久久av乱码| 精品国产av无码一区二区三区| 丝袜老师在线| 欧美美女直播网站| av网页在线观看| 久久电影院7| 97在线观看视频| 国产精品一二三四五区| 99精品视频在线播放观看| 无码免费一区二区三区免费播放| www.久久久久.com| 亚洲成人免费在线观看| 在线观看免费黄网站| 成人在线视频你懂的| 一区二区在线视频播放| 国产一级av毛片| 日本免费新一区视频| 国产精品久久久久久久免费大片| av免费观看一区二区| 亚洲狠狠爱一区二区三区| 牛夜精品久久久久久久| 亚洲码欧美码一区二区三区| 一区二区三区亚洲| 97人人澡人人爽人人模亚洲| 久久国产成人午夜av影院| 久久精品国产精品青草色艺| 国产三区视频在线观看| 日韩欧美亚洲成人| 日批免费观看视频| 中文字幕日韩一区二区不卡| 国产成人精品一区二区| 日韩在线视频观看免费| 亚洲人成网站影音先锋播放| 无码内射中文字幕岛国片| 国产精品久久久久久久久久白浆| 有码中文亚洲精品| 久久久久久久久久久久久av| 国产传媒久久文化传媒| 在线播放豆国产99亚洲| 欧美国产日韩电影| 亚洲乱亚洲乱妇无码| 国产无码精品在线播放| 国产一区二区在线观看视频| 亚洲欧美日韩精品久久久| 日韩欧美看国产| 亚洲精品自拍偷拍| 国产成人免费观看视频 | 舐め犯し波多野结衣在线观看| 99av国产精品欲麻豆| 97se亚洲综合| 亚洲91av| 日韩精品一区二区三区老鸭窝| 男人操女人的视频网站| 激情综合五月天| 一区二区三区四区国产| 色8久久久久| 久久亚洲国产精品成人av秋霞| 中文字幕欧美人妻精品| 国产网红主播福利一区二区| 欧美三级午夜理伦三级| 日韩深夜福利| 青草青草久热精品视频在线观看| 青青视频在线观| 欧美色播在线播放| 波多野结衣 在线| 视频一区二区不卡| 午夜精品亚洲一区二区三区嫩草 | 免费一区视频| 欧美一级爽aaaaa大片| 欧美日韩大片| 色久欧美在线视频观看| 国产免费福利视频| 一区二区三区四区国产精品| 亚洲少妇一区二区| 亚洲精品系列| 欧美在线一二三区| 国产亚洲精彩久久| 草民午夜欧美限制a级福利片| 99精品国产99久久久久久97| 亚洲在线一区二区三区| 国产精品久久久免费观看| 久久天天综合| 亚洲国产精品影视| 国产 日韩 欧美 综合 一区| 欧美中文字幕在线观看| 91大神在线网站| 欧美一卡二卡在线观看| 国产亚洲精品码| 久久亚洲一级片| 国产一级片自拍| 欧美天堂亚洲电影院在线观看 | 性感美女视频一二三| 色综合天天综合狠狠| 天天爽天天爽天天爽| 顶级嫩模精品视频在线看| 成人av一级片| 婷婷综合网站| 激情五月综合色婷婷一区二区 | 成人91免费视频| 依依综合在线| 久久天天躁夜夜躁狠狠躁2022| 丰满人妻一区二区三区无码av| 欧美日韩亚洲精品一区二区三区| 黑人と日本人の交わりビデオ| 国产成人免费在线| 黄色三级视频片| 国产精品a久久久久| 欧美性色黄大片人与善| 亚洲91网站| 国产成人精品av在线| www免费在线观看| 亚洲欧美日韩中文在线| 国产99久久九九精品无码免费| 天天操天天色综合| 午夜剧场免费在线观看| 91网站在线播放| 国产永久免费网站| 欧美一级网站| 男女激情免费视频| 亚洲精品va| 日韩久久在线| 久久97精品| 亚洲综合小说区| 91久久久久久白丝白浆欲热蜜臀| 欧美黑人又粗大| 黄视频在线观看网站| 国产婷婷成人久久av免费高清| 国产手机视频在线| 在线免费视频一区二区| 欧美三级日本三级| 国产喷白浆一区二区三区| 国产又粗又猛又色| 国产精品一区二区无线| 国产精品久久a| 久久精品一区二区国产| 日韩伦理在线免费观看| 中文字幕一区二区av| youjizz.com亚洲| 日韩成人激情| 欧美一区观看| 少妇精品久久久| 麻豆av一区二区| 韩国精品福利一区二区三区| av色综合网| 97久久精品一区二区三区的观看方式 | 日韩一区国产二区欧美三区| 伊人网中文字幕| 在线观看视频一区二区欧美日韩| av大片在线免费观看| 天天做天天摸天天爽国产一区| 久久久久久久国产精品毛片| 亚洲欧美日韩中文字幕一区二区三区| 91制片厂在线| 国产精品久久久久久久久动漫| 久久久久久国产免费a片| 国产人久久人人人人爽| 国产美女永久免费无遮挡| 久久亚洲精精品中文字幕早川悠里 | 国产一级做a爰片久久毛片男| 亚洲精品va| 国产成人亚洲综合无码| 国产一区二区三区四区三区四| 欧美日韩视频免费在线观看| 亚洲国产精品久久久久蝴蝶传媒| 国产一区一区三区| 欧美成人69| 韩日视频在线观看| 中文精品在线| 久久国产色av免费观看| 日韩黄色在线观看| gogogo高清免费观看在线视频| 久久狠狠亚洲综合| 韩国一区二区在线播放| 成人免费毛片app| www.超碰97| 亚洲国产高清aⅴ视频| 九一在线免费观看| 亚洲欧美日韩在线| 日本熟妇乱子伦xxxx| 日韩欧美在线网址 | 精品精品国产高清一毛片一天堂| 神马午夜一区二区| 亚洲香蕉av在线一区二区三区| 素人av在线| 欧美丰满少妇xxxxx| 久久毛片亚洲| 亚洲www视频| 日韩在线麻豆| 亚洲一区二区三区午夜| 女人香蕉久久**毛片精品| 国产特级淫片高清视频| 日本 国产 欧美色综合| 日韩精品――色哟哟| 久久亚洲精品小早川怜子| 午夜精品一区二区三级视频| 亚洲v日本v欧美v久久精品| 超碰在线97观看| 日韩一级完整毛片| 国产一级片在线播放| 久久99亚洲热视| 婷婷午夜社区一区| 5566中文字幕一区二区| 国产探花一区二区| 成年在线观看视频| 日韩av午夜在线观看| 亚洲国产精品狼友在线观看| 久久综合国产精品| 老司机成人免费视频| 欧美三级xxx| a在线观看免费| 亚洲视屏在线播放| 精精国产xxxx视频在线中文版| 国产精品久久久久久久久久新婚| 成人台湾亚洲精品一区二区| 亚洲国产一区二区三区在线播| 亚洲视频一二| 中文字幕 欧美日韩| 26uuu欧美| 国产精品2020| 宅男在线国产精品| jizz在线观看| 欧美在线观看网站| 91蝌蚪精品视频| 成人手机视频在线| 日本三级亚洲精品| 四虎永久免费影院| 亚洲国产综合人成综合网站| 91亚洲视频在线观看| 亚洲欧美综合另类中字| a级片在线免费观看| 91精品久久久久久蜜桃| 久久国产亚洲| 男人的天堂日韩| 26uuu色噜噜精品一区二区| 日韩精品――中文字幕| 欧美一区二区啪啪| 黄在线免费看| 国产欧美婷婷中文| 日韩在线精品| 午夜国产一区二区三区| 久久久一区二区三区| 中文字幕日韩一级| 亚洲激情 国产| 91福利在线免费| 国产区一区二区三区| 尤物网精品视频| 岛国精品一区二区三区| 亚洲一区二区三区三| www.国产免费| 色综合老司机第九色激情| 日韩视频在线直播| 狠狠精品干练久久久无码中文字幕| 精品亚洲欧美一区| 超碰手机在线观看| 欧美一级理论片| 手机在线免费看av| 粉嫩av一区二区三区免费观看| 欧美日本不卡高清| yjizz视频| 欧美日韩一区免费| 黄色电影免费在线看| 国产精品第二页| 欧美中文字幕一区二区| 日本成人中文字幕在线| 国产精品三级av在线播放| 国产精品视频无码| 久久99久久久久久久噜噜| 丁香五月缴情综合网| 欧美在线观看www| 久久嫩草精品久久久久| 国产成人精品一区二区色戒| 久久夜色撩人精品| 中文字幕日韩在线| 国产精品va无码一区二区| www精品美女久久久tv| 看黄色一级大片| www.午夜精品| 日韩精品一区国产| 黄网站欧美内射| 国产婷婷精品av在线| 一区二区精品视频在线观看| 欧美成人全部免费| 美女视频亚洲色图| 另类小说第一页| 尤物视频一区二区| 深夜影院在线观看| 国产日韩欧美夫妻视频在线观看| 午夜欧美理论片| 国产人妻人伦精品1国产丝袜| 在线观看亚洲一区| jizzjizz亚洲| 久久偷窥视频| 韩国精品免费视频| 91国产丝袜播放在线| 中文字幕欧美亚洲| av日韩精品| 天堂av在线网站| 亚洲国产成人porn| 国产51人人成人人人人爽色哟哟| 亚洲一区亚洲二区| 玖玖精品视频| 国产性猛交普通话对白| 中文字幕亚洲欧美| av综合网址| 亚洲免费999| 欧美日韩在线第一页| 美女隐私在线观看| 欧美二级三级| 成人动漫视频在线| 中文字幕一区二区人妻| 欧美亚洲国产日本| 午夜精品亚洲| www久久久久久久|