基本介紹
- 中文名:代碼膨脹
- 外文名:Code bloat
- 定義:代碼有著浪費資源的情況
- 原因:編寫代碼的語言、編譯器等
- 解決方法:重構等
- 學科:網際網路術語
常見原因,例子,不同語言的代碼密度,減少膨脹,
常見原因
通常來說,膨脹的代碼是由於程式設計師使用了較多的代碼行,而非解決問題的最佳方案。
程式設計師寫出膨脹代碼的部分原因有:
- 過度使用面向對象(OOP)結構,如類和繼承。這可能導致麻煩且混亂的設計,用掉多於最佳解決方案的代碼行。
- 不正確的使用設計模式——面向對象的開發人員可能在不需要使用設計模式的地方強行使用,從而導致問題。
- 沒有用適當的封裝方案使代碼可重複利用,導致代碼重複
- 宣告式編程——在命令式或面向對象語言中實現宣告式編程風格通常會導致代碼膨脹。
- 過度的循環展開——不理智的過度最佳化性能。
- 過度使用多重If條件語句——而沒有使用如查找表。
實現此特性的原生編譯器可以為使用的每個數據類型引入一個模板類版本的方法。但是,這也導致被編譯的方法可能永遠不會被用到,導致代碼膨脹。更尖端的編譯器和連結器能檢測多餘的副本並將其丟棄,或者避免產生它們,從而減少膨脹。因而,使用能放棄死代碼的編譯器可以使模板代碼產生更小的二進制。
一些原生編譯器推導膨脹的例子包括:
- 死代碼——代碼被執行,但從未被使用。
例子
下列JavaScript算法有著大量的冗餘變數、不必要的邏輯,以及低效的字元串連線。
// Complex function TK2getImageHTML(size, zoom, sensor, markers) { var strFinalImage = ""; var strHTMLStart = '<img src="'; var strHTMLEnd = '" alt="The map"></div>'; var strURL = "http://maps.google.com/maps/api/staticmap?center="; var strSize = '&size='+ size; var strZoom = '&zoom='+ zoom; var strSensor = '&sensor='+ sensor; strURL += markers[0].latitude; strURL += ","; strURL += markers[0].longitude; strURL += strSize; strURL += strZoom; strURL += strSensor; for (var i = 0; i < markers.length; i++) { strURL += markers[i].addMarker(); } strFinalImage = strHTMLStart + strURL + strHTMLEnd; return strFinalImage;};
而相同的邏輯可以用下列方式更有效地表達:
// Simplified function TK2getImageHTML(size, zoom, sensor, markers) { var url = [ 'http://maps.google.com/maps/api/staticmap', '?center=', markers[0].latitude, ',', markers[0].longitude, '&size=', size, '&zoom=', zoom, '&sensor=', sensor ]; for (var i = 0; i < markers.length; i++) { url.push(markers[i].addMarker()); } return '<img src="' + url.join('') + '" alt="The map" ></div>';}
不同語言的代碼密度
減少膨脹
減少代碼膨脹的一些技術包括:
- 重構經常使用的代碼序列為子程式,並從多個位置調用該子程式,而不是在各個位置上複製並貼上這段代碼。
- 重新使用已經被編寫的子程式(可能利用附加參數),而不是從頭編寫它們的新代碼。