几年前,我被告知有关代码重用的研究。显然,人们发现,平均而言,程序员在搜索要重用的代码时会有7分钟的窗口。如果他们在该窗口中找不到符合他们需求的代码,他们就会自己写。
这是在需要仔细管理代码以便重复使用以确保您可以在窗口中找到所需内容的背景下提供的。
您(个人和组织)如何管理您的来源以便更轻松地重复使用? 您是否专门维护重用库?如果是这样,您如何对其进行索引以最大化您的命中率?
答案 0 :(得分:10)
一个复杂的问题:
代码的某些部分可以概括为库或API。我们有一个公共图书馆,可以及时了解常见问题的解决方案。通常:验证,缓存,数据访问类,日志记录等......
某些部分是特定于应用程序的。它们不容易概括。我们在HowTos中转换它们并进行内部演示。代码也通过使用易于浏览的SCM(在我们的案例中为SVN)进行回收。
我们还有生成代码的工具,一方面无法回收,另一方面它总是相似的(想想调用存储过程)。
结对编程也是传播现有解决方案知识的有用方法。我们在可能或适当的时候使用它。
最后一种技巧是学费。每个编码员都有一个导师可以参考。由于导师很少,他们之间有很多共享,这种知识可以自上而下的方式传播。
答案 1 :(得分:4)
无情地重构并希望最好。
更新(4年后,希望更明智)
答案 2 :(得分:2)
拥有一个积极支持的框架。
了解现有代码库/让其他开发人员了解代码库。如果您的团队/公司足够大,请找一个知道代码库的人,并可以向他们寻求指导。
文件,文件,文件。未记录的代码对于重用是没有用的,因为它需要花费太长时间才能理解其内部工作原理。
拥有良好的界面。简单的类型,简单的结构或类。事情越复杂,在另一个项目中使用的就越少。
优化和调试可重用代码。第n次遇到其他人代码中的错误的开发人员将开始重新编写现有代码。
答案 3 :(得分:1)
如果您不是我最初的回复,请尝试使用TDD。
我认为使用TDD是保持代码耦合度低的好方法,还有其他好处。虽然这本身并不能防止相同的行为被实施两次,但是当您确定可以删除重复的区域时,它会更加容易。
另一个好处是,TDD有一个步骤可以消除重复(重构)作为循环的一部分。
此外,测试构成了代码文档的一部分,因此可以更轻松地识别重复行为。
答案 4 :(得分:1)
组织是关键。如果名称空间和智能感知可用,则可以缩小正确的功能,并最终找到它。如果他们没有找到他们想要的东西,他们可能会发现一些接近或相关的东西。只在一个巨大的组中混合使用的代码很容易找到,但人们永远不会找到他们想要的方法。
在命名和位置方面,一致性也很重要。如果您决定在项目期间的某个时刻更改样式,请返回并更改所有内容以适合该样式。它很容易成为一个非常漫长而枯燥的过程,但它比尝试使用不一致的库更好。
答案 5 :(得分:1)
对整个应用程序进行概要分析,并从较重的代码部分开始重构。 (80%的时间花费在20%最常用的代码上)
使用能够识别内存泄漏,重复呼叫, 冗长的电话,不同意的记忆,不受干扰的资源等。
按规则,新代码始终使用最佳实践。
答案 6 :(得分:0)
您(个人和组织)如何管理您的来源 它更容易重用?您是否专门维护重用库?和 如果是这样,你如何对其进行索引以最大化你的命中率?
我没有,我在这里有一个公认的有争议的意见,但我发现最大化代码重用的想法适得其反(我解释"最大化"优先考虑它优先于其他所有其他事情而不是将其视为兼顾利弊得到平衡。我更愿意让团队中的大量冗余工作倾向于更好地分离和隔离每个开发人员的模块。首先,在每个人开始左右不同意我之前,我认为我们可以就某些事情达成一致:
希望我们至少能就这些问题达成一致。我发现最大限度地利用过度热心的同事重复使用代码的问题是,它经常会导致上述一个或多个问题。直接代码重用的热情并不是根本问题,但是优先级偏向于代码重用而不是测试覆盖,隔音设计,确保事情在我们像疯了一样重用它们之前已经足够成熟,等等
当然,如果我们重复使用的所有代码工作得非常漂亮,具有全面的测试覆盖率,那么它被证明可以满足使用它的所有方面的需求,而这些方式的效率远高于不重复使用它,并且不需要经历多年来任何设计变更,我都会对代码重用感到欣喜若狂。但是我的经验常常发现,在代码重用可能成为维护问题而不是解决方案的方式上,远远没有达到理想状态。
您(个人和组织)如何管理您的来源 它更容易重用?您是否专门维护重用库?和 如果是这样,你如何对其进行索引以最大化你的命中率?
所以,我再也没有寻求最大化"代码重用在团队内部编写的专有代码中。我试图确保团队没有花费大量时间在冗余工作上,但如果物理学家和渲染人员都实现他们自己的轴对齐边界框类,我会让事情滑动很多,例如:它不一定是多余的,因为物理学家可能使用对他的目的更有效的最小/最大表示,而渲染开发者可能使用中心/半尺寸表示。我确实尝试确保尽可能多地重用标准库,因为这种代码重用实际上保证是可靠的,经过充分测试的,并且不需要进一步的设计更改(其他团队)他们花了很多时间来确保这一点。)
相反,我把重点放在测试上。一个模块在这里重复一点点代码,如果你问我是否能够以令用户真正高兴的方式工作,有完整的测试覆盖率,并且无法保证无休止的变化,那就完全没问题了。当我们使用第三方库时,我们会一直接受这种重复,这些库可能会复制我们内部代码库中的一些代码。当冗余不会导致冗余维护工作时,这不是问题。
所以我建议尽量放松最大化代码重用的想法。但是如果你想尽可能简单地重用真正可靠,经过良好测试的非平凡代码,那么我发现组织非常有用的库更有帮助,比如"数学"图书馆,"图像"处理库等 - 而不是试图将它们融合成类似于"核心"或"普通"。后一种类型倾向于引诱开发人员投入各种折衷的效用函数,这些函数几乎不利于使用它们的团队,并且大多数情况下它会变得很混乱,因为它开始变得难以找到任何感兴趣的东西。