热门问题
时间线
聊天
视角
代碼膨脹
来自维基百科,自由的百科全书
Remove ads
代碼膨脹(英語:Code bloat)是指程式碼(可以是原始碼,也可以是機器碼)生成的程式檔案過大、執行緩慢或者有其他浪費資源的情況,也可以指編譯後的代碼或者二進制檔案占用空間過大(膨脹)。代碼膨脹可能由編寫代碼的語言、編譯時所用的編譯器,或者編寫的程式設計師導致。
![]() | 此條目需要精通或熟悉電腦科學的編者參與及協助編輯。 |
![]() |
產生原因
通常來說,膨脹的代碼是由於程式設計師使用了較多的代碼行,而非使用了解決問題的最佳方案。
程式設計師寫出膨脹代碼的部分原因有:
- 過度設計:
- 沒有用適當的封裝方案使代碼可重複利用,導致代碼重複[1]
- 宣告式編程——在命令式或物件導向語言中實現宣告式編程風格通常會導致代碼膨脹。
- 過度的迴圈展開——不理智的過度最佳化效能。
- 過度使用多重
If
條件語句——而沒有使用如尋找表。
一些原生編譯器推導膨脹的例子包括:
Remove ads
例子
总结
视角
下列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>';
}
Remove ads
不同語言的代碼密度
![]() |
各種電腦語言的代碼密度有著很大差別,以「緊湊」語言(例如領域特定語言、微軟P代碼 、執行緒代碼)編寫的程式以及緊湊語言(以機器碼編寫)的直譯器通常比直接用機器語言編寫程式消耗更少的代碼量。
減少膨脹
減少代碼膨脹的一些技術包括:[3]
- 重構經常使用的代碼序列為子程式,並從多個位置呼叫該子程式,而不是在各個位置上複製並貼上這段代碼。
- 重新使用已經被編寫的子程式(可能利用附加參數),而不是從頭編寫它們的新代碼。
參見
- 軟體膨脹
- 極簡主義
參考資料
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads