欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Eclipse中自動重構實現探索

Eclipse中自動重構實現探索

熱門標簽:淮南騰訊地圖標注 電話機器人的特色和創(chuàng)新 怎樣把地圖標注出來 騰訊地圖標注商戶改名注冊入駐 商丘百應電話機器人有沒有效果 漯河辦理400電話 開封便宜外呼系統(tǒng)報價 地圖標注人員兼職 黃石智能營銷電銷機器人效果

  本文用eclipse的自動重構功能對一個程序實例進行重構,目的是探索Eclipse自動重構可以在多大程度上輔助重構這個過程。程序實例使用《Refactoring:Improving the Design of Existing Code》一書中的例子。

  Eclipse的自動重構功能能夠很好地支持各種程序元素的重命名,并自動更新相關的引用。Eclipse能夠支持方法、字段在類之間移動,并自動更新引用。Eclipse較好地支持內聯(lián)字段、函數的更新替換。Eclipse較好地支持抽取方法、變量等程序元素。

  重構的過程是一個不斷嘗試和探索的過程。Eclipse的重構支持撤銷和重做,并且能夠預覽重構結果,這些是很實用的功能。

  Eclipse的重命名、抽取方法、移動、內聯(lián)功能、更改方法特征符等代碼結構級別的重構方法,是比較成熟同時也值得使用的功能。至于設計結構上的重構,eclipse還不能很好地支持。但是作者相信,自動重構的理念應該是"工具輔助下的重構工作",人仍然承擔大部分重構工作。

  一、預備工作

  本文使用《Refactoring:Improving the Design of Existing Code》一書第一章的例子。重構前的代碼及每一步重構后的代碼見附件。讀者最好配合《Refactoring:Improving the Design of Existing Code》一書閱讀本文。

  Eclipse使用如下版本:


  同時安裝了中文語言包。

  二、重構第一步:分解并重組statement()

  目的:

  1、 把statement()函數中的swich語句提煉到獨立的函數amountFor()中。

  2、 修改amountFor()參數命名

  重構方法:

  Extract Method
  Rename Method

  方法:

  1、選中swich語句的代碼塊,在右鍵菜單中選擇"重構/抽取方法",出現參數對話框。Eclipse自動分析代碼塊中的局部變量,找到了兩個局部變量:each和thisAmount。其中,each只是在代碼塊中被讀取,但thisAmount會在代碼塊中被修改。按照重構Extract Method總結出來的規(guī)則,應該把each當作抽取函數的參數、thisAmount當作抽取函數的返回值。然而Eclipse并不做區(qū)分,直接把這兩個變量當作抽取新方法的參數,如圖。


  我們的目的是把在抽取函數中不會被修改的each作為參數;會被修改的thisAmount作為返回值。解決的辦法是,把 double thisAmount = 0; 這行代碼移到switch語句的上面,變成這樣:

  double thisAmount = 0;
  switch(each.getMovie().getPriceCode()){
  case Movie.REGULAR:
  thisAmount += 2;
  if(each.getDaysRented()>2)
  thisAmount += (each.getDaysRented()-2)*1.5;
  break;

  case Movie.NEW_RELEASE:
  thisAmount += each.getDaysRented()*3;
  break;

  case Movie.CHILDRENS:
  thisAmount += 1.5;
  if(each.getDaysRented()>3)
   thisAmount += (each.getDaysRented()-3)*1.5;
  break;
  }

  選中這段代碼,在右鍵菜單中選擇"重構/抽取方法",eclipse這次變得聰明點了,如圖。

  選擇"預覽"按鈕預先查看重構后的結果,符合我們最初的目的。


  選擇"確定"按鈕,重構后的代碼片斷如下:

  public String statement() {
  double totalAmount = 0;
  int frequentRenterPoints = 0;
  Enumeration rentals = _rentals.elements();
  String result = "Rental Record for " + getName() + " ";

  while(rentals.hasMoreElements()){
  Rental each = (Rental)rentals.nextElement();

  double thisAmount = amountFor(each);

  frequentRenterPoints ++;
  if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE each.getDaysRented()>1)
   frequentRenterPoints ++;

   result += " " + each.getMovie().getTitle() + " " +String.valueOf(thisAmount) + " ";
   totalAmount += thisAmount;
  }

  result += "Amount owed is " + String.valueOf(totalAmount) + " ";
  result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";

  return result;
  }

  /**
  * @param each
  * @return
  */
  private double amountFor(Rental each) {
  double thisAmount = 0;
  switch(each.getMovie().getPriceCode()){
  case Movie.REGULAR:
   thisAmount += 2;
   if(each.getDaysRented()>2)
    thisAmount += (each.getDaysRented()-2)*1.5;
   break;

  case Movie.NEW_RELEASE:
   thisAmount += each.getDaysRented()*3;
   break;

  case Movie.CHILDRENS:
   thisAmount += 1.5;
   if(each.getDaysRented()>3)
    thisAmount += (each.getDaysRented()-3)*1.5;
   break;
  }
  return thisAmount;
  }

  2、選中amountFor()的參數each,在右鍵菜單中選擇"重構/重命名",在對話框中輸入新的名稱:aRental,選擇確定,amountFor()中所有each的引用全部被替換成新的名稱。用同樣的辦法修改amountFor()中的局部變量thisAmount為result。重構后的amountFor()代碼如下:

  /**
  * @param aRental
  * @return
  */
  private double amountFor(Rental aRental) {
  double result = 0;
  switch(aRental.getMovie().getPriceCode()){
  case Movie.REGULAR:
   result += 2;
   if(aRental.getDaysRented()>2)
    result += (aRental.getDaysRented()-2)*1.5;
   break;

  case Movie.NEW_RELEASE:
   result += aRental.getDaysRented()*3;
   break;

  case Movie.CHILDRENS:
   result += 1.5;
   if(aRental.getDaysRented()>3)
    result += (aRental.getDaysRented()-3)*1.5;
   break;
  }
  return result;
  } 

  三、重構第二步:搬移"金額計算"代碼

  目的:

  1、 將函數amountFor()轉移到Rental類中,并更名為getCharge()。

  2、 更新并替換所有對amountFor()的引用。

  重構方法:

  Move Method
  Change Method signatrue
  Inline Method
  Inline Temp

  方法:

  1、選中函數amountFor()的定義,在右鍵菜單中選擇"重構/移動",顯示參數設置對話框。把新方法名改成getCharge。按下"確定"按鈕,Customer Class中的amountFor()函數被移動到Rental Class中,并更名為:getCharge()。


  同時eclipse自動在Customer的amountFor()函數中添加一行對新函數的"委托"代碼:

  private double amountFor(Rental aRental) {
  return aRental.getCharge();
  }

  這行代碼會產生編譯錯誤,原因是amountFor()的private型被傳遞到了新的方法中:

  /**
  * @param this
  * @return
  */
  private double getCharge() {
  ……
  }

  2、繼續(xù)重構!選中getCharge()方法,在右鍵菜單中選擇"重構/更改方法特征符",彈出參數選擇對話框,把訪問修飾符從private改成public。Eclipse的編譯錯誤提示自動消失。


  3、回到Customer類,把所有對amountFor()引用的地方替換成直接對getCharge()的引用。選中Customer類的函數amountFor(Rental aRental),在右鍵菜單中選擇"重構/內聯(lián)",出現參數選擇對話框。


  選擇"確認"按鈕,引用amountFor()的地方被替換成對getCharge()的引用。

  public String statement() {
  ……
  double thisAmount = each.getCharge();
  ……
  }

  4、除去臨時變量thisAmount。

  選中變量thisAmount,在右鍵菜單中選擇"重構/內聯(lián)",重構預覽窗口如下,可見達到了重構的目的。按下"確認"按鈕重構代碼。


  statement()代碼:

  public String statement() {
  double totalAmount = 0; // 總消費金額
  int frequentRenterPoints = 0; // ??头e點
  Enumeration rentals = _rentals.elements();
  String result = "Rental Record for " + getName() + " ";

  while(rentals.hasMoreElements()){
  Rental each = (Rental)rentals.nextElement(); //取得一筆租借記錄

  // add frequent renter points(累加 ??头e點)
  frequentRenterPoints ++;
  // add bouns for a two day new release rental
  if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE each.getDaysRented()>1)
   frequentRenterPoints ++;

  // show figures for this rental(顯示此筆租借數據)
  result += " " + each.getMovie().getTitle() + " " +
  String.valueOf(each.getCharge()) + " ";
  totalAmount += each.getCharge();
  }

  // add footer lines(結尾打印)
  result += "Amount owed is " + String.valueOf(totalAmount) + " ";
  result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";

  return result;
  }
  
  四、重構第三步:提煉"??头e點計算"代碼

  目的:提取"??头e點計算"代碼并放在Rental類中,"??头e點計算"代碼如下。

  public String statement() {
  ……
  // add frequent renter points
  frequentRenterPoints ++;
  // add bouns for a two day new release rental
  if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE each.getDaysRented()>1)
  frequentRenterPoints ++;
  ……
  }

  重構后的代碼如下:

  frequentRenterPoints += each.getFrequentRenterPoints();

  重構方法:

  Extract Method
  Move Method
  Change Method signatrue
  Inline Method

  方法:

  1、 首先,抽取代碼到獨立的函數中。

  用"抽取方法"重構代碼,函數名:getFrequentRenterPoints。很遺憾,eclipse的不能生成諸如:frequentRenterPoints += getFrequentRenterPoints(Rental aRental); 的代碼。原因是執(zhí)行自增操作的局部變量frequentRenterPoints要出現在等式右邊,因此抽取函數getFrequentRenterPoints()一定要把frequentRenterPoints作為參數。手工修改函數和對函數的引用,重構后的代碼如下:

  public String statement() {
  ……
  while(rentals.hasMoreElements()){
  ……
  frequentRenterPoints += getFrequentRenterPoints(each);
  ……
  }
  ……
  }

  /**
  * @param each
  * @return
  */
  private int getFrequentRenterPoints(Rental each) {
  if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE each.getDaysRented()>1)
  return 2;
  else
  return 1;
  }

  2、 把getFrequentRenterPoints()移動到Rental類中。

  3、 對getFrequentRenterPoints()"更改方法特征符"為public。

  4、 對Customer的函數getFrequentRenterPoints()執(zhí)行內聯(lián)操作,重構目標完成。

  五、重構第四步:去除臨時變量(totalAmount和frequentRenterPoints)

  目的:去除臨時變量(totalAmount和frequentRenterPoints)

  方法:

  1、 分析totalAmount和frequentRenterPoints的定義和引用結構如下:

  // 聲明和定義
  double totalAmount = 0;
  int frequentRenterPoints = 0;
  ……
  // 在循環(huán)中修改
  while(rentals.hasMoreElements()){
  ……
  frequentRenterPoints += each.getFrequentRenterPoints();
  ……
  totalAmount += each.getCharge();
  ……
  }
  ……
  // 在循環(huán)外使用
  result += "Amount owed is " + String.valueOf(totalAmount) + " ";
  result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";
  ……

  上述兩個變量在循環(huán)體外面定義和使用,在循環(huán)中被修改,運用Replace Temp with Query方法去除這兩個臨時變量是一項稍微復雜的重構。很遺憾,eclipse目前不支持這樣的重構。

  2、手工修改代碼。

  六、重構第五步:運用多態(tài)取代與價格相關的條件邏輯

  目的:

  1、 把Rental類中的函數getCharge()移動到Movie類中。

  2、 把Rental類中的函數getFrequentRenterPoints()移動到Movie類中。

  重構方法:

  Move Method
  Inline Method

  方法:

  1、 選中Rental類中的函數getCharge(),右鍵菜單選中"重構/移動",eclipse提示找不到接收者,不能移動。原因在于這行語句:

  switch(getMovie().getPriceCode()){//取得影片出租價格

  選中getMovie(),右鍵菜單選中"重構/內聯(lián)",確定后代碼成為:

  switch(_movie.getPriceCode()){ //取得影片出租價格

  選中getCharge(),執(zhí)行"重構/移動"后,函數被移動到Movie類中。然而這只是部分達成了重構目的,我們發(fā)現,移動后的代碼把Rental作為參數傳給了getCharge(),手工修改一下,代碼變成:

  class Movie ……
  /**
  * @param this
  * @return
  */
  public double getCharge(int _daysRented) {
  double result = 0;
  switch(getPriceCode()){ //取得影片出租價格
  case Movie.REGULAR: // 普通片
   result += 2;
   if(_daysRented>2)
    result += (_daysRented-2)*1.5;
   break;

  case Movie.NEW_RELEASE: // 新片
   result += _daysRented*3;
   break;

  case Movie.CHILDRENS: // 兒童片
   result += 1.5;
   if(_daysRented>3)
    result += (_daysRented-3)*1.5;
   break;
  }
  return result;
  }

  class Rental……
  /**
  * @param this
  * @return
  */
  public double getCharge() {
  return _movie.getCharge(_daysRented);
  }

  2、用同樣的步驟處理getFrequentRenterPoints(),重構后的代碼:

  class Movie ……
  /**
  * @param frequentRenterPoints
  * @param this
  * @return
  */
  public int getFrequentRenterPoints(int daysRented) {
  if((getPriceCode())==Movie.NEW_RELEASE daysRented>1)
  return 2;
  else
  return 1;
  }
  class Rental……
  /**
  * @param frequentRenterPoints
  * @param this
  * @return
  */
  public int getFrequentRenterPoints(int daysRented) {
  if((getPriceCode())==Movie.NEW_RELEASE daysRented>1)
  return 2;
  else
  return 1;
  }

  七、重構第六步:終于……我們來到繼承

  目的:對switch語句引入state模式。

  方法:

  很遺憾,不得不在這里提前結束eclipse的自動重構之旅。Eclipse幾乎不能做結構上的重構。也許Martin Fowler在書中呼喚的自動重構工具止于"工具輔助下的重構工作"這一理念。藝術是人類的專利,編程藝術的夢想將持續(xù)下去。

  感興趣的讀者可以查看手工重構的最后一步代碼。將重構進行到底!

  附錄:eclipse支持的重構方法(摘自eclipse中文幫助)

  名稱功能
  撤銷執(zhí)行上一次重構的"撤銷"。只要除了重構之外尚未執(zhí)行任何其它源更改,重構撤銷緩沖區(qū)就有效。
  重做執(zhí)行上一次撤銷重構的"重做"。只要除了重構之外尚未執(zhí)行任何其它源更改,重構撤銷/重做緩沖區(qū)就有效。
  重命名 啟動"重命名"重構對話框:重命名所選擇的元素,并更正對元素的所有引用(如果啟用了的話)(還在其它文件中)??捎糜冢悍椒?、字段、局部變量、方法參數、類型、編譯單元、包、源文件夾和項目,以及解析為這些元素類型中的其中一種的文本選擇部分。
  移動 啟動"移動"重構對話框:移動所選擇的元素,并更正對元素的所有引用(如果啟用了的話)(還在其它文件中)。適用于:一個實例方法(可以將它移至某個組件)、一個或多個靜態(tài)方法、靜態(tài)字段、類型、編譯單元、包、源文件夾和項目,以及解析為這些元素類型中的其中一種的文本選擇部分。
  更改方法特征符啟動"更改方法特征符"重構對話框。更改參數名稱、參數類型和參數順序,并更新對相應方法的所有引用。此外,可以除去或添加參數,并且可以更改方法返回類型和它的可視性??梢詫⒋酥貥嫅糜诜椒ɑ蚪馕鰹榉椒ǖ奈谋具x擇。
  將匿名類轉換為嵌套類啟動"將匿名類轉換為嵌套類"重構對話框。幫助您將匿名內部類轉換為成員類??梢詫⒋酥貥嫅糜谀涿麅炔款?。
  將嵌套類型轉換成頂層啟動"將嵌套類型轉換為頂層類型"重構對話框。為所選成員類型創(chuàng)建新的 Java 編譯單元,并根據需要更新所有引用。對于非靜態(tài)成員類型,將添加字段以允許訪問先前的外圍實例??梢詫⒋酥貥嫅糜诔蓡T類型或解析為成員類型的文本。
  下推啟動"下推"重構對話框。將一組方法和字段從一個類移至它的子類。可以將此重構應用于在同一個類型中聲明的一個或多個方法和字段或者字段或方法內的文本選擇。
  上拉啟動"上拉"重構型中聲明的一個或多個方法、字段和成員類型,也可以應用于字段、方法或成員類型內的文本選擇。向導。將字段或方法移至其聲明類的超類或者(對于方法)將方法聲明為超類中的抽象類??梢詫⒋酥貥嫅糜谠谕粋€類
  抽取接口啟動"抽取接口"重構對話框。使用一組方法創(chuàng)建新接口并使選擇的類實現該接口,并盡可能地將對該類的引用更改為對新接口的引用(可選)。可以將此重構應用于類型。
  盡可能使用超類型啟動"盡可能使用超類型"對話框。將某個類型的出現替換為它的其中一個超類型,在執(zhí)行此替換之前,需要標識所有有可能進行此替換的位置。此重構可用于類型。
  內聯(lián)啟動"內聯(lián)"重構對話框。內聯(lián)局部變量、方法或常量。此重構可用于方法、靜態(tài)終態(tài)字段和解析為方法、靜態(tài)終態(tài)字段或局部變量的文本選擇。
  抽取方法啟動"抽取方法"重構對話框。創(chuàng)建一個包含當前所選擇的語句或表達式的新方法,并將選擇替換為對新方法的引用??梢允褂镁庉嫴藛沃械臄U大選擇至以獲取有效的選擇范圍。此功能對于清理冗長、雜亂或過于復雜的方法是很有用的。
  抽取局部變量啟動"抽取變量"重構對話框。創(chuàng)建為當前所選擇的表達式指定的新變量,并將選擇替換為對新變量的引用。此重構可用于解析為局部變量的文本選擇??梢允褂镁庉嫴藛沃械臄U大選擇至以獲取有效的選擇范圍。
  抽取常量啟動"抽取常量"重構對話框。從所選表達式創(chuàng)建靜態(tài)終態(tài)字段并替換字段引用,并且可以選擇重寫同一表達式的其它出現位置。此重構可用于靜態(tài)終態(tài)字段和解析為靜態(tài)終態(tài)字段的文本選擇。
  將局部變量轉換為字段啟動"將局部變量轉換為字段"重構對話框。將局部變量轉換為字段。如果該變量是在創(chuàng)建時初始化的,則此操作將把初始化移至新字段的聲明或類的構造函數。此重構可用于解析為局部變量的文本選擇。
  封裝字段啟動"自封裝字段"重構對話框。將對字段的所有引用替換為 getting 和 setting 方法。它適用于所選擇的字段或解析為字段的文本選擇。

標簽:拉薩 馬鞍山 武威 亳州 紅河 岳陽 大興安嶺 鄭州

巨人網絡通訊聲明:本文標題《Eclipse中自動重構實現探索》,本文關鍵詞  Eclipse,中,自動,重構,實現,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Eclipse中自動重構實現探索》相關的同類信息!
  • 本頁收集關于Eclipse中自動重構實現探索的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    亚洲成av人影院| 国内精品久久99人妻无码| 亚洲欧美卡通动漫| 2023国产精华国产精品| 日韩vs国产vs欧美| 日本少妇xxxx| 欧美肥大bbwbbw高潮| 亚洲图片欧美视频| 欧美色图校园春色| 欧洲生活片亚洲生活在线观看| ...xxx性欧美| www.av亚洲| 91成人在线精品| 亚洲欧美偷拍三级| 97国产一区二区| 欧美系列一区二区| 亚洲香肠在线观看| 国产精品一区二区无码对白| 3atv在线一区二区三区| 丝袜美腿成人在线| 免费在线观看你懂的| 日韩精品中文字幕一区 | 久久久久久久久久电影| 久久精品国产精品亚洲精品| 91中文字幕永久在线| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 日韩一区二区三区在线| 日本最新不卡在线| 极品人妻一区二区三区| 国产亚洲综合色| 成人深夜福利app| 色婷婷综合久色| 夜夜嗨av一区二区三区四季av| 免费啪视频在线观看| 91精品国产综合久久久久久| 麻豆精品精品国产自在97香蕉| 国产成人免费观看网站| 国产精品天干天干在观线| gogo大胆日本视频一区| 欧美三级午夜理伦三级中视频| 香港成人在线视频| 一区二区黄色片| 国产精品日产欧美久久久久| 99久久久国产精品免费蜜臀| 欧美日韩精品欧美日韩精品一| 免费一级片91| 日韩欧美黄色网址| 国产精品传媒在线| 亚洲精品第二页| 久久青草欧美一区二区三区| 99久久久久久99| 日韩欧美一级在线播放| 国产传媒日韩欧美成人| 欧美在线|欧美| 免费成人av在线| tube国产麻豆| 丝袜美腿亚洲色图| 大地资源高清在线视频观看| 亚洲午夜在线视频| 成人黄色免费网址| 亚洲精品第1页| 国产aⅴ激情无码久久久无码| 国产精品家庭影院| 美女搡bbb又爽又猛又黄www| 久久先锋影音av鲁色资源网| 99国产精品视频免费观看| 日韩三级在线观看| 成人av综合一区| 欧美成人福利视频| 91视频.com| 久久五月婷婷丁香社区| 先锋资源在线视频| 久久无码av三级| 人妻av一区二区三区| 久久亚洲精精品中文字幕早川悠里| 四川一级毛毛片| 国产人妖乱国产精品人妖| 91超薄肉色丝袜交足高跟凉鞋| 国产午夜三级一区二区三| 久久久无码人妻精品无码| 国产亚洲欧洲一区高清在线观看| 黄色性视频网站| 中文在线一区二区| 一二三不卡视频| 亚洲免费在线观看视频| 欧美午夜激情影院| 日韩国产在线一| 欧美丝袜丝nylons| 国产成人av在线影院| 欧美一级片免费看| 91日韩在线专区| 国产女人水真多18毛片18精品视频| 欧美熟妇精品一区二区蜜桃视频| 国产精品卡一卡二| 国产一区二区三区四区五区六区| 亚洲大尺度视频在线观看| 亚洲成人生活片| 国产一区二区按摩在线观看| 欧美一区中文字幕| 性高潮久久久久久| 1024国产精品| 在线观看黄网址| 激情综合色综合久久| 欧美一级二级三级蜜桃| 女教师高潮黄又色视频| 最新国产精品久久精品| 99成人在线观看| 精油按摩中文字幕久久| 日韩欧美国产午夜精品| youjizz.com日本| 亚洲综合精品自拍| 一本到不卡免费一区二区| 国产成人午夜99999| 久久午夜电影网| 微拍福利一区二区| 麻豆精品国产传媒mv男同| 91精品国产综合久久福利软件| 日本中文字幕精品| 亚洲免费观看在线观看| 日韩在线观看视频一区二区| 国产成人午夜精品影院观看视频| 久久久久久久久久久99999| 级毛片内射视频| 久久97超碰国产精品超碰| 欧美r级在线观看| a级大片在线观看| 美女任你摸久久| 精品成人在线观看| 无码少妇精品一区二区免费动态| 麻豆国产欧美日韩综合精品二区 | 久久蜜桃av一区精品变态类天堂 | 亚洲国产成人精品视频| 欧美性受xxxx| wwwww在线观看| 亚洲自拍偷拍网站| 欧美日韩不卡一区二区| 欧美熟妇精品一区二区| 五月天国产精品| 日韩一区二区三区视频在线观看| 国产精品1000部啪视频| 老色鬼精品视频在线观看播放| 久久伊99综合婷婷久久伊| 亚洲色图 激情小说| 国产精品一区二区三区乱码| 国产精品国产精品国产专区不蜜| 色综合亚洲欧洲| 四虎国产精品免费| 日韩va欧美va亚洲va久久| 精品日韩一区二区三区| 夜夜春很很躁夜夜躁| 国产成人av在线影院| 亚洲色图制服诱惑| 精品视频免费在线| 91精品小视频| 精品无码三级在线观看视频| 国产精品丝袜黑色高跟| 色av一区二区| 少妇一级淫片免费放播放| 久久疯狂做爰流白浆xx| 亚洲国产精品传媒在线观看| 色吧成人激情小说| 屁屁影院国产第一页| 久草精品在线观看| 亚洲私人影院在线观看| 欧美精品久久99久久在免费线 | 91精品国产乱| 亚洲综合欧美综合| 白白色 亚洲乱淫| 亚洲超碰精品一区二区| 久久嫩草精品久久久精品| 男人的天堂久久久| 四虎永久免费观看| 韩日欧美一区二区三区| 综合久久久久久| 91精品国产欧美日韩| 国产18无套直看片| 91论坛在线播放| 精品一区二区三区在线观看| 综合久久久久久| 日韩欧美123| 人妻久久一区二区| xfplay5566色资源网站| 国产另类ts人妖一区二区| 亚洲综合在线电影| 久久亚洲精品国产精品紫薇| 91久久久免费一区二区| 丰满少妇一区二区| aaa亚洲精品一二三区| 男人的天堂亚洲一区| 中文字幕日韩一区| 日韩你懂的在线播放| 色综合视频一区二区三区高清| 亚洲一区二区三区四区五区六区| 国产成人夜色高潮福利影视| 日韩中文字幕1| 一区视频在线播放| 精品欧美一区二区久久| 在线一区二区视频| 亚洲欧美日韩第一页| 国产原创剧情av|