Questions tagged «code-reuse»

使用现有代码创建新软件。

12
在项目之间共享微小代码段的最佳实践
我一直在工作中严格遵循DRY原则;每次我由于懒惰而重复编写代码时,都会在以后需要在两个地方维护该代码时再次出现。 但是我经常写一些小的方法(可能是10到15行代码),这些方法需要在两个不能互相引用的项目中重用。该方法可能与网络/字符串/ MVVM等有关,并且是一种通用的有用方法,并不特定于它最初所在的项目。 重用此代码的标准方法是为可重用代码创建一个独立的项目,并在需要时引用该项目。问题在于,我们最终遇到了两种不理想的情况之一: 我们最终得到了数以百计的小项目-每个小项目都包含我们需要重用的小类/方法。.DLL仅需少量代码就可以创建一个全新的应用程序吗? 我们最终完成了一个项目,其中包含越来越多的不相关方法和类。这种方法是我曾经工作过的公司所做的。他们有一个名为的项目base.common,其中包含用于我上面提到的事情的文件夹:联网,字符串处理,MVVM等。它非常方便,但是不必要地将其与所有不需要的无关代码一起拖到它。 所以我的问题是: 软件团队如何最好地在项目之间重用少量代码? 我特别感兴趣的是,如果有人在一家在这方面有政策的公司工作,或者像我本人那样亲自遇到了这个难题。 注意:我对“项目”,“解决方案”和“参考”一词的使用来自Visual Studio .NET开发的背景。但是我敢肯定,这个问题与语言和平台无关。

11
单元测试不应该使用我自己的方法吗?
今天,我正在观看“ JUnit基础”视频,作者说,在程序中测试给定方法时,不应在此过程中使用其他自己的方法。 更具体地说,他正在谈论测试某种记录创建方法,该方法采用参数的名称和姓氏,并使用它们在给定表中创建记录。但他声称,在测试此方法的过程中,他不应使用其他DAO方法来查询数据库以检查最终结果(以检查记录是否确实由正确的数据创建)。他声称为此,他应该编写其他JDBC代码来查询数据库并检查结果。 我想我理解他的主张的精神:您不希望一种方法的测试用例取决于另一种方法(在本例中为DAO方法)的正确性,这是通过(再次)编写自己的验证来完成的/支持代码(应该更加具体和集中,因此代码更简单)。 但是,我内心的声音开始以诸如代码重复,不必要的额外努力之类的论点来抗议。在测试其他方法时只使用其中一些方法可以吗?如果其中一个没有按预期执行操作,则其自己的测试用例将失败,我们可以对其进行修复并再次运行测试电池。无需重复代码(即使重复的代码稍微简单一些)也无需浪费精​​力。 我对此有很强烈的感触,因为我最近编写了多个Excel - VBA应用程序(感谢Rubberduck for VBA进行了正确的单元测试),其中应用此建议将意味着很多额外的工作,而没有明显的好处。 您能否分享您对此的见解?

9
当代码远离“干净代码”实践时,如何维护庞大的开源库?
我仍然缺乏编写高质量代码的经验,因此我阅读了解决诸如Robert C. Martin的Clean Code之类的问题的书籍,并不断检查著名库的代码以提高我的技能。 尽管许多开源库已经维护了多年,这意味着它们不太可能走在正确的道路上,但我发现其中许多代码与编写干净代码的原理相去甚远,例如包含数百行代码。 因此,我的问题是:干净代码的原则是否太受限制,我们可以在许多此类库中不使用它们吗?如果没有,如何在不考虑许多这些原则的情况下维护庞大的库? 任何简短的说明,我将不胜感激。如果这个问题对一个新手来说似乎很愚蠢,我深表歉意。 编辑 在Butterknife库中查看此示例-Butterknife库-Android社区中最知名的库之一。

19
OOP是否实现了代码重用的承诺?有哪些替代方法可以实现代码重用?
使用面向对象范例的最大希望可能是代码重用。有人对此表示怀疑。为什么没有实现? OOP定义的代码重用是否会使项目更高效? 或更易于管理?还是更容易维护?还是质量更高? 也许大家都同意代码重用是一件好事,但是有几种方法可以实现这一目标。问题是关于OOP提供的代码重用方法。这是好事吗?是否有比面向对象,子分类,多态等更好的方法来实现代码重用?有什么方法更好?为什么呢 告诉我们您在OOP重用或其他范式重用方面的经验。

8
为什么不应该将类设计为“开放式”?
在阅读各种Stack Overflow问题和其他代码时,关于如何设计类的一般共识已经关闭。这意味着默认情况下,在Java和C#中,所有内容都是私有的,字段是final,某些方法是final,有时类甚至是final。 这背后的想法是隐藏实现细节,这是一个很好的理由。但是,由于protected大多数OOP语言和多态性的存在,这是行不通的。 每当我想为类添加或更改功能时,通常都会受到私有和最终放置在任何地方的阻碍。这里的实现细节很重要:您正在实施并扩展它,完全了解其后果。但是,由于无法访问私有字段和最终字段和方法,因此我有以下三种选择: 不要扩展类,只解决导致代码更复杂的问题 复制并粘贴整个类,杀死代码的可重用性 分叉项目 这些不是很好的选择。为什么protected在用支持它的语言编写的项目中不使用它?为什么某些项目明确禁止从类继承?
44 code-reuse 

7
您如何跟踪团队编写的类和职能?
在编写代码时,我遇到了许多与队友一样的挑战,并且编写了一些有用的函数和类,它们也是如此。如果能保持良好的沟通,我会听说有人将一些很棒的东西组合在一起,六个月后,当我需要它时,我可能会记住它并调用该函数,从而节省了时间。如果我不记得它,或者从不知道它,我可能会重新发明轮子。 是否有记录此类事情的特殊实践?您如何使它们容易找到? 如果您的团队没有这样的文档,您如何查找车轮是否已经存在? 编辑: 到目前为止,除了一个答案以外,所有答案都与理想情况有关。因此,让我总结一下这些解决方案:文档和通讯;这些都是很棒的事情,但是它们依赖于程序员有时间(和技能)来编写文档,参加会议,做笔记并记住一切。 到目前为止,最流行的答案(Caleb答案)是程序员无法使用的唯一答案,它没有文档和会议的能力,并且只做一件事:编程。编程是程序员的工作,是的,一个优秀的程序员可以编写文档,进行单元测试等,但是让我们面对现实吧-我们大多数人都喜欢编程而不是文档。他的解决方案是程序员识别可重用的代码并将其拉到其自己的类或存储库等中,并且由于它是孤立的,因此变得可查找并简化了使用它的学习曲线。这是通过编程来完成的。 从某种角度来说,我是这样看的:我刚刚编写了三个函数,我想到其他人应该也了解它们。我可以记录它们,编写它们,在会议上宣布它们,等等。-我可以做,但是这不是我的强项-或....我可以将它们提取到一个类中,命名好,使它们像一个黑盒子,然后将其粘贴到其他类文件所在的位置。然后,一封简短的电子邮件宣布它很容易。其他开发人员可以扫描代码并更好地理解代码,而不是使用他们无法完全理解的代码中使用的隔离功能-删除上下文。 我之所以喜欢它,是因为这意味着拥有一组具有良好名称的类文件以及具有良好名称的方法,是一个很好的解决方案,可以通过良好的编程来实现。它不需要开会,并且可以减轻对详细文档的需求。 在这种情况下,还有其他想法吗……针对孤立的且时间紧迫的开发人员?

16
是否有具体原因不大量使用库和代码片段?[关闭]
总的来说,我从事编程工作已有大约8年的时间,在我看来,我越来越依赖开放源代码库和代码片段(该死的GitHub!)来“完成工作”。我知道我可以及时编写自己的实现,但我希望专注于总体设计。 这是正常情况(非公司环境)吗?如果我的“编程”仅是将不同的库粘合在一起,那会出什么问题? 我知道“不要重新发明轮子”,但是当您不再发明一个轮子时会发生什么呢?

4
Rich Hickey说道:“ [接口/类/类型]的所有特殊性杀死了您的重用!”是什么意思?
在Rich Hickey 在第29分钟发人深省的goto会议主题演讲“ 值的价值 ”中,他谈论的是Java之类的语言的开销,并声明“所有这些接口都会破坏您的重用”。他什么意思?真的吗? 在寻找答案时,我遇到了: 最少知识原则(又称为“德米特定律”)鼓励密闭的API接口。维基百科还列出了一些缺点。 凯夫林·汉尼(Kevlin Henney)的《帝国服装危机》认为,使用而不是重复使用是适当的目标。 杰克·迪埃德里奇(Jack Diederich)的“ 停止写作课 ”演讲反对一般的过度设计。 显然,任何写得不好的东西都是没有用的。但是,编写良好的API的接口将如何阻止使用该代码?整个历史上都有一些例子,出于一种目的制造的东西被更多地用于其他目的。但是在软件世界中,如果您出于某种非预期目的使用某种东西,通常会破坏它。 我正在寻找一个好的界面的良好示例,该界面可以防止对某些代码的合法但无意的使用。是否存在?我无法想象。

9
编码时如何通过分析克服瘫痪?
当我开始一个新项目时,我经常会立即开始考虑实现的细节。“我要在哪里放置DataBaseHandler?我应该如何使用它?要使用它的类应该从某些Abstract超类中扩展。发送请求和解析数据的方法?” 我最终停滞了很长时间,因为我想为可扩展性和可重用性编写代码。但是我觉得几乎不可能过去思考如何实现完美。 然后,如果我只想说“拧紧它,就完成它!”,我很快就会碰壁,因为我的代码没有组织好,混合了抽象级别,等等。 您有什么技术/方法来启动一个新项目,同时建立一个可以很好地扩展的逻辑/模块化结构? - -编辑- - 好吧,这已经是很难接受答案的问题类型了,但是希望获得更多反馈,看看是否有共识。TDD听起来真的很酷,坦率地说,我一直在意欲加快使用JUnit等的速度。与此同时,TDD的拥护者如何看待这一事实,即与TDD有关的合理点解决了我的问题?特别的问题是,TDD似乎并没有真正解决设计问题。当然,我同意TDD将帮助我定义我想做什么,然后我可以逐步研究如何做,但是有许多不同的总体设计模式/结构可以全部通过单元测试。就是这样:它测试单个UNITS。我想我有点困惑...我不知道。也许我' 谢谢!

5
是否有关于重写软件成功/失败率的实际案例研究?
我已经看到多篇关于应用程序重写的文章,这些都是不好的,人们在Programmers上的经历,以及Joel Spolsky编写的关于该主题的文章,但没有确凿的证据或案例研究。除了Joel给出的两个示例以及此处的其他一些帖子外,您如何处理不好的代码库,以及如何根据实际研究决定如何处理它? 就目前的情况而言,我知道有两个客户端都具有旧的遗留代码。他们一直之以鼻,因为正如其中之一发现的那样,重写是一场灾难,这很昂贵,而且实际上并不能有效地改善代码。随着重写者迅速发现,该客户具有一些非常复杂的业务逻辑。 在这两种情况下,这些都是关键任务应用程序,可为公司带来大量收入。试图重写的人认为,如果将来某个时候不对旧版软件进行升级,它们将陷入困境。对我来说,这种风险需要进行研究和分析,以确保成功的道路。 是否有实际的案例研究对此进行了调查?我不希望尝试大量重写,而无需根据实际研究了解一些最佳实践,陷阱和成功。 后果: 好的,经过更多搜索,我确实找到了三篇有关案例研究的有趣文章: 重写或重用。他们对转换为Java的Cobol应用程序进行了研究。 另一个是关于软件重用:开发人员的经验和看法。 重用或重写关于维护与重写成本的另一项研究。 我最近找到了另一篇有关该主题的文章:The Great Rewrite。在那儿,作者似乎遇到了一些主要问题。随之而来的是通过使用建议的新技术堆栈并测量开发人员将其拿起的速度来进行原型制作的想法。这全都是重写的序幕,我认为这是个好主意!

16
您有自己的“杂项工具”库吗?您最为哪一部分感到骄傲?[关闭]
我知道我们许多人使用经常使用的工具和实用程序来维护自己的小型个人图书馆。 我从16岁起就拥有我的,所以它的规模已经发展到相当可观的水平。此后,我写的一些内容已添加到框架中。我在LINQ之前就编写了自己的表达树的小实现,用于遗传算法,这在当时我很喜欢,并为此感到自豪-当然,现在它已经毫无用处了。但是最近我一直在研究它并升级到.NET 4.0,并重新引起了人们的兴趣。 所以我很好奇您使用库的目的。也许我们可以得到一些有用的小片段的好主意,并在我们自己之间分享。 所以我的问题是: 您是否有其他实用程序库? 您最为哪一部分感到自豪,为什么? 如果您愿意,请提供代码示例 :-)

12
将您在工作中生成的代码重新用于个人项目是错误的吗?
在我的各种工作场所中,我总是写代码,这使我认为“在其他情况下这将非常有用”。的确,即使我花了更长的时间写代码,我还是故意写的,我知道这会在将来对我有所帮助(例如自定义SubString()函数)。这些摘录的一个不错的选择是各种“助手”类。 我确定这些片段可能会在网上其他地方找到,但重点是,我写了它们,以后将在其他工作或个人项目中再次使用它们。目前,我没有维护个人代码库,但问题是,将您在工作中产生的代码用于(a)用于个人项目,(b)用于其他工作是否是错误的?

7
软件重用是否会妨碍流程的可重复性
代码重用成为问题 我一直在思考有关软件交付的问题,并且我一直回到可重复性和/或可再现性的问题。它们很重要,因为如果您不重复一个项目,那么改善用于构建项目的流程就变得更加困难。工程涉及不断改进与设计和施工有关的过程,以产生更高质量的项目。 由于其数字形式,软件可能严重依赖于重用。无需重写模块,我们只需再次调用它或将其复制到另一个系统即可。一些示例是身份验证/登录或登录功能。这些类别有许多众所周知的示例,并且传统的智慧是重用现有内容而不是自己动手做。 与其他学科的一些比较 施工 相反,物理系统(建筑物,桥梁)的构建远没有可重用的范围。确实,房屋的蓝图可以重复使用多次以建造房屋的相同副本,但是必须每次都执行建造。剪切和粘贴在模拟世界中不像以前那样工作。桥梁的蓝图比房屋的可重复使用性差,因为场地条件会有所不同。 大师级建筑商是公认的专家,他们在他们所在的地区设计和/或建造了数十,数百或数千个事物。例如,世界著名的建筑师兼设计师Frank Lloyd Wrightdesigned more than 1,000 structures and completed 532 works。与设计了“仅”五种语言(Turbo Pascal,Delphi,J ++,C#,Typescript)的Anders Hejlsberg形成对比。在很多方面,这是不公平的比较,因为域是不同的。但是从广义上讲,两个非常有才华的人的可量化生产差异很大。 武术 武术家会说,对动作的精通仅来自数千次重复。在完成大部分重复之后,许多武术家对于以前被认为是复杂的kata或形式变得如此简单感到惊讶。这些学生的讲师还将注意到运动如何变得更加流畅和有目的性,以及运动的经济性。同样,与没有经验的学生相比,经验丰富的武术家能够更快地拾起更复杂的kata。重复的经验为他们提供了一个框架或过程,使他们可以更快地学习。 木工 木工经历了类似的转变。业余爱好者木工总是回想起他们的第一个需要大量抽屉的项目。如果他们完成了该项目,他们将对装配线产生的效率重新获得赞赏。还有其他好处,例如更好地了解如何在单张纸料上放置抽屉部件,以最大程度地利用木材。与业余爱好者相比,专业的木工可以更快地设计,开始和建造他们以前多次制作的物品。他们还具有查看他人设计中固有错误的能力,而这些错误是他们工作中的错误。 那么,软件重用会阻止软件开发人员变得更加熟练吗? 在许多方面,软件设计和构建始终是新的。我们不会重复过去的工作,因为如果我们可以重用模块,库或系统,那么我们会做。在从头开始重写整个内容之前,我们将优先扩展现有系统。但是重复是使我们能够发现设计和构造效率的原因。任何进行过体育锻炼或体育锻炼的人都会告诉你,重复锻炼是成为一名优秀练习者的关键。 我的问题:软件的重用能力是否会阻止重复项目带来必要的流程改进和效率?

9
增加复杂性以删除重复的代码
我有几个类都从通用基类继承。基类包含一些类型为的对象的集合T。 每个子类都需要能够从对象集合中计算插值,但是由于子类使用不同的类型,因此每个类之间的计算差异很小。 到目前为止,我已经在每个类之间复制/粘贴了我的代码,并对每个代码进行了较小的修改。但是现在我试图删除重复的代码,并在我的基类中将其替换为一种通用插值方法。但是,事实证明这非常困难,而且我所想到的所有解决方案似乎都太复杂了。 我开始认为DRY原则在这种情况下不太适用,但这听起来像是亵渎神灵。尝试删除代码重复时有多少复杂性? 编辑: 我能想到的最好的解决方案是这样的: 基类: protected T GetInterpolated(int frame) { var index = SortedFrames.BinarySearch(frame); if (index >= 0) return Data[index]; index = ~index; if (index == 0) return Data[index]; if (index >= Data.Count) return Data[Data.Count - 1]; return GetInterpolatedItem(frame, Data[index - 1], Data[index]); } protected abstract T GetInterpolatedItem(int …

6
在其他客户项目中重用代码是否合法?
我正在作为移动应用程序的独立软件开发人员。客户要求我开发一个移动应用程序。因此,目前我正在计算为该项目撰写报价的时间和精力。 该应用程序本身仅会使用一定的时间,因为它与某个事件相关,在此之后将毫无用处。但是,该应用程序的基本功能对于希望为其活动使用类似应用程序的其他客户可以重用。 目前,我想知道是否可以为客户开发应用程序,让他为其他客户的应用程序开发并重用部分源代码吗? 那么,应对这种情况的最佳方式是什么? 该应用程序的源代码属于谁? 当客户为开发付费时,我是否必须将源代码提供给客户? 如果需要,是否仍可以保留它的副本并在以后重用? 我是否必须要求客户重用代码? 我是否需要在这里使用某种许可模型。并且让第一个客户只支付开发的一部分,以便我可以重用代码而无需担心吗? 我希望我能阐明我的情况。我期待着您的答案。
22 legal  code-reuse 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.