我认为这实际上是两个问题合二为一-我会尽力回答这两个问题。
1)我们如何减少代码库中的重复代码。
它有助于提醒我们这样做的好处:由于重复的业务逻辑而导致的错误更少,并且需要维护的代码更少。减少这种情况发生的最好方法是通过交流-如其他答案所述。我强烈同意使用代码审查的建议,但要特别注意一下,您应该平均分担代码审查责任,以正确传播知识。您还应该使用日常维护,以便开发人员经常能够识别出有人在尝试解决现有有用代码的问题。您还应该考虑代码配对,因为它可以增加知识共享并有助于使程序员保持纪律。
我还建议您与开发人员尽可能地靠近,最好在同一房间。具有大量共享的白板和空间。然后一起送他们出去吃饭。您的开发人员“绑定”的越多,他们彼此之间的沟通越好。
我不同意使用维基或类似文档代码的建议。无论开发人员多么有纪律,其文档都将脱离原始代码。一种更有效的方法是通过示例样式测试使用规范。这些文件以一种清晰的方式记录了代码,如果有人在不更改示例的情况下更改了代码,则测试将失败。
您已经有一个包含大量重复代码的大型代码库,因此您可能应该进行重构。很难找到未被剪切和粘贴的重复代码。因此,我建议您分析变更历史,而不要这样做。查找经常同时更改的文件。如果它不指示实际的重复代码,并且仍然值得清除,则可能表明封装存在问题。如果您还可以根据代码更改来分析错误修复历史记录,则可能会发现通常需要修复的特定热点。分析这些热点,您可能会发现其中许多是由于重复的业务逻辑所致,开发人员仅在一个地方进行了更改,而没有意识到需要进行两次更改。
2)我们应该如何制作可以在其他项目中使用的共享窗口小部件,组件,库等。
在这种情况下,您不应尝试包装业务逻辑,而应共享有用的框架代码。这可能是一个棘手的平衡,因为创建和维护一组共享组件的成本可能非常大,并且可能很难预测在哪些情况下值得这样做。我在这里建议的方法是三击规则。不必担心重复编写两次类似的代码,但是当您需要第三次编写该代码时,可以将其重构为共享组件。在这一点上,您可以合理地确定它会很有用,并且对组件的更广泛的需求有了很好的了解。显然,开发人员之间的沟通在这里至关重要。
考虑使共享组件尽可能多地开源。这不是业务逻辑,因此不会给您的竞争对手带来太多优势,但这意味着您将免费获得额外的审阅者和维护者。