成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳細介紹優化函數的構成

開發 后端
函數優化是指運行效率的優化,優化后的函數執行速度應高于優化之前。本文介紹了幾種優化函數的構成,希望對你有幫助,一起來看。

下面介紹了幾種優化函數

1. Extract Method (提煉函數)

解釋:

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

這樣做的好處不言而喻, 是面向對象五大基本原則中的單一職責原則 (Single Responsibility Principle), 比較長的函數被拆分成一個個小函數, 將有利于代碼被復用.

沖動前:

  1. public void Print(Employee employee)   
  2. {   
  3. //print employee's information   
  4. Console.WriteLine("Name:" + employee.Name);   
  5. Console.WriteLine("Sex:" + employee.Sex);   
  6. Console.WriteLine("Age:" + employee.Age);   
  7. //print employee's salary   
  8. Console.WriteLine("Salary:" + employee.Salary);   
  9. Console.WriteLine("Bonus:" + employee.Bonus);   
  10. }  

沖動后:

  1. public void Print(Employee employee)   
  2. {   
  3. //print employee's information   
  4. PrintInfo(employee);   
  5. //print employee's salary   
  6. PrintSalary(employee);   
  7. }   
  8. public void PrintInfo(Employee employee)   
  9. {   
  10. Console.WriteLine("Name:" + employee.Name);   
  11. Console.WriteLine("Sex:" + employee.Sex);   
  12. Console.WriteLine("Age:" + employee.Age);   
  13. }   
  14. public void PrintSalary(Employee employee)   
  15. {   
  16. Console.WriteLine("Salary:" + employee.Salary);   
  17. Console.WriteLine("Bonus:" + employee.Bonus);   
  18. }  

2. Inline Method (將函數內聯)

解釋:

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

沖動前:

  1. public bool IsDeserving(int score)   
  2. {   
  3. return IsScoreMoreThanSixty(score);   
  4. }   
  5. public bool IsScoreMoreThanSixty(int score)   
  6. {   
  7. return (score > 60);   
  8. }  

沖動后:

  1. public bool IsDeserving(int score)   
  2. {   
  3. return (score > 60) ;   
  4. }  

3. Inline Temp (將臨時變量內聯)

解釋:

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

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

沖動前:

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

沖動后:

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

解釋:

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

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

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

沖動前:

  1. public double FinalPrice(double price, int num)   
  2. {   
  3. double totalPrice = price * num;   
  4. if (totalPrice > 100)   
  5. return totalPrice * 0.8;   
  6. else   
  7. return totalPrice * 0.9;   
  8. }  

沖動后:

  1. public double FinalPrice(double price, int num)   
  2. {   
  3. if (TotalPrice(price, num) > 100)   
  4. return TotalPrice(price, num) * 0.8;   
  5. else   
  6. return TotalPrice(price, num) * 0.9;   
  7. }   
  8. public double TotalPrice(double price, int num)   
  9. {   
  10. return price * num;   
  11. }  

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

解釋:

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

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

沖動前:

 

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

沖動后:

  1. bool isWindowsOS = operateSystem.Contains("Windows");   
  2. bool isIEBrowser = browser.Contatins("IE");   
  3. if (isWindowsOS && isIEBrowser)   
  4. {   
  5. //do something   
  6. }  

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

解釋:

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

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

沖動前:

  1. double temp = (width + height) * 2;   
  2. //do something   
  3. temp = width * height;   
  4. //do something  

沖動后:

  1. double perimeter = (width + height) * 2;   
  2. //do something   
  3. double area = width * height;   
  4. //do something  

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

解釋:

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

沖動前:

  1. public double FinalPrice(double price, int num)   
  2. {   
  3. price = price * num;   
  4. //other calculation with price   
  5. return price;   
  6. }  

沖動后:

  1. public double FinalPrice(double price, int num)   
  2. {   
  3. double finalPrice = price * num;   
  4. //other calculation with finalPrice   
  5. return finalPrice;   
  6. }  

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

解釋:

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

沖動前:

  1. class Bill   
  2. {   
  3. public double FinalPrice()   
  4. {   
  5. double primaryPrice;   
  6. double secondaryPrice;   
  7. double teriaryPrice;   
  8. //long computation   
  9. ...   
  10. }   
  11. }  

沖動后:

  1. class Bill   
  2. {   
  3. public double FinalPrice()   
  4. {   
  5. return new PriceCalculator(this).compute();   
  6. }   
  7. }   
  8. class PriceCalculator   
  9. {   
  10. double primaryPrice;   
  11. double secondaryPrice;   
  12. double teriaryPrice;   
  13. public PriceCalculator(Bill bill)   
  14. {   
  15. //initial   
  16. }   
  17. public double compute()   
  18. {   
  19. //computation   
  20. }   
  21. }  

9. Substitute Algorithm (替換算法)

解釋:

有這么一個笑話:

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

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

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

本文鏈接: http://www.cnblogs.com/technology/archive/2011/05/10/2042255.html

【編輯推薦】

  1. 內嵌式的語言PHP應用技巧七則
  2. 提高PHP速度的幾種辦法
  3. 高效PHP程序必知的53個技巧
  4. 讓PHP網站跑的更快 如何優化PHP
  5. 警惕 PHP程序員最易犯10種錯誤
責任編輯:于鐵 來源: 博客園
相關推薦

2011-07-01 09:56:19

.NET

2011-06-21 11:05:41

內聯函數

2011-07-21 13:51:38

java

2011-07-21 14:15:08

java

2009-12-02 20:15:12

PHP header函

2009-12-10 09:59:49

PHP讀取目錄函數

2010-03-11 11:07:37

Python函數參數

2011-07-15 01:20:58

C指針函數函數指針

2009-06-25 14:59:39

jQuery.exte

2011-07-20 17:16:50

C++重載函數

2011-07-20 13:40:09

拷貝構造函數

2009-12-11 17:14:43

PHP中文處理函數

2009-02-24 14:27:55

2020-09-28 08:12:59

CC++時間

2022-06-13 16:09:17

PandasPython

2024-06-13 10:05:36

2010-04-06 13:33:41

Oracle服務

2009-06-18 09:47:14

Spring的核心

2011-11-29 12:13:21

VPN

2011-03-15 09:14:29

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区 | 亚洲444kkkk在线观看最新 | 国产精品成人国产乱一区 | 九九精品影院 | 亚洲欧美日韩精品久久亚洲区 | 久久国产精彩视频 | 一区二区三区免费 | 97伦理电影网 | av永久| 久久久精品一区 | 91精品国产一区二区三区 | 91久久综合 | 欧美激情一区二区三区 | 久久av一区 | 亚洲欧美日韩网站 | 国产精品一区二区三区四区五区 | 亚洲毛片在线观看 | 一级aaaaaa毛片免费同男同女 | 免费观看www | 三区在线观看 | 欧美日韩电影免费观看 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 日韩精品视频一区二区三区 | 午夜成人在线视频 | 视频在线一区二区 | 盗摄精品av一区二区三区 | 精品视频一区二区在线观看 | 成人小视频在线观看 | 黄色欧美 | 中文字幕一区二区三区精彩视频 | 欧美一级视频 | 国产精品自产拍 | 2019天天操| 欧美久久久久久 | 成年人在线播放 | 国产精品欧美一区二区三区不卡 | 亚洲综合天堂 | 中文字幕成人在线 | 国产一级视频在线 | 一区二区久久 | 午夜视频在线免费观看 |