代码重复使用

软件开发(以及一般的计算机编程)中,遵循现有软件或软件知识的代码重复使用(也称为软件重复使用)遵循可重用性原则来构建新软件。

可以通过不同的方式来实现代码重复使用,具体取决于所选择的编程语言的复杂性以及从较低级别的方法(例如代码复制) (例如通过snippets ),简单函数(过程子例程)或一堆对象功能组织成模块(例如)或自定义名称空间,以及更高级别的软件包框架软件套件

代码重用意味着依赖性可能使代码可维护性更加困难。至少一项研究发现,重复使用代码可以减少技术债务

概述

编程的最早日子开始就练习了临时代码重用。程序员始终将代码,模板,功能和过程的部分重用。但是,软件重复使用是软件工程中公认的研究领域,但是,仅1968年,贝尔实验室的道格拉斯·麦克罗伊(Douglas McIlroy)就可以将软件行业基于可重复使用的组件提议。

代码重用旨在通过利用已经在软件产品开发过程中以某种形式创建的资产来节省时间和资源并减少冗余。重复使用的关键思想是,一部分编写的计算机程序的一部分可以或应在以后编写的其他程序中使用。

代码重用可能意味着创建可重复使用资产的单独维护版本。虽然代码是为重用选择的最常见资源,但开发周期中生成的其他资产可能会提供重复使用的机会:软件组件,测试套件,设计,文档等。

软件库是代码重复使用的一个很好的例子。程序员可以决定创建内部抽象,以便可以重复使用程序的某些部分,或者可以创建自定义库供自己使用。使软件更容易重复使用的某些特征是模块化宽松的耦合,高凝聚力信息隐藏关注点的分离

要使用新编写的代码以使用现有代码,必须定义某种界面或通信方式。这些通常包括“呼叫”或使用子例程对象原型。在组织中,此类实践是由域工程(也称为软件产品线工程)正式化和标准化的。

使用现存程序的先验版本作为下一个版本的起点的一般实践也是代码重用的一种形式。

一些所谓的代码“重用”涉及将现有程序中的某些或全部代码简单地复制到新程序中。尽管组织可以通过这种方法来实现为新产品销售收益的时间,但随后,他们可能会被剪切和粘贴编程引起的许多相同的代码重复问题所束缚。

许多研究人员致力于使重复使用速度更快,更轻松,更系统,并且是正常编程过程中不可或缺的一部分。这些是发明面向对象的编程的主要目标,这成为最常见的形式重复使用形式之一。后来的发明是通用编程

另一个更新的方法是使用软件“生成器”,该程序可以根据用户选择的一组参数创建特定类型的新程序。有关此类系统的研究领域是生成编程元编程

重复使用的类型

关于动机和驱动因素,重复使用可能是:

  • 机会主义 - 在准备开始一个项目的同时,团队意识到现有的组件可以重复使用。
  • 计划 - 一个团队从战略上设计组件,以便在未来的项目中重复使用。

重复使用可以进一步分类:

  • 内部再利用 - 团队重用自己的组件。这可能是业务决定,因为团队可能希望控制对项目至关重要的组件。
  • 外部重用 - 团队可以选择许可第三方组件。许可第三方组成部分通常会使团队1-20%的内部成本成本。团队还必须考虑找到,学习和集成组件所需的时间。

关于重复使用的形式或结构,代码可以是:

  • 引用 - 客户端代码包含对重复使用的代码的引用,因此它们具有不同的生命周期,并且可以具有不同的版本。
  • 分叉 - 客户端代码包含重用代码的本地或私人副本,因此它们共享一个生命周期和单个版本。

通常会劝阻叉式 - 重复,因为它是代码重复的一种形式,要求在每个副本中校正每个错误,并且对重用代码的增强功能需要在每个副本中手动合并,否则它们已过时。但是,叉式订购可以具有诸如隔离,更改重用代码的灵活性,更容易的包装,部署和版本管理。

系统

系统的软件重用是提高生产率并提高软件行业质量的策略。尽管它的概念很简单,但成功的软件重用实现在实践中很难。为此提出的原因是软件重复使用对实施的上下文的依赖性。与系统软件重复使用有关的一些有问题的问题是:

  • 明确且定义明确的产品视觉是软件产品线(SPL)的重要基础。
  • 进化实施策略将成为公司的更务实的策略。
  • 有需要持续的管理支持和领导才能确保成功。
  • 需要适当的组织结构来支持SPL工程。
  • 从一家以项目为中心的公司到面向产品的公司的思维方式的变化至关重要。

例子

软件库

代码重复使用的一个非常普遍的示例是使用软件库的技术。许多常见的操作,例如在不同的知名格式之间转换信息,访问外部存储,与外部程序进行接口或以常见方式操纵信息(数字,单词,名称,位置,日期等)。程式。新程序的作者可以在软件库中使用代码来执行这些任务,而不是通过直接在程序中编写全新代码来执行操作,而不是“重新发明轮子”。图书馆的实施通常具有经过良好测试并涵盖异常或神秘案件的好处。缺点包括无法调整可能影响性能或所需输出的细节,以及获取,学习和配置库的时间和成本。

设计模式

设计模式是解决重复问题的一般解决方案。设计模式比有形更概念性,可以修改以满足确切需求。但是,可以将抽像类和界面重复使用以实现某些模式。

构架

开发人员通常通过第三方应用程序和框架重复使用大量软件。尽管框架通常是特定于域的,并且仅适用于应用家庭。

高阶功能

功能编程中,可以在许多情况下使用设计模式或框架以前使用的高阶功能。

逆转录

重新计算包含代码的重复使用,仅仅是因为复古程序是在旧计算机上运行的,或为其模拟器运行。

计算机安全

计算机安全性中,复制被用作软件利用方法。当攻击者无法直接输入代码来修改程序的控制流程,例如在存在诸如W^X之类的代码注入防御的情况下,他或她可以将控制流程重定向到内存中存在的代码序列。

代码重新使用攻击的示例是返回LIBC攻击面向返回的编程和面向跳跃的编程。

成分

在面向对象的范围内,组件代表一组协作类(或仅一个类)及其接口。接口负责启用组件的替换。还可以使用组件源代码管理技术( CSCM )在SCM存储库之间隔离和同步可重复使用的组件。

外部计算机

“代码重复使用”的整个概念还可以包含软件外的工程应用程序。例如,计算机辅助设计中的参数建模允许创建可重复使用的设计。标准化导致创建可互操作的部分,然后在许多情况下可以重复使用。

批评

代码重用结果依赖重复使用的组件。罗布·派克(Rob Pike)认为“稍微复制胜于一点依赖性”。当他加入Google时,该公司非常重视代码重用。他认为,在汇编速度和可维护性方面,Google的代码库仍然遭受了以前政策的结果。

可重复使用的代码通常需要更多的努力来编写和设计。弗雷德·布鲁克斯(Fred Brooks)讨论了与他的论文“焦油坑”和“无银子弹”中的努力相关的成本明显更高的成本,谬论通常是在不仔细了解将赎回该成本的机制的情况下花费的。理由通常来自错误地绘制相似之处,以在物理制造过程中重复使用的零件。不正确,因为编写代码类似於单个产品的设计,而不是生产多个单元。

也可以看看