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

如何重構一些可怕的代碼

開發 前端
重構本身并不總是合理的。 但是,很難想象有人會抱怨增加測試范圍,尤其是在涵蓋如此關鍵的功能的情況下。

最近,我不得不重構一些處于粗糙狀態的代碼:

  1. function endpoint(service, version = '') { 
  2.   let protocol 
  3.   let domain 
  4.  
  5.   if (service === 'webclient') { 
  6.     protocol = __CLIENT_PROTOCOL__ 
  7.     domain = `${__ENV__}-${service}.${__DOMAIN__}` 
  8.     if (__SERVER__) { 
  9.       protocol = 'http' 
  10.     } else if (__ENV__ === 'production') { 
  11.       domain = `www.${__DOMAIN__}` 
  12.     } 
  13.   } else { 
  14.     if (__ENV__ !== 'local') { 
  15.       if (__SERVER__) { 
  16.         protocol = 'http' 
  17.         domain = `${__ENV__}-${service}` 
  18.         domain += `.${__DOMAIN__}` 
  19.       } else { 
  20.         protocol = __CLIENT_PROTOCOL__ 
  21.         domain = `${__ENV__}-api.${__DOMAIN__}` 
  22.         if (service !== 'core') { 
  23.           domain += `/${service}` 
  24.         } 
  25.         if (version) { 
  26.           domain += `/${version}` 
  27.         } 
  28.       } 
  29.     } else { 
  30.       protocol = 'http' 
  31.  
  32.       if (service === 'core') { 
  33.         if (__CLIENT__) { 
  34.           domain = `api.${__DOMAIN__}` 
  35.         } else { 
  36.           domain = `api.${__DOMAIN__}:80` 
  37.         } 
  38.       } else { 
  39.         if (__CLIENT__) { 
  40.           domain = `api.${__DOMAIN__}/${service}/${version}` 
  41.         } else { 
  42.           domain = `api.${__DOMAIN__}:80/${service}/${version}` 
  43.         } 
  44.       } 
  45.     } 
  46.   } 
  47.  
  48.   const url = `${protocol}://${domain}` 
  49.  
  50.   return url 
  51.  
  52. export default endpoint 

上面的邏輯確定端點的URL,它取決于多種因素:您使用的服務,在服務器或客戶端上呈現的服務,在生產環境或測試環境中使用的服務等。

一段代碼變得如此混亂的原因之一是,當我們忘記重復比錯誤的抽象要便宜得多時。

好消息是,您可以應用幾種簡單的技術來簡化嵌套的if-else語句。 壞消息是,這段代碼對應用程序至關重要,因為所有請求都在調用它。 哦,它也沒有經過測試!

所以,這就是我重構的方式…

1. 給該代碼100%的測試覆蓋率

我沒有執行重構代碼的任務,所以打電話了。 但是我不知道要花多少時間(我本該用來交付其他東西的時間)。

重構本身并不總是合理的。 但是,很難想象有人會抱怨增加測試范圍,尤其是在涵蓋如此關鍵的功能的情況下。 因此,我決定從此開始,不僅是為了讓我對重構充滿信心,而且因為當我完成測試時,我將更好地了解重構的難度,并且我可以進行/不進行。 去打電話。

如今,我們大多數人都在Gousto中實踐TDD,但是代碼庫的這一特定部分是幾年前的,它的重要性和狀態阻礙了我和其他人在過去對其進行重構。

TDD的主要好處是無需擔心,也無需花費成本即可進行重構-羅伯特·馬丁(Robert C. Martin,鮑勃叔叔)

我還想確保覆蓋率是100%,所以我使用了Jest標志–coverage,它提供了以下輸出:

  1. -------------------|----------|----------|----------|----------|-------------------| 
  2. File               |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s | 
  3. -------------------|----------|----------|----------|----------|-------------------| 
  4.   ...              |      ... |      ... |      ... |      ... |                ...| 
  5.   endpoint.js      |      100 |      100 |      100 |      100 |                   | 
  6.   ...              |      ... |      ... |      ... |      ... |                ...| 
  7. -------------------|----------|----------|----------|----------|-------------------| 
  8. Test Suites: 1 passed, 1 total 
  9. Tests:       12 passed, 12 total 

2. 提取功能

現在我們有了測試,有了更多的信心,我們可以開始拆分代碼。 讓我們從頭開始。 我們看到,根據服務,環境,客戶端/服務器端……為協議分配了不同的值,然后將其添加到函數末尾的其余url中。

  1. const url = `${protocol}://${domain}` 

因此,我們可以將確定協議的代碼抽象為自己的函數,只需調用一次即可:

  1. import endpoint from 'config/endpoint' 
  2.  
  3. describe('endpoint.js', () => { 
  4.   global.__DOMAIN__ = 'gousto.local' 
  5.   let service 
  6.  
  7.   describe('when the service is "webclient"', () => { 
  8.     beforeEach(() => { 
  9.       service = 'webclient' 
  10.     }) 
  11.  
  12.     describe('and being in the server side', () => { 
  13.       beforeEach(() => { 
  14.         global.__SERVER__ = true 
  15.         global.__ENV__ = 'whateverenv' 
  16.       }) 
  17.  
  18.       test('an http address with the corresponding ENV, SERVICE and DOMAIN is returned', () => { 
  19.         const url = endpoint(service) 
  20.         expect(url).toBe(`http://${__ENV__}-${service}.${__DOMAIN__}`) 
  21.       }) 
  22.     }) 
  23.  
  24.     describe('and not being in the server side', () => { 
  25.       ... 
  26.       describe('and the environment is production', () => { 
  27.         ... 
  28.         test('an https address with "www" and without the service, but with the DOMAIN is returned', () => {...}) 
  29.       }) 
  30.  
  31.       describe('and the environment is not production', () => { 
  32.         ... 
  33.         test('an https address with the corresponding ENV, SERVICE and DOMAIN is returned', () => {...}) 
  34.       }) 
  35.     }) 
  36.   }) 
  37.  
  38.   describe('when the service is not "webclient"', () => { 
  39.     ... 
  40.     describe('and the env is not "local"', () => { 
  41.       ... 
  42.       describe('and being in the server side', () => { 
  43.         ... 
  44.         test('an http address with the corresponding ENV, SERVICE and DOMAIN is returned', () => {...}) 
  45.       }) 
  46.  
  47.       describe('and not being in the server side', () => { 
  48.         ... 
  49.         describe('and the service is core', () => { 
  50.           ... 
  51.           test('an https API address with the corresponding ENV and DOMAIN is returned', () => {...}) 
  52.  
  53.           describe('and a version was passed', () => { 
  54.             test('an https API address with the corresponding ENV, DOMAIN, SERVICE and VERSION is returned', () => {...}) 
  55.           }) 
  56.         }) 
  57.  
  58.         describe('and a version was passed', () => { 
  59.           test('an https API address with the corresponding ENV, DOMAIN, SERVICE and VERSION is returned', () => {...}) 
  60.         }) 
  61.  
  62.         describe('and a version was not passed', () => { 
  63.           test('an https API address with the corresponding ENV, DOMAIN and SERVICE is returned', () => {...}) 
  64.         }) 
  65.       }) 
  66.     }) 
  67.  
  68.     describe('and the env is "local"', () => { 
  69.       ... 
  70.       describe('and the service is core', () => { 
  71.         ... 
  72.         describe('and being in the client side', () => { 
  73.           ... 
  74.           test('an http API address with the corresponding DOMAIN is returned', () => {...}) 
  75.         }) 
  76.  
  77.         describe('and not being in the client side', () => { 
  78.           ... 
  79.           test('an http API address with the corresponding DOMAIN and port 80 is returned', () => {...}) 
  80.         }) 
  81.       }) 
  82.  
  83.       describe('and the service is not core', () => { 
  84.         ... 
  85.         describe('and being in the client side', () => { 
  86.           ... 
  87.           test('an http API address with the corresponding DOMAIN, SERVICE and VERSION is returned', () => {...}) 
  88.         }) 
  89.  
  90.         describe('and not being in the client side', () => { 
  91.           ... 
  92.           test('an http API address with the corresponding DOMAIN, port 80, SERVICE and VERSION is returned', () => {...}) 
  93.         }) 
  94.       }) 
  95.     }) 
  96.   }) 
  97. }) 

我們可以對URL的其余部分執行與getProtocol()相同的操作。 提取的功能越多,if-else的地獄就越容易簡化,提取剩余的內容就越容易。 因此,我的建議是從最小的復雜度入手,因為這將使其余的操作更為簡單。

提取這些函數并不復雜,但這是因為我將if-else的噩夢翻譯成了它們。 因此,我們沒有大的混亂,但有一些小混亂。 不能接受 讓我們來照顧它。

3. 簡化

除了關注點分離之外,將url的不同部分提取為不同功能的優點是可以進一步簡化條件。 之前,URL的某些部分限制了簡化,因為它們需要滿足多個條件。 現在,它們是分開的,所以我們不必為此擔心。

您可以只是出于對它的關注而進行簡化……或者您可以使用真值表來提供幫助。

對于getProtocol(),一種真值表如下所示:

但可以簡化一下("-"表示該值無關緊要):

我們只有兩個可能的值:http和https,因此我們可以采用較少行(https)的值,檢查條件,然后返回另一個(http)。

  1. const getProtocol = (service, isServerSide, environment) => { 
  2.   if (service === 'webclient' && !isServerSide) { 
  3.     return 'https' 
  4.   } 
  5.    
  6.   if (service !== 'webclient' && !isServerSide && environment !== 'local') { 
  7.    return 'https'  
  8.   } 
  9.    
  10.   return 'http' 

這已經比上一節中的要好。 但是我們仍然可以做更多! 檢查前兩個條件,您可能會發現只有在我們不在服務器端時才獲得https。 因此,我們可以為http編寫第一個條件,并在函數的其余部分中擺脫isServerSide:

  1. const getProtocol = (service, isServerSide, environment) => { 
  2.   if (isServerSide) { 
  3.     return 'http' 
  4.   } 
  5.    
  6.   if (service === 'webclient') { 
  7.     return 'https' 
  8.   } 
  9.    
  10.   if (service !== 'webclient' && environment !== 'local') { 
  11.    return 'https'  
  12.   } 
  13.    
  14.   return 'http' 

不過,我們可以做得更好。 現在我們可以合并第二個和第三個條件,因為它們較小:

  1. const getProtocol = (service, isServerSide, environment) => { 
  2.   ... 
  3.   if (service === 'webclient' ||  
  4.       (service !== 'webclient' && environment !== 'local')) { 
  5.     return 'https' 
  6.   } 
  7.   ... 

但是,請保持……這種狀況有點愚蠢,不是嗎? 如果服務是webclient,則條件為true。 否則……轉到OR的第二部分,為什么我們需要檢查服務是否不是webclient? 如果我們在OR的右側,那么我們確定它不是webclient。 最終結果看起來很整潔,特別是與第2部分中的原始結果相比。提取功能:

  1. const getProtocol = (service, isServerSide, environment) => { 
  2.   if (isServerSide) { 
  3.     return 'http' 
  4.   } 
  5.  
  6.   if (service === 'webclient' || environment !== 'local') { 
  7.     return 'https' 
  8.   } 
  9.  
  10.   return 'http' 

結果

多虧了功能的提取,我們最終有了一個endpoint()函數,這是我寫的榮幸。

  1. ... 
  2.  
  3. function endpoint(service, version = '') { 
  4.   const protocol = getProtocol(service, __SERVER__, __ENV__) 
  5.   const subdomain = getSubdomain(service, __SERVER__, __ENV__) 
  6.   const path = getPath(service, __SERVER__, __ENV__, version) 
  7.   const port = getPort(service, __ENV__, __CLIENT__) 
  8.  
  9.   return `${protocol}://${subdomain}.${__DOMAIN__}${port}${path}` 
  10.  
  11. export default endpoint 

上面代碼的get函數很小,足以被理解而不會動您的大腦。 并非所有人都像我想要的那樣簡單,但是它們比原始代碼要好得多。 您可以在這里看到文件的外觀。

最后,您應該始終嘗試遵循以下規則:讓代碼比發現的要好。 盡管贊美❤️不要這么做

> GitHub comment in the PR

> A team mate making my day

現在輪到您了,您是否有任何想法使它變得更簡單(無需更改在其余應用程序中的使用方式)? 您對重構的處理方式會有所不同嗎?

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2009-06-22 15:36:00

如何學好java

2009-11-26 10:32:57

PHP代碼優化

2020-09-21 06:58:56

TS 代碼建議

2021-10-31 07:36:17

前端JavaScript編程

2012-12-24 14:51:02

iOS

2019-08-01 12:56:00

Python代碼記錄

2023-03-09 17:54:04

2013-03-29 09:03:59

iOS實用小代碼iOS開發

2009-08-04 16:06:19

ASP.NET代碼分離

2013-03-29 13:17:53

XCode調試技巧iOS開發

2012-05-21 10:13:05

XCode調試技巧

2011-07-13 09:13:56

Android設計

2009-07-21 09:55:45

iBATIS分頁

2011-03-15 17:46:43

2020-02-03 16:03:36

疫情思考

2013-07-02 10:18:20

編程編程策略

2016-11-16 21:18:42

android日志

2013-07-02 09:43:02

編程策略

2009-06-25 09:50:32

JSF

2010-09-28 14:14:19

SQL語句
點贊
收藏

51CTO技術棧公眾號

激情欧美亚洲| 国产精品久久久久77777| 国产卡一卡二在线| 日韩不卡视频在线| 少妇一区二区三区| 色婷婷香蕉在线一区二区| 国产精品有限公司| 久久久久亚洲av成人片| 久久精品国产亚洲5555| 精品国产精品三级精品av网址| 精品福利影视| 免费污污视频在线观看| 日韩精品免费| 欧美精品tushy高清| 中文视频一区视频二区视频三区| www.av在线.com| 亚洲小说区图片区| 国产午夜精品美女视频明星a级| 东北少妇不带套对白| 成人午夜福利视频| 天堂精品中文字幕在线| 国产亚洲成av人片在线观看桃| 国产一级片自拍| 欧美三级黄网| 亚洲中字黄色| 亚洲欧美日本另类| 一本之道在线视频| 国产福利电影在线播放| 中文成人av在线| 成人免费观看网址| 久草精品视频在线观看| 残酷重口调教一区二区| 精品久久久久久综合日本欧美| 日韩av资源在线| 天堂资源在线中文| 91在线国内视频| 国产日韩精品入口| 久久精品欧美一区二区| 日韩dvd碟片| 亚洲精品国产福利| 亚洲国产欧美91| 成人勉费视频| 一二三四社区欧美黄| 午夜欧美性电影| 一级特黄aa大片| 国产一区导航| 欧美福利视频在线观看| 国产精品美女高潮无套| 超碰cao国产精品一区二区| 欧美在线免费观看视频| 成人免费看片'免费看| 成人资源www网在线最新版| 不卡的电视剧免费网站有什么| 国产男女猛烈无遮挡91| 中文字幕一区在线播放| 影音先锋久久精品| 另类天堂视频在线观看| 激情五月激情综合| 国产探花在线精品| 精品视频偷偷看在线观看| 日批视频免费看| 综合久久av| 欧美日韩一区三区四区| 激情五月婷婷久久| 丝袜美腿诱惑一区二区三区| 五月天亚洲婷婷| 欧美黑人在线观看| 里番在线播放| 亚洲精品福利视频网站| 国产四区在线观看| 毛片网站在线免费观看| 国产清纯白嫩初高生在线观看91 | 日韩欧美在线视频日韩欧美在线视频 | 久草免费新视频| 亚洲精品二区三区| 久久在线精品视频| 印度午夜性春猛xxx交| 忘忧草精品久久久久久久高清| 中文字幕日韩在线视频| 久久久国产一级片| 成人嫩草影院| www.亚洲免费视频| 国产三级黄色片| 91青青国产在线观看精品| 色婷婷av一区二区三区久久| 中文字幕资源站| 亚洲mv大片欧洲mv大片| 欧美刺激性大交免费视频| 青青草原免费观看| 亚洲91精品| 久久久视频在线| 日本视频免费在线| 亚洲国产国产亚洲一二三| 欧美精品成人91久久久久久久| 精品少妇一二三区| 99精品热6080yy久久| 日韩av免费在线看| 男人天堂2024| 日韩影院精彩在线| 欧美极品少妇xxxxⅹ喷水| 69av.com| 欧美区日韩区| 欧美最顶级丰满的aⅴ艳星| 免费观看日批视频| 青青草国产精品亚洲专区无| 久久久久久久久国产一区| 国产美女无遮挡网站| 男男激情在线| 久久久国际精品| 欧洲一区二区在线观看| 日本aaa在线观看| 久久亚洲综合色| 日本一区视频在线观看免费| 国产乱色在线观看| 黑人巨大精品欧美一区免费视频 | 欧美在线综合视频| 手机看片国产精品| 精品人人人人| 欧美一区二区三区不卡| 毛茸茸free性熟hd| 91成人午夜| 日韩精品一区国产麻豆| 国产一级免费片| 日韩激情一区| 久久久黄色av| 少妇太紧太爽又黄又硬又爽| 紧缚奴在线一区二区三区| 国产专区一区二区三区| 久操免费在线| 亚洲一区二区三区四区五区黄 | 精品少妇久久久| 奇米888四色在线精品| www.成人三级视频| 日韩毛片久久久| 精品国产精品自拍| 亚洲精品久久久久久| 成人短片线上看| 91精品国产成人| jizz中国少妇| 中文av一区二区| 欧美牲交a欧美牲交aⅴ免费真| 日韩有吗在线观看| 中文字幕亚洲综合| 国产伦精品一区二区三区视频我| 国产一区999| 婷婷五月色综合| 精灵使的剑舞无删减版在线观看| 欧美另类变人与禽xxxxx| 国产激情第一页| 欧美阿v一级看视频| 极品美女扒开粉嫩小泬| 久久亚洲国产成人精品性色| 日韩一区精品视频| 久久99影院| 污视频在线免费观看网站| 欧美三级电影一区| 在线观看日本中文字幕| 国产精品日韩| 成人欧美一区二区三区视频| 福利视频在线| 欧美日韩成人高清| 国产18无套直看片| 日韩精品一区第一页| 日本免费一区二区三区| 欲香欲色天天天综合和网| 欧美电影免费观看完整版 | 奇米四色…亚洲| 欧美亚洲免费高清在线观看| 激情aⅴ欧美一区二区欲海潮| 亚洲免费婷婷| 欧美午夜激情视频| 99精品一区二区三区无码吞精| 小处雏高清一区二区三区| 国产欧美精品一区二区| 欧美成人hd| 在线播放中文一区| www.99热| 精品一区二区在线看| 国产卡一卡二在线| 日本成人手机在线| 久久久久久久久久亚洲| 日本精品久久久久久| 亚洲国产视频一区二区| 一级黄色电影片| 亚洲国产1区| 国内精品视频在线播放| 在线日韩影院| 夜夜嗨av一区二区三区四区| 中文字幕av影视| 国产免费观看久久| 加勒比av中文字幕| 欧美一区二区三区免费看| 成人在线精品视频| 亚洲大胆人体大胆做受1| 日韩欧美国产一二三区| 日韩黄色三级视频| 国产日韩欧美一区二区三区综合| 茄子视频成人免费观看| 欧美影院三区| 国产精品成人久久久久| 黄色网页在线播放| 亚洲精品在线观看视频| 亚洲图片在线视频| 中文字幕一区二区三区在线观看| 亚洲不卡视频在线| 日韩在线观看| av成人综合网| 欧美成人ⅴideosxxxxx| 久久精品国产欧美亚洲人人爽| 精品久久在线观看| 亚洲成人激情av| av永久免费观看| 国模无码大尺度一区二区三区| 亚洲乱码一区二区三区| 久久中文字幕一区二区| 欧美高清性猛交| 精品推荐蜜桃传媒| 欧美一区二区三区婷婷月色| 欧美一二三区视频| 国产精品色婷婷| 天堂网成人在线| 免费看的黄色欧美网站| 91社在线播放| 免费久久精品| 国产精品com| 伦理在线一区| 久久精品美女视频网站| 欧美熟妇另类久久久久久不卡| 欧美三级三级三级爽爽爽| 99自拍视频在线| av电影在线观看一区| 四季av一区二区| 仙踪林久久久久久久999| 欧美日韩电影一区二区| 亚洲一区二区av| 日本一区二区不卡| 国产盗摄一区二区| 久久天堂电影网| 国产玉足榨精视频在线观看| 亚洲大胆人体在线| 国产高清第一页| 欧美日韩国产高清一区二区| 亚洲熟女综合色一区二区三区| 一区二区三区中文字幕| 在线国产视频一区| 91免费看片在线观看| avtt中文字幕| 国内久久精品视频| 久久久久久香蕉| 99精品国产在热久久婷婷| 国产日韩亚洲欧美在线| 亚洲草久电影| 在线观看成人av| 不卡在线一区| 天天好比中文综合网| 四虎5151久久欧美毛片| 国产伦精品一区二区三区照片91 | 91麻豆成人精品国产| 欧洲亚洲国产日韩| 亚洲 欧美 中文字幕| 欧美日韩免费网站| 六月丁香在线视频| 午夜av一区二区三区| 久久久无码一区二区三区| 亚洲六月丁香色婷婷综合久久| 疯狂撞击丝袜人妻| 国产精品福利一区| youjizz亚洲女人| 国产欧美日产一区| 亚洲v国产v欧美v久久久久久| 99久久精品国产网站| 国产高清成人久久| bt7086福利一区国产| 国产成人av无码精品| 处破女av一区二区| 少妇伦子伦精品无吗| 成人亚洲精品久久久久软件| 三上悠亚 电影| 国产成人av电影在线| 中文字幕乱视频| 91原创在线视频| 欧美做受xxxxxⅹ性视频| 99re热视频精品| 最近中文字幕免费| 国产精品美女久久久久久久久久久| 日日操免费视频| 亚洲欧美区自拍先锋| 国产一级二级三级视频| 亚洲线精品一区二区三区| 国产第一页在线播放| 欧美午夜片在线免费观看| 久草视频在线免费| 欧美亚洲图片小说| 国产日韩欧美一区二区东京热| 日韩视频国产视频| 四虎精品成人免费网站| 亚洲欧美综合另类中字| 91涩漫在线观看| 欧美大奶子在线| 激情aⅴ欧美一区二区欲海潮| 国产精品成人品| 91麻豆精品国产综合久久久| 国产乱码精品一区二区三区中文 | 制服丝袜一区二区三区| 亚洲精品久久久蜜桃动漫| 亚洲男人天堂久| 黄色av网站在线免费观看| 久久久国产一区二区| 国产伦久视频在线观看| 国产精品一区电影| 777久久精品| 日韩av大全| 国内精品久久久久久久影视蜜臀| 黄色片视频在线免费观看| 精品一区二区在线视频| 亚洲天堂网一区二区| 成人欧美一区二区三区| 日韩不卡在线播放| 欧美一激情一区二区三区| 神马精品久久| 大胆欧美人体视频| 毛片无码国产| 国产精品永久免费在线| 欧美国产极品| 浴室偷拍美女洗澡456在线| 国产精品腿扒开做爽爽爽挤奶网站| 中文字幕 日韩 欧美| 92国产精品观看| 日韩va亚洲va欧美va清高| 精品久久中文字幕久久av| 国产精品久久久久久久久毛片 | 欧美午夜片欧美片在线观看| 精品久久久久成人码免费动漫| 国产亚洲欧美另类中文| 99riav视频在线观看| 91免费看片网站| 国产一区二区三区四区二区| 男女啪啪免费视频网站| 国产老女人精品毛片久久| 在线观看免费黄色网址| 欧美日韩中文在线观看| 亚洲AV无码精品自拍| 色偷偷av一区二区三区| 偷拍视频一区二区三区| 国产在线一区二| 国内精品久久久久久久影视蜜臀| 日韩av自拍偷拍| 国产精品午夜在线| 午夜毛片在线观看| 日韩一区二区高清| 麻豆传媒在线完整视频| 国产免费亚洲高清| 日韩欧美在线中字| 日韩av手机版| 中文字幕国产精品一区二区| 国产对白videos麻豆高潮| 欧美日韩电影在线| 伦xxxx在线| 成人免费网视频| 日韩免费视频| 久久免费视频3| 97久久精品人人做人人爽| 欧美日韩在线观看成人| 日韩亚洲欧美在线观看| 国产盗摄在线观看| 51国偷自产一区二区三区的来源 | 午夜伦理在线| 国产精品久久一| 免费久久久久久久久| 免费成人午夜视频| 久久综合久色欧美综合狠狠| 国产精品国产三级国产专区52| 亚洲毛片在线看| 欧美大胆性生话| 欧美日韩三区四区| 久久成人精品| 欧美大波大乳巨大乳| 欧美日韩中文精品| av香蕉成人| 国产精品私拍pans大尺度在线 | 受虐m奴xxx在线观看| 精品久久久久久久久中文字幕| 亚洲av少妇一区二区在线观看| 日韩中文字幕欧美| 亚洲视频精选| 免费一级特黄特色毛片久久看| 成人白浆超碰人人人人| 青青操视频在线播放| 精品国产乱码久久久久久久久 | 国产精品久久久久77777丨| 一本一本a久久| 国产福利一区二区三区在线视频| 日韩激情一区二区三区| 国产亚洲一区二区精品| 伊人久久一区| 青青草视频在线免费播放| 久久免费视频色| av毛片在线免费观看| www.日韩系列| 欧美三级午夜理伦三级在线观看|