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

25種代碼壞味道總結+優化示例

開發 后端
什么樣的代碼是好代碼呢?好的代碼應該命名規范、可讀性強、擴展性強、健壯性......而不好的代碼又有哪些典型特征呢?這25種代碼壞味道大家要注意啦。

 前言

什么樣的代碼是好代碼呢?好的代碼應該命名規范、可讀性強、擴展性強、健壯性......而不好的代碼又有哪些典型特征呢?這25種代碼壞味道大家要注意啦

1. Duplicated Code (重復代碼)

重復代碼就是不同地點,有著相同的程序結構。一般是因為需求迭代比較快,開發小伙伴擔心影響已有功能,就復制粘貼造成的。重復代碼很難維護的,如果你要修改其中一段的代碼邏輯,就需要修改多次,很可能出現遺漏的情況。

如何優化重復代碼呢?分三種情況討論:

同一個類的兩個函數含有相同的表達式 

  1. class A {  
  2.     public void method1() {  
  3.         doSomething1  
  4.         doSomething2  
  5.         doSomething3  
  6.     }  
  7.     public void method2() {  
  8.         doSomething1  
  9.         doSomething2  
  10.         doSomething4  
  11.     }  

優化手段:可以使用Extract Method(提取公共函數) 抽出重復的代碼邏輯,組成一個公用的方法。 

  1. class A {  
  2.     public void method1() {  
  3.         commonMethod();  
  4.         doSomething3  
  5.     }  
  6.     public void method2() {  
  7.         commonMethod();  
  8.         doSomething4  
  9.     }   
  10.     public void commonMethod(){  
  11.        doSomething1  
  12.        doSomething2  
  13.     }  

兩個互為兄弟的子類內含相同的表達式 

  1. class A extend C {  
  2.     public void method1() {  
  3.         doSomething1  
  4.         doSomething2  
  5.         doSomething3  
  6.     }  
  7.  
  8. class B extend C {  
  9.     public void method1() {  
  10.         doSomething1  
  11.         doSomething2  
  12.         doSomething4  
  13.     }  

優化手段:對兩個類都使用Extract Method(提取公共函數),然后把抽取出來的函數放到父類中。 

  1. class C {  
  2.     public void commonMethod(){  
  3.      doSomething1  
  4.      doSomething2  
  5.    }  
  6.  class A extend C {  
  7.     public void method1() {  
  8.         commonMethod();  
  9.         doSomething3  
  10.     }  
  11.  
  12. class B extend C {  
  13.     public void method1() {  
  14.         commonMethod();  
  15.         doSomething4  
  16.     }  

兩個毫不相關的類出現重復代碼

如果是兩個毫不相關的類出現重復代碼,可以使用Extract Class將重復代碼提煉到一個類中。這個新類可以是一個普通類,也可以是一個工具類,看具體業務怎么劃分吧。

2 .Long Method (長函數)

長函數是指一個函數方法幾百行甚至上千行,可讀性大大降低,不便于理解。反例如下: 

  1. public class Test {  
  2.     private String name;  
  3.     private Vector<Order> orders = new Vector<Order>();  
  4.     public void printOwing() {  
  5.         //print banner  
  6.         System.out.println("****************");  
  7.         System.out.println("*****customer Owes *****");  
  8.         System.out.println("****************");  
  9.         //calculate totalAmount  
  10.         Enumeration env = orders.elements();  
  11.         double totalAmount = 0.0;  
  12.         while (env.hasMoreElements()) {  
  13.             Order order = (Order) env.nextElement();  
  14.             totalAmount += order.getAmout();  
  15.         }  
  16.         //print details  
  17.         System.out.println("name:" + name);  
  18.         System.out.println("amount:" + totalAmount);  
  19.         ...... 
  20.     }  

可以使用Extract Method,抽取功能單一的代碼段,組成命名清晰的小函數,去解決長函數問題,正例如下: 

  1. public class Test {  
  2.     private String name;  
  3.     private Vector<Order> orders = new Vector<Order>();  
  4.     public void printOwing() {  
  5.         //print banner  
  6.         printBanner();  
  7.         //calculate totalAmount  
  8.         double totalAmount = getTotalAmount();  
  9.         //print details  
  10.         printDetail(totalAmount);  
  11.     }  
  12.     void printBanner(){  
  13.         System.out.println("****************");  
  14.         System.out.println("*****customer Owes *****");  
  15.         System.out.println("****************");  
  16.     }  
  17.     double getTotalAmount(){  
  18.         Enumeration env = orders.elements();  
  19.         double totalAmount = 0.0;  
  20.         while (env.hasMoreElements()) {  
  21.             Order order = (Order) env.nextElement();  
  22.             totalAmount += order.getAmout();  
  23.         }  
  24.         return totalAmount;  
  25.     }  
  26.     void printDetail(double totalAmount){  
  27.         System.out.println("name:" + name);  
  28.         System.out.println("amount:" + totalAmount);  
  29.     }   

3.  Large Class (過大的類)

一個類做太多事情,維護了太多功能,可讀性變差,性能也會下降。舉個例子,訂單相關的功能你放到一個類A里面,商品庫存相關的也放在類A里面,積分相關的還放在類A里面...反例如下: 

  1. Class A{  
  2.   public void printOrder(){  
  3.    System.out.println("訂單");  
  4.   }    
  5.   public void printGoods(){  
  6.    System.out.println("商品");  
  7.   }   
  8.   public void printPoints(){  
  9.    System.out.println("積分");  
  10.   }  

試想一下,亂七八糟的代碼塊都往一個類里面塞,還談啥可讀性。應該按單一職責,使用Extract Class把代碼劃分開,正例如下: 

  1. Class Order{  
  2.   public void printOrder(){  
  3.    System.out.println("訂單");  
  4.   }  
  5.  
  6. Class Goods{  
  7.    public void printGoods(){  
  8.    System.out.println("商品");  
  9.   }  
  10.   
  11. Class Points{     
  12.   public void printPoints(){  
  13.    System.out.println("積分");  
  14.   }  
  15.  }  

4. Long Parameter List (過長參數列)

方法參數數量過多的話,可讀性很差。如果有多個重載方法,參數很多的話,有時候你都不知道調哪個呢。并且,如果參數很多,做新老接口兼容處理也比較麻煩。 

  1. public void getUserInfo(String name,String age,String sex,String mobile){  
  2.   // do something ...  

如何解決過長參數列問題呢?將參數封裝成結構或者類,比如我們將參數封裝成一個DTO類,如下: 

  1. public void getUserInfo(UserInfoParamDTO userInfoParamDTO){  
  2.   // do something ...  
  3.  
  4. class UserInfoParamDTO{  
  5.   private String name;  
  6.   private String age;  
  7.   private String sex;  
  8.   private String mobile;  

5. Divergent Change (發散式變化)

對程序進行維護時, 如果添加修改組件, 要同時修改一個類中的多個方法, 那么這就是 Divergent Change。舉個汽車的例子,某個汽車廠商生產三種品牌的汽車:BMW、Benz和LaoSiLaiSi,每種品牌又可以選擇燃油、純電和混合動力。反例如下: 

  1. /**  
  2.  *  公眾號:撿田螺的小男孩  
  3.  */  
  4. public class Car {  
  5.     private String name;  
  6.     void start(Engine engine) {  
  7.         if ("HybridEngine".equals(engine.getName())) {  
  8.             System.out.println("Start Hybrid Engine..."); 
  9.          } else if ("GasolineEngine".equals(engine.getName())) {  
  10.             System.out.println("Start Gasoline Engine...");  
  11.         } else if ("ElectricEngine".equals(engine.getName())) {  
  12.             System.out.println("Start Electric Engine");  
  13.         }  
  14.     }  
  15.     void drive(Engine engine,Car car) {  
  16.         this.start(engine);  
  17.         System.out.println("Drive " + getBrand(car) + " car...");  
  18.     }  
  19.     String getBrand(Car car) {  
  20.         if ("Baoma".equals(car.getName())) {  
  21.             return "BMW";  
  22.         } else if ("BenChi".equals(car.getName())) {  
  23.             return "Benz";  
  24.         } else if ("LaoSiLaiSi".equals(car.getName())) {  
  25.             return "LaoSiLaiSi";  
  26.         }  
  27.         return null; 
  28.      }  
  29.  } 

如果新增一種品牌新能源電車,然后它的啟動引擎是核動力呢,那么就需要修改Car類的start和getBrand方法啦,這就是代碼壞味道:Divergent Change (發散式變化)。

如何優化呢?一句話總結:拆分類,將總是一起變化的東西放到一塊。

    ★        運用提煉類(Extract Class) 拆分類的行為。

               如果不同的類有相同的行為,提煉超類(Extract Superclass) 和 提煉子類(Extract Subclass)。    ”

正例如下:

因為Engine是獨立變化的,所以提取一個Engine接口,如果新加一個啟動引擎,多一個實現類即可。如下: 

  1. //IEngine  
  2. public interface IEngine {  
  3.     void start();  
  4.  
  5. public class HybridEngineImpl implements IEngine {   
  6.     @Override  
  7.     public void start() {  
  8.         System.out.println("Start Hybrid Engine...");  
  9.     }  

因為drive方法依賴于Car,IEngine,getBand方法;getBand方法是變化的,也跟Car是有關聯的,所以可以搞個抽象Car的類,每個品牌汽車繼承于它即可,如下 

  1. public abstract class AbstractCar {  
  2.     protected IEngine engine;  
  3.     public AbstractCar(IEngine engine) {  
  4.         this.engine = engine;  
  5.     }  
  6.     public abstract void drive();  
  7.  
  8. //奔馳汽車  
  9. public class BenzCar extends AbstractCar {  
  10.     public BenzCar(IEngine engine) { 
  11.          super(engine);  
  12.     }  
  13.     @Override  
  14.     public void drive() {  
  15.       this.engine.start();  
  16.       System.out.println("Drive " + getBrand() + " car..."); 
  17.     }  
  18.     private String getBrand() {  
  19.         return "Benz";  
  20.     }  
  21.  
  22. //寶馬汽車  
  23. public class BaoMaCar extends AbstractCar {  
  24.     public BaoMaCar(IEngine engine) {  
  25.         super(engine);  
  26.     }  
  27.     @Override  
  28.     public void drive() {  
  29.         this.engine.start();  
  30.         System.out.println("Drive " + getBrand() + " car...");  
  31.     }  
  32.     private String getBrand() {  
  33.         return "BMW";  
  34.     }  

細心的小伙伴,可以發現不同子類BaoMaCar和BenzCar的drive方法,還是有相同代碼,所以我們可以再擴展一個抽象子類,把drive方法推進去,如下: 

  1. public abstract class AbstractRefinedCar extends AbstractCar {  
  2.     public AbstractRefinedCar(IEngine engine) {  
  3.         super(engine);  
  4.     }  
  5.     @Override  
  6.     public void drive() {  
  7.         this.engine.start();  
  8.         System.out.println("Drive " + getBrand() + " car...");  
  9.     }  
  10.     abstract String getBrand();  
  11.  
  12. //寶馬  
  13. public class BaoMaRefinedCar extends AbstractRefinedCar {  
  14.     public BaoMaRefinedCar(IEngine engine) {  
  15.         super(engine);  
  16.     }  
  17.     @Override  
  18.     String getBrand() {  
  19.         return  "BMW";  
  20.     }  

如果再添加一個新品牌,搞個子類,繼承AbstractRefinedCar即可,如果新增一種啟動引擎,也是搞個類實現IEngine接口即可

6. Shotgun Surgery(散彈式修改)

當你實現某個小功能時,你需要在很多不同的類做出小修改。這就是Shotgun Surgery(散彈式修改)。它跟發散式變化(Divergent Change) 的區別就是,它指的是同時對多個類進行單一的修改,發散式變化指在一個類中修改多處。反例如下: 

  1. public class DbAUtils {  
  2.     @Value("${db.mysql.url}")  
  3.     private String mysqlDbUrl;  
  4.     ...  
  5.  
  6. public class DbBUtils {  
  7.     @Value("${db.mysql.url}")  
  8.     private String mysqlDbUrl;  
  9.     ...  

多個類使用了db.mysql.url這個變量,如果將來需要切換mysql到別的數據庫,如Oracle,那就需要修改多個類的這個變量!

如何優化呢?將各個修改點,集中到一起,抽象成一個新類。

    ★    可以使用 Move Method (搬移函數)和 Move Field (搬移字段)把所有需要修改的代碼放進同一個類,如果沒有合適的類,就去new一個。”

正例如下: 

  1. public class DbUtils {  
  2.     @Value("${db.mysql.url}")  
  3.     private String mysqlDbUrl;  
  4.     ...  

7. Feature Envy (依戀情節)

某個函數為了計算某個值,從另一個對象那里調用幾乎半打的取值函數。通俗點講,就是一個函數使用了大量其他類的成員,有人稱之為紅杏出墻的函數。反例如下: 

  1. public class User{  
  2.  private Phone phone;  
  3.   public User(Phone phone){  
  4.         this.phone = phone;  
  5.     }  
  6.     public void getFullPhoneNumber(Phone phone){  
  7.         System.out.println("areaCode:" + phone.getAreaCode());  
  8.         System.out.println("prefix:" + phone.getPrefix());  
  9.         System.out.println("number:" + phone.getNumber());  
  10.     }  

如何解決呢?在這種情況下,你可以考慮將這個方法移動到它使用的那個類中。例如,要將 getFullPhoneNumber()從 User 類移動到Phone類中,因為它調用了Phone類的很多方法。

8. Data Clumps(數據泥團)

數據項就像小孩子,喜歡成群結隊地呆在一塊。如果一些數據項總是一起出現的,并且一起出現更有意義的,就可以考慮,按數據的業務含義來封裝成數據對象。反例如下: 

  1. public class User {  
  2.     private String firstName;  
  3.     private String lastName;  
  4.     private String province;  
  5.     private String city;  
  6.     private String area;  
  7.     private String street;  

正例: 

  1. public class User {  
  2.     private UserName username;  
  3.     private Adress adress;  
  4.  
  5. class UserName{  
  6.     private String firstName;  
  7.     private String lastName;  
  8.  
  9. class Address{  
  10.     private String province;  
  11.     private String city;  
  12.     private String area;  
  13.     private String street;  

9. Primitive Obsession (基本類型偏執)

多數編程環境都有兩種數據類型,結構類型和基本類型。這里的基本類型,如果指Java語言的話,不僅僅包括那八大基本類型哈,也包括String等。如果是經常一起出現的基本類型,可以考慮把它們封裝成對象。我個人覺得它有點像Data Clumps(數據泥團) 舉個反例如下: 

  1. // 訂單  
  2. public class Order {  
  3.     private String customName;  
  4.     private String address;  
  5.     private Integer orderId;  
  6.     private Integer price;  

正例: 

  1. // 訂單類  
  2. public class Order {  
  3.     private Custom custom;  
  4.     private Integer orderId;  
  5.     private Integer price;  
  6.  
  7. // 把custom相關字段封裝起來,在Order中引用Custom對象  
  8. public class Custom {  
  9.     private String name;  
  10.     private String address;  

當然,這里不是所有的基本類型,都建議封裝成對象,有關聯或者一起出現的,才這么建議哈。

10. Switch Statements (Switch 語句)

這里的Switch語句,不僅包括Switch相關的語句,也包括多層if...else的語句哈。很多時候,switch語句的問題就在于重復,如果你為它添加一個新的case語句,就必須找到所有的switch語句并且修改它們。

示例代碼如下:   

  1. String medalType = "guest" 
  2.     if ("guest".equals(medalType)) {  
  3.         System.out.println("嘉賓勛章");  
  4.      } else if ("vip".equals(medalType)) {  
  5.         System.out.println("會員勛章");  
  6.     } else if ("guard".equals(medalType)) {  
  7.         System.out.println("守護勛章");  
  8.     }  
  9.     ... 

這種場景可以考慮使用多態優化: 

  1. //勛章接口  
  2. public interface IMedalService {  
  3.     void showMedal();  
  4.  
  5. //守護勛章策略實現類  
  6. public class GuardMedalServiceImpl implements IMedalService {  
  7.     @Override  
  8.     public void showMedal() {  
  9.         System.out.println("展示守護勛章");  
  10.     }  
  11.  
  12. //嘉賓勛章策略實現類  
  13. public class GuestMedalServiceImpl implements IMedalService {  
  14.     @Override  
  15.     public void showMedal() {  
  16.         System.out.println("嘉賓勛章");  
  17.     }  
  18.  
  19. //勛章服務工廠類  
  20. public class MedalServicesFactory {  
  21.     private static final Map<String, IMedalService> map = new HashMap<>();  
  22.     static {  
  23.         map.put("guard", new GuardMedalServiceImpl());  
  24.         map.put("vip", new VipMedalServiceImpl());  
  25.         map.put("guest", new GuestMedalServiceImpl());  
  26.     }  
  27.     public static IMedalService getMedalService(String medalType) {  
  28.         return map.get(medalType);  
  29.     }  

當然,多態只是優化的一個方案,一個方向。如果只是單一函數有些簡單選擇示例,并不建議動不動就使用動態,因為顯得有點殺雞使用牛刀了。

11.Parallel Inheritance Hierarchies( 平行繼承體系)

平行繼承體系 其實算是Shotgun Surgery的特殊情況啦。當你為A類的一個子類Ax,也必須為另一個類B相應的增加一個子類Bx。

解決方法:遇到這種情況,就要消除兩個繼承體系之間的引用,有一個類是可以去掉繼承關系的。

12. Lazy Class (冗贅類)

把這些不再重要的類里面的邏輯,合并到相關類,刪掉舊的。一個比較常見的場景就是,假設系統已經有日期工具類DateUtils,有些小伙伴在開發中,需要用到日期轉化等,不管三七二十一,又自己實現一個新的日期工具類。

13. Speculative Generality(夸夸其談未來性)

盡量避免過度設計的代碼。例如:

只有一個if else,那就不需要班門弄斧使用多態;

如果某個抽象類沒有什么太大的作用,就運用Collapse Hierarchy(折疊繼承體系)

如果函數的某些參數沒用上,就移除。

14. Temporary Field(令人迷惑的臨時字段)

某個實例變量僅為某種特定情況而定而設,這樣的代碼就讓人不易理解,我們稱之為 Temporary Field(令人迷惑的臨時字段)。反例如下: 

  1. public class PhoneAccount {  
  2.     private double excessMinutesCharge;  
  3.     private static final double RATE = 8.0;  
  4.     public double computeBill(int minutesUsed, int includedMinutes) {  
  5.         excessMinutesCharge = 0.0;  
  6.         int excessMinutes = minutesUsed - includedMinutes;  
  7.         if (excessMinutes >= 1) {  
  8.             excessMinutesexcessMinutesCharge = excessMinutes * RATE;  
  9.         }  
  10.         return excessMinutesCharge;  
  11.     }  
  12.     public double chargeForExcessMinutes(int minutesUsed, int includedMinutes) {  
  13.         computeBill(minutesUsed, includedMinutes);  
  14.         return excessMinutesCharge;  
  15.     }  

思考一下,臨時字段excessMinutesCharge是否多余呢?

15. Message Chains (過度耦合的消息鏈)

當你看到用戶向一個對象請求另一個對象,然后再向后者請求另一個對象,然后再請求另一個對象...這就是消息鏈。實際代碼中,你看到的可能是一長串getThis()或一長串臨時變量。反例如下:

  1. A.getB().getC().getD().getTianLuoBoy().getData(); 

A想要獲取需要的數據時,必須要知道B,又必須知道C,又必須知道D...其實A需要知道得太多啦,回頭想下封裝性,嘻嘻。其實可以通過拆函數或者移動函數解決,比如由B作為代理,搞個函數直接返回A需要數據。

16. Middle Man (中間人)

對象的基本特征之一就是封裝,即對外部世界隱藏其內部細節。封裝往往伴隨委托,過度運用委托就不好:某個類接口有一半的函數都委托給其他類。可以使用Remove Middle Man優化。反例如下: 

  1. A.B.getC(){  
  2.    return C.getC();  

其實,A可以直接通過C去獲取C,而不需要通過B去獲取。

17. Inappropriate Intimacy(狎昵關系)

如果兩個類過于親密,過分狎昵,你中有我,我中有你,兩個類彼此使用對方的私有的東西,就是一種壞代碼味道。我們稱之為Inappropriate Intimacy(狎昵關系)

建議盡量把有關聯的方法或屬性抽離出來,放到公共類,以減少關聯。

18. Alternative Classes with Different Interfaces (異曲同工的類)

A類的接口a,和B類的接口b,做的的是相同一件事,或者類似的事情。我們就把A和B叫做異曲同工的類。

可以通過重命名,移動函數,或抽象子類等方式優化

19. Incomplete Library Class (不完美的類庫)

大多數對象只要夠用就好,如果類庫構造得不夠好,我們不可能修改其中的類使它完成我們希望完成的工作。可以醬紫:包一層函數或包成新的類。

20. Data Class (純數據類)

什么是Data Class? 它們擁有一些字段,以及用于訪問(讀寫)這些字段的函數。這些類很簡單,僅有公共成員變量,或簡單操作的函數。

如何優化呢?將相關操作封裝進去,減少public成員變量。比如:

如果擁有public字段-> Encapsulate Field

如果這些類內含容器類的字段,應該檢查它們是不是得到了恰當地封裝-> Encapsulate Collection封裝起來

對于不該被其他類修改的字段-> Remove Setting Method->找出取值/設置函數被其他類運用的地點-> Move Method 把這些調用行為搬移到Data Class來。如果無法搬移整個函數,就運用Extract Method產生一個可被搬移的函數->Hide Method把這些取值/設置函數隱藏起來。

21. Refused Bequest (被拒絕的饋贈)

子類應該繼承父類的數據和函數。子類繼承得到所有函數和數據,卻只使用了幾個,那就是繼承體系設計錯誤,需要優化。

    需要為這個子類新建一個兄弟類->Push Down Method和Push Down Field把所有用不到的函數下推給兄弟類,這樣一來,超類就只持有所有子類共享的東西。所有超類都應該是抽象的。

    如果子類復用了超類的實現,又不愿意支持超類的接口,可以不以為然。但是不能胡亂修改繼承體系->Replace Inheritance with Delegation(用委派替換繼承).

22. Comments (過多的注釋)

這個點不是說代碼不建議寫注釋哦,而是,建議大家避免用注釋解釋代碼,避免過多的注釋。這些都是常見注釋的壞味道:

多余的解釋

日志式注釋

用注釋解釋變量等

 ...

如何優化呢?

方法函數、變量的命名要規范、淺顯易懂、避免用注釋解釋代碼。

關鍵、復雜的業務,使用清晰、簡明的注釋

23. 神奇命名

方法函數、變量、類名、模塊等,都需要簡單明了,淺顯易懂。避免靠自己主觀意識瞎起名字。

反例: 

  1. boolean test = chenkParamResult(req); 

正例: 

  1. boolean isParamPass = chenkParamResult(req); 

24. 神奇魔法數

日常開發中,經常會遇到這種代碼: 

  1. if(userType==1){  
  2.    //doSth1  
  3. }else If( userType ==2){  
  4.    //doSth2  
  5.  
  6. ... 

代碼中的這個1和2都表示什么意思呢?再比如setStatus(1)中的1又表示什么意思呢?看到類似壞代碼,可以這兩種方式優化:

新建個常量類,把一些常量放進去,統一管理,并且寫好注釋;

建一個枚舉類,把相關的魔法數字放到一起管理。

25. 混亂的代碼層次調用

我們代碼一般會分dao層、service層和controller層。

dao層主要做數據持久層的工作,與數據庫打交道。

service層主要負責業務邏輯處理。

controller層負責具體的業務模塊流程的控制。

所以一般就是controller調用service,service調dao。如果你在代碼看到controller直接調用dao,那可以考慮是否優化啦。反例如下: 

  1. @RestController("user")  
  2. public class UserController {  
  3.     Autowired  
  4.     private UserDao userDao;  
  5.     @RequestMapping("/queryUserInfo")  
  6.     public String queryUserInfo(String userName) {  
  7.         return userDao.selectByUserName(userName);  
  8.     }  
  9.  

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2019-10-11 09:07:46

Java代碼對象

2020-06-12 08:21:58

JavaScript代碼開發

2015-07-29 13:22:40

.NET代碼

2012-07-13 09:35:58

PHP

2012-07-13 09:38:15

項目代碼

2012-07-19 10:42:17

項目

2022-01-26 10:29:24

微服務循環依賴代碼

2018-08-24 21:25:02

編程語言代碼重構GitHub

2022-05-07 10:01:20

好代碼壞代碼

2010-04-12 17:47:01

Oracle多表查詢

2020-12-01 08:36:10

代碼程序員函數

2015-09-15 08:30:23

Android代碼優化

2009-11-16 10:57:51

PHP上傳文件代碼

2019-09-29 16:17:25

Java代碼性能編程語言

2021-02-16 16:43:21

工具性能調優

2009-09-08 17:20:01

C#排序算法

2015-11-05 09:02:05

Java代碼性能優化

2010-04-26 16:30:00

DNS負載均衡

2020-04-26 10:01:14

編程學習技術

2021-11-04 08:53:00

if-else代碼Java
點贊
收藏

51CTO技術棧公眾號

91精品国产91久久久久久黑人| 99久热在线精品996热是什么| jizz亚洲女人高潮大叫| 99久久国产综合色|国产精品| 97人人做人人爱| 亚洲熟妇无码av| 亚洲伦理久久| 天天色天天操综合| 日韩亚洲视频| 中文字幕777| 一区在线观看| 中文字幕亚洲一区| 色天使在线观看| 国产福利在线免费观看| 国产亚洲欧美日韩俺去了| 91精品视频在线看| 97人妻一区二区精品视频| 欧美高清一区| 一夜七次郎国产精品亚洲| 国产艳妇疯狂做爰视频| 成年女人在线看片| 亚洲丝袜制服诱惑| 国产久一道中文一区| 中文无码av一区二区三区| 亚洲美洲欧洲综合国产一区| 亚洲天堂av在线免费观看| 日韩va在线观看| 香蕉成人影院| 欧美天天综合色影久久精品| 台湾无码一区二区| 都市激情在线视频| 国产一区二区h| 性欧美xxxx交| 久久精品久久国产| 久久电影院7| 亚洲性猛交xxxxwww| 欧美丰满少妇人妻精品| 亚洲精品福利| 日韩欧美国产一区二区在线播放 | 天天干天天草天天| 中文字幕一区久| 欧美日韩美女视频| 成人性生活视频免费看| 欧美高清另类hdvideosexjaⅴ| 亚洲欧美在线视频| 一区二区三区在线观看www| 欧美午夜黄色| 久久综合999| 久久久人人爽| 四虎影视在线观看2413| 成人av手机在线观看| 国产女人水真多18毛片18精品 | 国产福利亚洲| 欧美性猛交xxxx黑人| 欧美成人xxxxx| 91精品国产91久久久久久青草| 国产精品电影一区二区| 欧美在线视频二区| 狠狠v欧美ⅴ日韩v亚洲v大胸 | 国产伦理一区二区三区| 亚洲精品字幕在线观看| 久久成人18免费观看| 国产成人jvid在线播放| 这里只有精品免费视频| 视频一区在线播放| 国产精品国产自产拍高清av水多| 中文字字幕在线中文乱码| 久久福利视频一区二区| 国产中文字幕91| 中文字幕人妻一区二区三区视频| 日韩av一级片| 91在线无精精品一区二区| 国内精品久久久久久久久久久 | 最新成人av在线| 老司机午夜免费福利视频| 狂野欧美性猛交xxxxx视频| 亚洲免费观看高清完整版在线观看| 伊人色综合影院| 亚洲小说区图片区都市| 亚洲国产wwwccc36天堂| av日韩一区二区三区| 美女av在线免费看| 午夜视频在线观看一区二区| 无码精品a∨在线观看中文| 91国拍精品国产粉嫩亚洲一区| 欧美日韩一卡二卡三卡| 日本美女视频网站| 国产永久精品大片wwwapp| 久久综合久久八八| 日韩精品1区2区| 精品综合免费视频观看| 亚洲伊人久久大香线蕉av| 天堂а√在线8种子蜜桃视频| 国产精品久久久久久久久免费樱桃| 精品一区二区三区毛片| 午夜在线小视频| 亚洲免费视频成人| 欧美精品一区二区三区免费播放| 国产va免费精品观看精品| 日韩国产在线看| 中文字幕第69页| 亚洲国产婷婷| 国产日本欧美一区二区三区| 五月激情婷婷网| 成人欧美一区二区三区在线播放| 日韩欧美视频网站| av有声小说一区二区三区| 日韩精品一区二区三区蜜臀| 少妇大叫太粗太大爽一区二区| 成人在线免费观看91| 久久久免费高清电视剧观看| 亚洲专区第一页| 成人激情小说乱人伦| 亚洲精品中文字幕乱码三区不卡| 国产v日韩v欧美v| 69堂精品视频| 亚洲一级黄色录像| 亚洲一区二区成人| 成人免费视频a| 成人av一区| 日韩欧美成人网| 少妇伦子伦精品无吗| 国产日韩欧美一区二区三区| 亚洲91精品在线观看| 亚洲中文字幕在线观看| 中文字幕av免费专区久久| 少妇高潮喷水久久久久久久久久| 一区中文字幕| 久99久在线视频| 国产精品国产av| 国产精品无遮挡| av无码精品一区二区三区| 青青草原在线亚洲| 欧美日本高清视频| 国产成人精品无码高潮| 亚洲人xxxx| 日韩欧美理论片| 亚洲天堂手机版| 天堂在线中文资源| 一区av在线播放| 91 视频免费观看| 久久中文字幕av| 国产91网红主播在线观看| 天天操天天干天天爽| 亚洲天堂成人在线观看| 亚洲无在线观看| 亚洲精品91| 99国产在线视频| 国产原创精品视频| 欧美一二区视频| 九九热国产精品视频| 国产精品小仙女| 69sex久久精品国产麻豆| 粉嫩av一区二区| 91国产精品91| 久久视频www| 欧美视频一区二区三区四区| 99精品中文字幕| 捆绑变态av一区二区三区| 做爰高潮hd色即是空| 欧美大片网站| 欧美成在线视频| 亚洲黄色片视频| 激情亚洲一区二区三区四区| 天天操精品视频| 欧美日韩一区二区三区四区在线观看| 成人高清在线观看| 成人片免费看| 社区色欧美激情 | 无码人妻久久一区二区三区 | 天天躁日日躁aaaa视频| 日本欧美久久久久免费播放网| 亚洲精品乱码视频| 亚洲一区二区三区四区电影| 久久99热精品这里久久精品| 国产熟女一区二区丰满| 亚洲男人的天堂av| 欧美做受喷浆在线观看| 日韩精品一二三区| 色婷婷国产精品| 日本激情综合网| 久久久久蜜桃| 国产在线播放一区二区| 刘亦菲一区二区三区免费看| 日韩在线www| 国产普通话bbwbbwbbw| 午夜一区二区三区视频| 91香蕉国产视频| 高清视频一区二区| 免费一级特黄毛片| 日韩大片在线观看| 国产精品一区二区欧美黑人喷潮水| 亚洲欧洲美洲av| 日韩一级黄色av| 天堂av电影在线观看| 欧美性色aⅴ视频一区日韩精品| 免费高清在线观看电视| 91婷婷韩国欧美一区二区| 亚洲欧美日本一区二区三区| 亚洲美女网站| 51xx午夜影福利| 高清一区二区三区av| 欧美激情精品久久久久久蜜臀| porn视频在线观看| 欧美精品一区二区精品网| 乱子伦一区二区三区| 中文字幕一区二区在线播放| 性欧美丰满熟妇xxxx性仙踪林| 激情另类小说区图片区视频区| 国产视频一视频二| 97精品视频| 国产精品日韩一区二区| 亚洲成a人片777777久久| 日本精品久久中文字幕佐佐木| 另类视频在线| 欧美成人激情视频| 免费av不卡| 国产一区二区三区视频| 亚洲一级在线播放| 91国内精品野花午夜精品| 亚洲免费激情视频| 亚洲午夜成aⅴ人片| 久久久久无码精品国产sm果冻 | 国内不卡一区二区三区| 国产精品白丝久久av网站| 日本久久久久久| 色综合桃花网| 色综合天天综合网国产成人网| 暖暖日本在线观看| 亚洲人成在线观看网站高清| 欧美视频一二区| 日韩亚洲欧美在线| www.久久视频| 欧美午夜激情视频| www.日本精品| 欧美视频一二三| 黑人一级大毛片| 亚洲777理论| 五月婷婷激情网| 精品久久久久久国产91| 特一级黄色大片| 狠狠干狠狠久久| 黄色一级片在线| ...中文天堂在线一区| 黄色精品视频在线观看| 亚洲欧美色图小说| 欧美性猛交xxxx乱大交少妇| 成人欧美一区二区三区| 外国一级黄色片| 亚洲色图一区二区三区| 网爆门在线观看| 亚洲色图丝袜美腿| 国产亚洲精品码| 亚洲欧美日韩成人高清在线一区| 国产性xxxx| 五月天一区二区| 日韩一级在线视频| 欧美日韩精品免费| 999久久久久久| 欧美mv日韩mv国产网站| 午夜一区在线观看| 国产小视频国产精品| 在线免费观看黄| 久久久精品一区二区| 欧美激情黑人| 欧美多人乱p欧美4p久久| 在线免费av导航| 午夜精品福利在线观看| 牛牛精品一区二区| 日韩av毛片网| 青青草国产一区二区三区| 51国偷自产一区二区三区| 精品国产一级| 美女被啪啪一区二区| 日韩欧美视频在线播放| 特级西西人体www高清大胆| 一本色道久久综合| 99热这里只有精品在线播放| 久久久亚洲人| 午夜激情视频网| 2019国产精品| 久久国产高清视频| 偷偷要91色婷婷| 91福利在线观看视频| 亚洲成年人影院在线| 成人性爱视频在线观看| 欧美裸体男粗大视频在线观看| 极品av在线| 成人黄色免费片| 一本色道69色精品综合久久| 欧美日韩在线观看一区| 国产探花在线精品一区二区| 青青青青在线视频| 国产亚洲午夜| 小日子的在线观看免费第8集| 久久影院午夜片一区| 大胸美女被爆操| 午夜精品久久久久久| 亚洲图片欧美在线| 精品五月天久久| 3p视频在线观看| 欧美一级黑人aaaaaaa做受| 国产一区二区久久久久| 日本视频一区二区不卡| 黄色日韩在线| 午夜视频在线网站| 国产色产综合色产在线视频| 国产精品白嫩白嫩大学美女| 色婷婷精品大在线视频| 黄色片一区二区三区| 视频一区视频二区国产精品| 精品丝袜在线| 国产精品yjizz| 精品一区av| 日韩欧美精品在线观看视频| 成人性生交大片免费看中文| 情侣偷拍对白清晰饥渴难耐| 91成人免费网站| 欧美一区二不卡视频| 欧美精品免费在线观看| 天堂久久一区| 欧美日韩在线精品一区二区三区| 在线欧美视频| www.四虎精品| 一区二区久久久久| 国产精品伊人久久 | 手机看片福利视频| 亚洲777理论| 色偷偷在线观看| 精品中文字幕视频| 国产一区二区三区免费在线| 中文精品一区二区三区| 老司机精品视频导航| 正在播放国产对白害羞| 欧美日韩在线观看一区二区| 免费在线国产| 国产成人精品久久| 亚洲福利网站| 国产精品视频网站在线观看 | 欧美日韩亚洲另类| 欧洲综合视频| 日本一区二区三区四区视频| 欧美在线关看| 在线看无码的免费网站| 蜜桃久久久久久久| 少妇高潮在线观看| 欧美亚洲国产怡红院影院| 精品999视频| 国产精品久久久久久av下载红粉| 欧美极品在线观看| 日本在线视频www| 欧美激情一区在线观看| 亚洲视屏在线观看| 久久久91精品国产| 99精品国自产在线| 国产对白在线播放| 国产精品综合视频| 日韩和一区二区| 亚洲精品中文字幕女同| 一根才成人网| 亚洲国产欧美不卡在线观看| 日本视频免费一区| 精品熟妇无码av免费久久| 欧美日韩大陆在线| 成人在线影视| 国产精品亚洲美女av网站| 国产一区二区三区四区五区传媒 | 亚洲小视频在线观看| 亚洲欧洲二区| 日本福利视频一区| 国产无遮挡一区二区三区毛片日本| 中文字幕人妻一区二区在线视频| 欧美精品在线第一页| 日韩欧美国产大片| www.com黄色片| 亚洲精品中文在线观看| 肥臀熟女一区二区三区| 国产极品jizzhd欧美| 中文字幕免费一区二区三区| 中文视频在线观看| 欧美午夜激情视频| а√中文在线8| 蜜桃视频在线观看91| 精品影视av免费| 国产无码精品视频| 亚洲男人天堂久| 九七影院97影院理论片久久| 国产自产在线视频| 99久久精品国产麻豆演员表| 在线免费观看av片| 久久久视频在线| 国产精品久久久久久| 精品人妻一区二区三区日产| 欧美性猛xxx| 欧美家庭影院| 在线成人av电影| 久久免费精品国产久精品久久久久| 国产又粗又大又爽视频| 青青久久aⅴ北条麻妃| 欧美不卡在线|