代码膨胀
代码膨胀(英語:)是指程序代码(可以是源代码,也可以是机器代码)生成的程序文件过大、运行缓慢或者有其他浪费资源的情况。代码膨胀可能由编写代码的语言、编译时所用的編譯器,或者编写的程序员导致。代码膨胀通常指源代码过于冗长,由程序员的编码习惯和编程语言的设计导致,代码膨胀也可以指编译后的代码或者二进制文件占用空间过大(膨胀)。
常见原因
通常来说,膨胀的代码是由于程序员使用了较多的代码行,而非使用了解决问题的最佳方案。
程序员写出膨胀代码的部分原因有:
- 过度设计:
- 没有用适当的封装方案使代码可重复利用,导致代码重复[1]
- 宣告式編程——在命令式或面向对象语言中实现宣告式编程风格通常会导致代码膨胀。
- 过度的循环展开——不理智的过度优化性能。
- 过度使用多重
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>';
}
不同语言的代码密度
各种计算机语言的代码密度有着很大差别,以“紧凑”语言(例如领域特定语言、微软P代码 、线程代码)编写的程序以及紧凑语言(以机器代码编写)的直譯器通常比直接用机器语言编写程序消耗更少的代码量。
减少膨胀
减少代码膨胀的一些技术包括:[3]
- 重构经常使用的代码序列为子程序,并从多个位置调用该子程序,而不是在各个位置上复制并粘贴这段代码。
- 重新使用已经被编写的子程序(可能利用附加参数),而不是从头编写它们的新代码。
参见
- 软件膨胀
- 极简主义
参考资料
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.