Ecl " /> 成人毛片100部免费看,亚洲视频免费,亚洲日本va中文字幕久久

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

Eclipse中自動(dòng)重構(gòu)實(shí)現(xiàn)探索

  本文用eclipse的自動(dòng)重構(gòu)功能對(duì)一個(gè)程序?qū)嵗M(jìn)行重構(gòu),目的是探索Eclipse自動(dòng)重構(gòu)可以在多大程度上輔助重構(gòu)這個(gè)過(guò)程。程序?qū)嵗褂谩禦efactoring:Improving the Design of Existing Code》一書(shū)中的例子。

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

  重構(gòu)的過(guò)程是一個(gè)不斷嘗試和探索的過(guò)程。Eclipse的重構(gòu)支持撤銷(xiāo)和重做,并且能夠預(yù)覽重構(gòu)結(jié)果,這些是很實(shí)用的功能。

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

  一、預(yù)備工作

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

  Eclipse使用如下版本:


  同時(shí)安裝了中文語(yǔ)言包。

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

  目的:

  1、 把statement()函數(shù)中的swich語(yǔ)句提煉到獨(dú)立的函數(shù)amountFor()中。

  2、 修改amountFor()參數(shù)命名

  重構(gòu)方法:

  Extract Method
  Rename Method

  方法:

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


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

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

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

  選擇"預(yù)覽"按鈕預(yù)先查看重構(gòu)后的結(jié)果,符合我們最初的目的。


  選擇"確定"按鈕,重構(gòu)后的代碼片斷如下:

  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()的參數(shù)each,在右鍵菜單中選擇"重構(gòu)/重命名",在對(duì)話(huà)框中輸入新的名稱(chēng):aRental,選擇確定,amountFor()中所有each的引用全部被替換成新的名稱(chēng)。用同樣的辦法修改amountFor()中的局部變量thisAmount為result。重構(gòu)后的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;
  } 

  三、重構(gòu)第二步:搬移"金額計(jì)算"代碼

  目的:

  1、 將函數(shù)amountFor()轉(zhuǎn)移到Rental類(lèi)中,并更名為getCharge()。

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

  重構(gòu)方法:

  Move Method
  Change Method signatrue
  Inline Method
  Inline Temp

  方法:

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


  同時(shí)eclipse自動(dòng)在Customer的amountFor()函數(shù)中添加一行對(duì)新函數(shù)的"委托"代碼:

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

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

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

  2、繼續(xù)重構(gòu)!選中g(shù)etCharge()方法,在右鍵菜單中選擇"重構(gòu)/更改方法特征符",彈出參數(shù)選擇對(duì)話(huà)框,把訪(fǎng)問(wèn)修飾符從private改成public。Eclipse的編譯錯(cuò)誤提示自動(dòng)消失。


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


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

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

  4、除去臨時(shí)變量thisAmount。

  選中變量thisAmount,在右鍵菜單中選擇"重構(gòu)/內(nèi)聯(lián)",重構(gòu)預(yù)覽窗口如下,可見(jiàn)達(dá)到了重構(gòu)的目的。按下"確認(rèn)"按鈕重構(gòu)代碼。


  statement()代碼:

  public String statement() {
  double totalAmount = 0; // 總消費(fèi)金額
  int frequentRenterPoints = 0; // 常客積點(diǎn)
  Enumeration rentals = _rentals.elements();
  String result = "Rental Record for " + getName() + " ";

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

  // add frequent renter points(累加 常客積點(diǎn))
  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(顯示此筆租借數(shù)據(jù))
  result += " " + each.getMovie().getTitle() + " " +
  String.valueOf(each.getCharge()) + " ";
  totalAmount += each.getCharge();
  }

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

  return result;
  }
  
  四、重構(gòu)第三步:提煉"常客積點(diǎn)計(jì)算"代碼

  目的:提取"常客積點(diǎn)計(jì)算"代碼并放在Rental類(lèi)中,"常客積點(diǎn)計(jì)算"代碼如下。

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

  重構(gòu)后的代碼如下:

  frequentRenterPoints += each.getFrequentRenterPoints();

  重構(gòu)方法:

  Extract Method
  Move Method
  Change Method signatrue
  Inline Method

  方法:

  1、 首先,抽取代碼到獨(dú)立的函數(shù)中。

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

  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()移動(dòng)到Rental類(lèi)中。

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

  4、 對(duì)Customer的函數(shù)getFrequentRenterPoints()執(zhí)行內(nèi)聯(lián)操作,重構(gòu)目標(biāo)完成。

  五、重構(gòu)第四步:去除臨時(shí)變量(totalAmount和frequentRenterPoints)

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

  方法:

  1、 分析totalAmount和frequentRenterPoints的定義和引用結(jié)構(gòu)如下:

  // 聲明和定義
  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";
  ……

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

  2、手工修改代碼。

  六、重構(gòu)第五步:運(yùn)用多態(tài)取代與價(jià)格相關(guān)的條件邏輯

  目的:

  1、 把Rental類(lèi)中的函數(shù)getCharge()移動(dòng)到Movie類(lèi)中。

  2、 把Rental類(lèi)中的函數(shù)getFrequentRenterPoints()移動(dòng)到Movie類(lèi)中。

  重構(gòu)方法:

  Move Method
  Inline Method

  方法:

  1、 選中Rental類(lèi)中的函數(shù)getCharge(),右鍵菜單選中"重構(gòu)/移動(dòng)",eclipse提示找不到接收者,不能移動(dòng)。原因在于這行語(yǔ)句:

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

  選中g(shù)etMovie(),右鍵菜單選中"重構(gòu)/內(nèi)聯(lián)",確定后代碼成為:

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

  選中g(shù)etCharge(),執(zhí)行"重構(gòu)/移動(dòng)"后,函數(shù)被移動(dòng)到Movie類(lèi)中。然而這只是部分達(dá)成了重構(gòu)目的,我們發(fā)現(xiàn),移動(dòng)后的代碼把Rental作為參數(shù)傳給了getCharge(),手工修改一下,代碼變成:

  class Movie ……
  /**
  * @param this
  * @return
  */
  public double getCharge(int _daysRented) {
  double result = 0;
  switch(getPriceCode()){ //取得影片出租價(jià)格
  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(),重構(gòu)后的代碼:

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

  七、重構(gòu)第六步:終于……我們來(lái)到繼承

  目的:對(duì)switch語(yǔ)句引入state模式。

  方法:

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

  感興趣的讀者可以查看手工重構(gòu)的最后一步代碼。將重構(gòu)進(jìn)行到底!

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

  名稱(chēng)功能
  撤銷(xiāo)執(zhí)行上一次重構(gòu)的"撤銷(xiāo)"。只要除了重構(gòu)之外尚未執(zhí)行任何其它源更改,重構(gòu)撤銷(xiāo)緩沖區(qū)就有效。
  重做執(zhí)行上一次撤銷(xiāo)重構(gòu)的"重做"。只要除了重構(gòu)之外尚未執(zhí)行任何其它源更改,重構(gòu)撤銷(xiāo)/重做緩沖區(qū)就有效。
  重命名 啟動(dòng)"重命名"重構(gòu)對(duì)話(huà)框:重命名所選擇的元素,并更正對(duì)元素的所有引用(如果啟用了的話(huà))(還在其它文件中)。可用于:方法、字段、局部變量、方法參數(shù)、類(lèi)型、編譯單元、包、源文件夾和項(xiàng)目,以及解析為這些元素類(lèi)型中的其中一種的文本選擇部分。
  移動(dòng) 啟動(dòng)"移動(dòng)"重構(gòu)對(duì)話(huà)框:移動(dòng)所選擇的元素,并更正對(duì)元素的所有引用(如果啟用了的話(huà))(還在其它文件中)。適用于:一個(gè)實(shí)例方法(可以將它移至某個(gè)組件)、一個(gè)或多個(gè)靜態(tài)方法、靜態(tài)字段、類(lèi)型、編譯單元、包、源文件夾和項(xiàng)目,以及解析為這些元素類(lèi)型中的其中一種的文本選擇部分。
  更改方法特征符啟動(dòng)"更改方法特征符"重構(gòu)對(duì)話(huà)框。更改參數(shù)名稱(chēng)、參數(shù)類(lèi)型和參數(shù)順序,并更新對(duì)相應(yīng)方法的所有引用。此外,可以除去或添加參數(shù),并且可以更改方法返回類(lèi)型和它的可視性。可以將此重構(gòu)應(yīng)用于方法或解析為方法的文本選擇。
  將匿名類(lèi)轉(zhuǎn)換為嵌套類(lèi)啟動(dòng)"將匿名類(lèi)轉(zhuǎn)換為嵌套類(lèi)"重構(gòu)對(duì)話(huà)框。幫助您將匿名內(nèi)部類(lèi)轉(zhuǎn)換為成員類(lèi)。可以將此重構(gòu)應(yīng)用于匿名內(nèi)部類(lèi)。
  將嵌套類(lèi)型轉(zhuǎn)換成頂層啟動(dòng)"將嵌套類(lèi)型轉(zhuǎn)換為頂層類(lèi)型"重構(gòu)對(duì)話(huà)框。為所選成員類(lèi)型創(chuàng)建新的 Java 編譯單元,并根據(jù)需要更新所有引用。對(duì)于非靜態(tài)成員類(lèi)型,將添加字段以允許訪(fǎng)問(wèn)先前的外圍實(shí)例。可以將此重構(gòu)應(yīng)用于成員類(lèi)型或解析為成員類(lèi)型的文本。
  下推啟動(dòng)"下推"重構(gòu)對(duì)話(huà)框。將一組方法和字段從一個(gè)類(lèi)移至它的子類(lèi)。可以將此重構(gòu)應(yīng)用于在同一個(gè)類(lèi)型中聲明的一個(gè)或多個(gè)方法和字段或者字段或方法內(nèi)的文本選擇。
  上拉啟動(dòng)"上拉"重構(gòu)型中聲明的一個(gè)或多個(gè)方法、字段和成員類(lèi)型,也可以應(yīng)用于字段、方法或成員類(lèi)型內(nèi)的文本選擇。向?qū)А⒆侄位蚍椒ㄒ浦疗渎暶黝?lèi)的超類(lèi)或者(對(duì)于方法)將方法聲明為超類(lèi)中的抽象類(lèi)。可以將此重構(gòu)應(yīng)用于在同一個(gè)類(lèi)
  抽取接口啟動(dòng)"抽取接口"重構(gòu)對(duì)話(huà)框。使用一組方法創(chuàng)建新接口并使選擇的類(lèi)實(shí)現(xiàn)該接口,并盡可能地將對(duì)該類(lèi)的引用更改為對(duì)新接口的引用(可選)。可以將此重構(gòu)應(yīng)用于類(lèi)型。
  盡可能使用超類(lèi)型啟動(dòng)"盡可能使用超類(lèi)型"對(duì)話(huà)框。將某個(gè)類(lèi)型的出現(xiàn)替換為它的其中一個(gè)超類(lèi)型,在執(zhí)行此替換之前,需要標(biāo)識(shí)所有有可能進(jìn)行此替換的位置。此重構(gòu)可用于類(lèi)型。
  內(nèi)聯(lián)啟動(dòng)"內(nèi)聯(lián)"重構(gòu)對(duì)話(huà)框。內(nèi)聯(lián)局部變量、方法或常量。此重構(gòu)可用于方法、靜態(tài)終態(tài)字段和解析為方法、靜態(tài)終態(tài)字段或局部變量的文本選擇。
  抽取方法啟動(dòng)"抽取方法"重構(gòu)對(duì)話(huà)框。創(chuàng)建一個(gè)包含當(dāng)前所選擇的語(yǔ)句或表達(dá)式的新方法,并將選擇替換為對(duì)新方法的引用。可以使用編輯菜單中的擴(kuò)大選擇至以獲取有效的選擇范圍。此功能對(duì)于清理冗長(zhǎng)、雜亂或過(guò)于復(fù)雜的方法是很有用的。
  抽取局部變量啟動(dòng)"抽取變量"重構(gòu)對(duì)話(huà)框。創(chuàng)建為當(dāng)前所選擇的表達(dá)式指定的新變量,并將選擇替換為對(duì)新變量的引用。此重構(gòu)可用于解析為局部變量的文本選擇。可以使用編輯菜單中的擴(kuò)大選擇至以獲取有效的選擇范圍。
  抽取常量啟動(dòng)"抽取常量"重構(gòu)對(duì)話(huà)框。從所選表達(dá)式創(chuàng)建靜態(tài)終態(tài)字段并替換字段引用,并且可以選擇重寫(xiě)同一表達(dá)式的其它出現(xiàn)位置。此重構(gòu)可用于靜態(tài)終態(tài)字段和解析為靜態(tài)終態(tài)字段的文本選擇。
  將局部變量轉(zhuǎn)換為字段啟動(dòng)"將局部變量轉(zhuǎn)換為字段"重構(gòu)對(duì)話(huà)框。將局部變量轉(zhuǎn)換為字段。如果該變量是在創(chuàng)建時(shí)初始化的,則此操作將把初始化移至新字段的聲明或類(lèi)的構(gòu)造函數(shù)。此重構(gòu)可用于解析為局部變量的文本選擇。
  封裝字段啟動(dòng)"自封裝字段"重構(gòu)對(duì)話(huà)框。將對(duì)字段的所有引用替換為 getting 和 setting 方法。它適用于所選擇的字段或解析為字段的文本選擇。

jsp技術(shù)Eclipse中自動(dòng)重構(gòu)實(shí)現(xiàn)探索,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产AV国产精品国产三级在线L | 97午夜理论片影院在线播放 | 青青久久精品 | 亚洲精品无码午夜福利在线观看 | 久久精品视频3 | 国产一区二区在线观看免费 | 日韩大胆视频 | 欧美午夜精品久久久久久浪潮 | 国产偷国产偷亚洲高清人乐享 | 国产精品自在在线午夜精品 | 综合一区无套内射中文字幕 | 日本真人啪啪试看30秒 | 亚洲日本va中文字幕久久 | 一道精品视频一区二区三区 | 亚洲精品中文字幕一二三四区 | 国产精品嫩草影视在线观看 | 青柠高清在线观看完整版 | 免费一级特黄欧美大片久久网 | 久久精品国产亚洲AV久五月天 | 日本A级作爱片金瓶双艳 | 花蝴蝶在线观看免费中文版高清 | 最近最新中文字幕MV高清在线 | 天天操夜夜噜 | 男女做爽爽爽视频免费软件 | 国产人妻人伦精品熟女麻豆 | 欧美18videosex | 亚洲国产AV一区二区三区四区 | 在线视频 国产精品 中文字幕 | 草699一码二码三码四码 | 亚洲日韩成人 | 亚洲精品乱码久久久久久v 亚洲精品乱码电影在线观看 | 国产久久亚洲美女久久 | 新影音先锋男人色资源网 | 免费果冻传媒2021视频 | 天天日免费观看视频一1 | 亚洲乱码日产精品BD在线下载 | 火影小南被爆羞羞网站 | 无码乱人伦一区二区亚洲 | 内射少妇36P九色 | 超碰在线视频人人AV | 少妇邻居内射在线 |