溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java優(yōu)化函數(shù)的構成有哪些

發(fā)布時間:2022-01-10 11:01:19 來源:億速云 閱讀:142 作者:iii 欄目:編程語言

這篇文章主要介紹了Java優(yōu)化函數(shù)的構成有哪些的相關知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java優(yōu)化函數(shù)的構成有哪些文章都會有所收獲,下面我們一起來看看吧。

1. Extract Method (提煉函數(shù))

解釋:

如果發(fā)現(xiàn)一個函數(shù)的代碼很長, 很可能的一種情況是這個函數(shù)做了很多事情, 找找看函數(shù)中有沒有注釋, 往往注釋都是為了解釋下面一塊代碼做的什么事情, 可以考慮將這塊代碼提煉(Extract)成一個獨立的函數(shù).

這樣做的好處不言而喻, 是面向?qū)ο笪宕蠡驹瓌t中的單一職責原則 (Single Responsibility Principle), 比較長的函數(shù)被拆分成一個個小函數(shù), 將有利于代碼被復用.

沖動前:

public void Print(Employee employee)   {   //print employee's information   Console.WriteLine("Name:" + employee.Name);   Console.WriteLine("Sex:" + employee.Sex);   Console.WriteLine("Age:" + employee.Age);   //print employee's salary   Console.WriteLine("Salary:" + employee.Salary);   Console.WriteLine("Bonus:" + employee.Bonus);   }

沖動后:

public void Print(Employee employee)   {   //print employee's information   PrintInfo(employee);   //print employee's salary   PrintSalary(employee);   }   public void PrintInfo(Employee employee)   {   Console.WriteLine("Name:" + employee.Name);   Console.WriteLine("Sex:" + employee.Sex);   Console.WriteLine("Age:" + employee.Age);   }   public void PrintSalary(Employee employee)   {   Console.WriteLine("Salary:" + employee.Salary);   Console.WriteLine("Bonus:" + employee.Bonus);   }

2. Inline Method (將函數(shù)內(nèi)聯(lián))

解釋:

有些函數(shù)很短, 只有一兩行, 而且代碼的意圖也非常明顯, 這時可以考慮將這個函數(shù)干掉, 直接使用函數(shù)中的代碼.物件中過多的方法會讓人感到不舒服, 干掉完全不必要的函數(shù)后代碼會更簡潔.

沖動前:

public bool IsDeserving(int score)   {   return IsScoreMoreThanSixty(score);   }   public bool IsScoreMoreThanSixty(int score)   {   return (score > 60);   }

沖動后:

public bool IsDeserving(int score)   {   return (score > 60) ;   }

3. Inline Temp (將臨時變量內(nèi)聯(lián))

解釋:

如果有一個臨時變量 (Temp)用來表示某個函數(shù)的返回值, 一般來說, 這樣的做法挺好的. 但如果這個臨時變量實在多余, 將這個臨時變量內(nèi)聯(lián)之后毫不影響代碼的閱讀, 甚至這個臨時變量妨礙了其它重構工作, 就應該將這個臨時變量內(nèi)聯(lián)化.

把這個臨時變量干掉的好處在于減少了函數(shù)的長度, 有時可以讓其它重構工作更順利的進行.

沖動前:

int salary = employee.Salary;   return (salary > 10000);

沖動后:

return (employee.Salary > 10000);   Replace Temp With Query (用查詢式代替臨時變量)

解釋:

程序中有一個臨時變量(Temp)用來保存某個表達式的計算結果, 將這個計算表達式提煉(Extract)到一個獨立的函數(shù)(即查詢式Query)中, 將這個臨時變量所有被調(diào)用的地方換成對新函數(shù)(Query)的調(diào)用, 新函數(shù)還可以被其它函數(shù)使用.

好處在于減少函數(shù)長度, 增加代碼復用率, 有利于代碼進一步的重構. 并且注意 Replace Temp With Query 往往是 Extract Method 之前必不可少的步驟, 因為局部變量會使代碼不太容易被提煉, 所以在進行類似的重構前可以將它們替換成查詢式.

下面的這個例子不是很有必要使用Replace Temp With Query, 主要展示如何 Replace Temp With Query. 試想"沖動前"函數(shù)中有很多個代碼塊都使用到 totalPrice, 突然有一天我發(fā)現(xiàn)這個函數(shù)太長, 我需要將這一塊塊的代碼提煉成單獨的函數(shù), 這樣就需要將 totalPrice = price * num; 放到每一個提煉出來的函數(shù)中. 而如果原來函數(shù)中使用的是查詢式, 就不存在這個問題. 如果查詢式中的計算量很大, 也不建議使用 Replace Temp With Query.

沖動前:

public double FinalPrice(double price, int num)   {   double totalPrice = price * num;   if (totalPrice > 100)   return totalPrice * 0.8;   else   return totalPrice * 0.9;   }

沖動后:

public double FinalPrice(double price, int num)   {   if (TotalPrice(price, num) > 100)   return TotalPrice(price, num) * 0.8;   else   return TotalPrice(price, num) * 0.9;   }   public double TotalPrice(double price, int num)   {   return price * num;   }

5. Introduce Explaining Variable (引入可以理解的變量)

解釋:

很多時候在條件邏輯表達式中, 很多條件令人難以理解它的意義, 為什么要滿足這個條件? 不清楚. 可以使用Introduce Explaining Variable將每個條件子句提煉出來, 分別用一個恰當?shù)呐R時變量名表示條件子句的意義.

好處在于增加了程序的可讀性.

沖動前:

if((operateSystem.Contains("Windows"))&&   (browser.Contatins("IE")))     {     //do something    }

沖動后:

bool isWindowsOS = operateSystem.Contains("Windows");   bool isIEBrowser = browser.Contatins("IE");   if (isWindowsOS && isIEBrowser)   {   //do something   }

6. Split Temporary Variable (撇清臨時變量)

解釋:

例如代碼中有個臨時變量在函數(shù)上面某處表示長方形周長, 在函數(shù)下面被賦予面積, 也就是這個臨時變量被賦值超過一次, 且表示的不是同一種量. 應該針對每次賦值, 分配一個獨立的臨時變量.

一個變量只應表示一種量, 否則會令代碼閱讀者感到迷惑.

沖動前:

double temp = (width + height) * 2;   //do something   temp = width * height;   //do something

沖動后:

double perimeter = (width + height) * 2;   //do something   double area = width * height;   //do something

7. Remove Assignments to Parameters (消除對參數(shù)的賦值操作)

解釋:

傳入?yún)?shù)分"傳值"和"傳址"兩種, 如果是"傳址", 在函數(shù)中改變參數(shù)的值無可厚非, 因為我們就是想改變原來的值. 但如果是"傳值", 在代碼中為參數(shù)賦值, 就會令人產(chǎn)生疑惑. 所以在函數(shù)中應該用一個臨時變量代替這個參數(shù), 然后對這個臨時變量進行其它賦值操作.

沖動前:

public double FinalPrice(double price, int num)   {   price = price * num;   //other calculation with price   return price;   }

沖動后:

public double FinalPrice(double price, int num)   {   double finalPrice = price * num;   //other calculation with finalPrice   return finalPrice;   }

8. Replace Method with Method Object (用函數(shù)物件代替函數(shù))

解釋:

沖動的寫下一行行代碼后, 突然發(fā)現(xiàn)這個函數(shù)變得非常大, 而且由于這個函數(shù)包含了很多局部變量, 使得無法使用 Extract Method, 這時 Replace Method with Method Object 就起到了殺手锏的效果. 做法是將這個函數(shù)放入一個單獨的物件中, 函數(shù)中的臨時變量就變成了這個物件里的值域 (field).

沖動前:

class Bill   {   public double FinalPrice()   {   double primaryPrice;   double secondaryPrice;   double teriaryPrice;   //long computation   ...   }   }

沖動后:

class Bill   {   public double FinalPrice()   {   return new PriceCalculator(this).compute();   }   }   class PriceCalculator   {   double primaryPrice;   double secondaryPrice;   double teriaryPrice;   public PriceCalculator(Bill bill)   {   //initial   }   public double compute()   {   //computation   }   }

9. Substitute Algorithm (替換算法)

解釋:

有這么一個笑話:

某跨國日化公司, 肥皂生產(chǎn)線存在包裝時可能漏包肥皂的問題, 肯定不能把空的肥皂盒賣給顧客, 于是該公司總裁命令組成了以博士牽頭的專家組對這個問題進行攻關, 該研發(fā)團隊使用了世界上***精尖的技術 (如紅外探測, 激光照射等), 在花費了大量美金和半年的時間后終于完成了肥皂盒檢測系統(tǒng), 探測到空的肥皂盒以后, 機械手會將空盒推出去. 這一辦法將肥皂盒空填率有效降低至5%以內(nèi), 問題基本解決.

而某鄉(xiāng)鎮(zhèn)肥皂企業(yè)也遇到類似問題, 老板命令初中畢業(yè)的流水線工頭想辦法解決之, 經(jīng)過半天的思考, 該工頭拿了一臺電扇到生產(chǎn)線的末端對著傳送帶猛吹, 那些沒有裝填肥皂的肥皂盒由于重量輕就都被風吹下去了...

這個笑話可以很好的解釋 Substitute Algorithm, 對于函數(shù)中復雜的算法, 盡量想辦法將這個算法簡單化, 從而達到與之前同樣甚至更好的效果.

關于“Java優(yōu)化函數(shù)的構成有哪些”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Java優(yōu)化函數(shù)的構成有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI