打开主菜单

代码膨胀(英語:Code bloat)是指通过代码生成的输出文件过大、速度缓慢或者有其他浪费资源的情况。代码膨胀可能由编写代码的语言、编译时所用的編譯器,或者编写的程序员导致。因此,虽然代码膨胀通常指源代码存在不必要的部分(由程序员导致),但也可指生成的代码或者二进制文件文件有膨胀问题。

常见原因编辑

通常来说,膨胀的代码是由于程序员使用了较多的代码行,而非解决问题的最佳方案。

程序员写出膨胀代码的部分原因有:

  • 过度使用面向对象(OOP)结构,如类和继承。这可能导致麻烦且混乱的设计,是代码量多于必要。
  • 不正确的使用设计模式——面向对象的开发人员可能在不需要使用设计模式的地方强行使用,从而导致问题。
  • 没有用适当的封装方案使代码可重复利用,导致代码重复[1]
  • 宣告式編程——在命令式或面向对象语言中实现宣告式编程风格通常会导致代码膨胀。
  • 过度的循环展开——不理智的过度优化性能。
  • 过度使用多重If条件语句——而没有使用如查找表

C++中采用的模板系统的一些原生实现是编译该语言的编译器之不足之处的例子。

实现此特性的原生编译器可以为使用的每个資料類型引入一个模板类版本的方法。但是,这也导致被编译的方法可能永远不会被用到,导致代码膨胀。更尖端的编译器和链接器能检测多余的副本并将其丢弃,或者避免产生,从而减少膨胀。因而,使用能放弃死代码英语Dead code的编译器可以使模板代码产生更小的二进制文件。[2]

一些原生编译器推导膨胀的例子包括:

例子编辑

下列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代码英语Microsoft P-Code线程代码英语Threaded code)编写的程序以及紧凑语言(以机器代码编写)的直譯器通常比直接用机器语言编写程序消耗更少的代码量。

减少膨胀编辑

减少代码膨胀的一些技术包括:[3]

  • 重构经常使用的代码序列为子程序,并从多个位置调用该子程序,而不是在各个位置上复制并粘贴英语Copy and paste programming这段代码。
  • 重新使用已经被编写的子程序(可能利用附加参数),而不是从头编写它们的新代码。

参见编辑

参考资料编辑