Questions tagged «clean-code»

术语“干净的代码”用于描述简洁,易于理解并清楚表达程序员意图的计算机编程代码。带有此标签的问题与编写干净代码或将旧的“脏”代码重构为干净代码的过程有关。

16
我的老板要求我停止编写小的函数,并在同一循环中完成所有操作
我已经读过罗伯特·C·马丁(Robert C. Martin)的一本名为《清洁代码》的书。在本书中,我看到了许多清理代码的方法,例如编写小的函数,仔细选择名称等。这似乎是迄今为止我所读过的最有趣的有关干净代码的书。但是,今天我的老板不喜欢我看完本书后写代码的方式。 他的论据是 编写小函数很痛苦,因为它迫使您进入每个小函数以查看代码在做什么。 即使主循环超过300行,也可以将所有内容放入主大循环中,以使其读取速度更快。 仅在必须复制代码时编写小型函数。 不要使用注释名称编写函数,而是将复杂的代码行(3-4行)放在注释上方;同样,您可以直接修改失败的代码 这与我读过的所有内容背道而驰。您通常如何编写代码?一个主要的大循环,没有小的功能? 我使用的语言主要是Javascript。由于我删除了所有小的明确命名的函数并将所有内容放入一个大循环中,因此我现在真的很难阅读。但是,我的老板喜欢这种方式。 一个例子是: // The way I would write it if (isApplicationInProduction(headers)) { phoneNumber = headers.resourceId; } else { phoneNumber = DEV_PHONE_NUMBER; } function isApplicationInProduction(headers) { return _.has(headers, 'resourceId'); } // The way he would write it // Take the right resourceId …

23
编写科学代码时干净编程
我不是真的写大型项目。我不是在维护庞大的数据库,也不是在处理数百万行代码。 我的代码主要是“脚本”类型的东西-测试数学功能或模拟某些东西的东西-“科学编程”。到目前为止,我从事的最长程序是几百行代码,而我从事的大多数程序都在150左右。 我的代码也很烂。前几天,当我试图找到我之前写的一个文件时,我意识到了这一点,但是我可能改写了,并且我没有使用版本控制,这可能使大量的您对我的愚蠢感到痛苦。 我的代码风格令人费解,并填充了过时的注释,这些注释指出了执行某项操作的替代方法或复制了几行代码。尽管变量名总是以非常好的描述性开始,但是当我按照某人想要测试的新内容进行添加或更改时,代码却被覆盖在顶部并被覆盖,因为我觉得这件事应该立即进行测试。有一个框架,我开始使用糟糕的变量名,并且文件进入了pot。 在我现在正在从事的项目中,我正处在所有这些阶段都重新吸引我的阶段。但是问题是(除了使用版本控制,以及为每个新迭代创建一个新文件并将其全部记录在某个地方的文本文件中,这可能会极大地改善这种情况)我真的不知道如何进行改进我实际的编码风格。 编写较小的代码是否需要单元测试?OOP怎么样?相对于处理较大的项目,什么样的方法适合在进行“科学编程”时快速编写优质,清晰的代码? 我之所以问这些问题,是因为编程本身通常并不复杂。它更多地是关于我正在通过编程测试或研究的数学或科学。例如,当两个变量和一个函数可能需要处理时,是否需要一个类?(考虑到一般情况下,程序的速度也应优先考虑更快的情况-当您运行25,000,000+个仿真时间步长时,您一定会希望它是这样。) 也许范围太广了,如果是的话,我对此表示歉意,但是从编程书籍的角度来看,它们似乎经常在大型项目中得到解决。我的代码不需要 OOP,而且已经很短了,所以它不像“哦,但是如果这样做的话,文件将减少一千行!” 我想知道如何在这些较小,更快的项目上“重新开始”并进行干净的编程。 我很乐意提供更多具体细节,但是我认为建议越笼统,就越有用。我正在用Python 3编程。 有人建议重复。让我明确地说,我并不是在谈论完全忽略标准编程标准。显然,存在这些标准是有原因的。但是,另一方面,如果可以完成一些标准的工作,写出说OOP的代码真的有意义吗?程序? 有例外。此外,除了简单的标准外,可能还有科学编程的标准。我也在问那些。这与编写科学代码时是否应忽略常规编码标准无关,而与编写干净的科学代码有关! 更新资料 只是以为我会添加“不超过一个星期以后”的更新。您的所有建议都非常有帮助。我现在使用版本控制-git,其中git kraken用于图形界面。它非常易于使用,并且彻底清理了我的文件-不再需要保留旧文件,也不再需要旧版本的代码“以防万一”。 我还安装了pylint并在所有代码上运行了它。最初,一个文件的分数为负。我什至不知道那怎么可能。我的主文件开始于〜1.83 / 10,现在为〜9.1 / 10。现在,所有代码都非常符合标准。我还用自己的眼睛跑过去,更新了已经消失的变量名,嗯,很糟糕,正在寻找要重构的部分。 特别是,我在这个网站上最近问了一个有关重构我的主要功能的问题,它现在更加整洁和短了很多:它不再是一个冗长,肿的if / else填充功能,现在不到一半的大小,更容易弄清楚发生了什么。 我的下一步是实施各种“单元测试”。我的意思是一个可以在主文件上运行的文件,该文件使用assert语句和try / excepts来查看其中的所有功能,这可能不是最好的方法,并且会导致重复的代码很多,但我会继续阅读并尝试找出如何做得更好。 我还对我已经编写的文档进行了重大更新,并向github存储库添加了补充文件,例如excel电子表格,文档和相关论文。现在看起来有点像一个真正的编程项目。 所以...我想这就是要说的:谢谢。

10
为什么“清洁代码”建议避免使用受保护的变量?
干净代码建议在“格式”一章的“垂直距离”部分中避免使用受保护的变量: 紧密相关的概念应在垂直方向上彼此靠近。显然,此规则不适用于属于单独文件的概念。但是,除非您有充分的理由,否则不应将紧密相关的概念分成不同的文件。确实,这是应避免使用受保护变量的原因之一。 这是什么原因?

17
我怎么知道我的方法应该是可重用的?[关闭]
我在家照顾自己的生意,妻子来找我说 亲爱的..您可以在控制台中打印2018年全球所有的日光节约时间吗?我需要检查一下。 我非常高兴,因为那是我一直在等待一生的Java经验,并提出了: import java.time.*; import java.util.Set; class App { void dayLightSavings() { final Set<String> availableZoneIds = ZoneId.getAvailableZoneIds(); availableZoneIds.forEach( zoneId -> { LocalDateTime dateTime = LocalDateTime.of( LocalDate.of(2018, 1, 1), LocalTime.of(0, 0, 0) ); ZonedDateTime now = ZonedDateTime.of(dateTime, ZoneId.of(zoneId)); while (2018 == now.getYear()) { int hour = now.getHour(); now = now.plusHours(1); …

20
您如何安全地删除看起来从未输入过的一段代码?
您已经找到了一些看起来多余的代码,而编译器没有注意到这一点。您要做什么以确保(或尽可能接近地确保)删除此代码不会导致回归。 想到两个主意。 根据代码是否看起来应该执行来“简单地”使用推论。但是,有时这可能是一项复杂,耗时的工作,并且风险很小(您的评估容易出错),并且没有实质性的业务回报。 将日志记录在该代码部分中,并查看实际输入的频率。执行完足够的代码后,您应该有足够的信心删除代码是安全的。 是否有更好的主意或类似的规范方法?
125 clean-code 

16
我应该删除未引用的代码吗?
我正在研究中等大小(10万行)的代码库,它们都是相对较新的代码(不到一年),并且具有良好的单元测试覆盖率。 我不断遇到的方法要么不再在任何地方使用,要么仅在仅测试特定方法的单元测试中引用。 如果确定不再需要此代码,是否应该删除它? 删除它的原因: 更少的代码,更少的错误 更少的代码更易于他人消化 它仍在源代码控制下 保留它的原因: 可以作为参考 有时可能有用 它可能被编写为“完善”类的功能

13
您如何通过遵循干净的代码实践来证明编写更多代码是合理的?
主持人笔记 这个问题已经有十七个答案。在发布新答案之前,请阅读现有答案,并确保您的观点尚未得到适当覆盖。 我一直遵循罗伯特·马丁(Robert Martin)的“清洁代码”书中推荐的一些做法,尤其是那些适用于我使用的软件类型的做法以及对我有意义的做法(我不遵循它作为教条) 。 但是,我注意到的一个副作用是,我编写的“干净”代码比没有遵循某些实践的代码要多。导致这种情况的具体做法是: 封装条件 所以代替 if(contact.email != null && contact.emails.contains('@') 我可以写一个像这样的小方法 private Boolean isEmailValid(String email){...} 用另一个私有方法替换内联注释,以便方法名称描述自身,而不是在其顶部添加内联注释 一堂课只有一个改变的理由 还有其他一些。关键是,可能是30行的方法最终成为一个类,这是因为微小的方法可以替换注释并封装条件等。当您意识到自己有这么多的方法时,它对将所有功能都放在一个类中,实际上它本来应该是一种方法。 我知道任何极端的做法都是有害的。 我正在寻找答案的具体问题是: 这是编写干净代码的可接受的副产品吗?如果是这样,我可以使用哪些论据来证明已编写了更多LOC这一事实呢? 该组织并不特别在意更多的LOC,但是更多的LOC可能会导致非常大的类(同样,为了便于阅读,可以用长方法代替一堆只使用一次的辅助函数)。 当您看到一个足够大的课程时,它给人的印象是该课程很忙,并且其职责已经结束。因此,您最终可能会创建更多的类来实现其他功能。结果就是很多类,都借助于许多小的辅助方法来“做一件事”。 这是特定的关注点……这些类可以是一个单一的类,仍然可以实现“一件事”,而无需许多小方法的帮助。它可能是单个类,可能带有3或4个方法以及一些注释。

14
简洁在什么时候不再是一种美德?
最近的错误修复要求我检查其他团队成员编写的代码,在这里发现了这一点(它是C#): return (decimal)CostIn > 0 && CostOut > 0 ? (((decimal)CostOut - (decimal)CostIn) / (decimal)CostOut) * 100 : 0; 现在,有充分的理由进行所有这些强制转换,这仍然很难遵循。计算中有一个小错误,我不得不解开它以解决问题。 我从代码审查中知道了此人的编码风格,他的方法是较短的总是更好。当然,这里还有价值:我们都已经看到了不必要的复杂的条件逻辑链,这些逻辑可以与一些位置合理的运算符一起整理。但是他显然比我更擅长追随运营商,他们陷入了一个单一的问题。 当然,这最终是样式问题。但是,是否有任何关于识别代码简洁性不再有用并成为理解障碍的观点的写作或研究? 进行强制转换的原因是实体框架。数据库需要将它们存储为可空类型。小数?不等同于C#中的Decimal,需要进行强制转换。

9
为什么要使用依赖注入?
我很难找到有关为什么应该使用依赖项注入的资源。我看到的大多数资源都说明它只是将一个对象的实例传递给另一个对象的实例,但是为什么呢?这是仅用于更干净的体系结构/代码,还是会整体上影响性能? 为什么要执行以下操作? class Profile { public function deactivateProfile(Setting $setting) { $setting->isActive = false; } } 而不是以下? class Profile { public function deactivateProfile() { $setting = new Setting(); $setting->isActive = false; } }

9
干净的代码注释与类文档
我正在与新同事讨论有关评论的问题。我们俩都喜欢Clean Code,并且我完全可以避免内联代码注释,并且应该使用类和方法名称来表示它们的作用,这一点我完全满意。 但是,我非常喜欢添加小类摘要,以尝试解释类的目的和实际代表的内容,主要是为了使其易于维护单一职责原则模式。我也习惯在方法中添加单行摘要,以说明该方法应该执行的操作。一个典型的例子是简单的方法 public Product GetById(int productId) {...} 我添加以下方法摘要 /// <summary> /// Retrieves a product by its id, returns null if no product was found. /// </summary 我认为应该记录该方法返回null的事实。想要调用方法的开发人员不必打开我的代码即可查看该方法是否返回null或引发异常。有时它是接口的一部分,因此开发人员甚至都不知道正在运行哪个基础代码? 但是,我的同事认为,这类注释是“ 代码异味 ”,“注释始终是失败的”(Robert C. Martin)。 有没有一种方法可以表达和交流这些类型的知识而无需添加评论?由于我是Robert C. Martin的忠实粉丝,所以我有点困惑。摘要与注释相同,因此总是失败吗? 这不是有关在线注释的问题。

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

12
防止在截止日期后编译不赞成使用的代码[关闭]
在我的团队中,我们已经在一个大型整体项目中清理了很多旧东西(整个类,方法等)。 在执行这些清理任务时,我想知道是否存在比平时更好的注释或库@Deprecated。@FancyDeprecated如果您在特定日期过去之后仍未清除旧的未使用的代码,则这将阻止项目的构建成功。 我一直在Internet上搜索,但找不到具有以下功能的任何东西: 应该是注释或类似内容,以便在特定日期之前放入要删除的代码中 在此日期之前,代码将被编译,并且一切将正常运行 在此日期之后,代码将无法编译,并且会向您显示一条消息,警告您有关该问题的信息 我想我正在寻找一个独角兽...任何程序语言都有类似的技术吗? 作为一个计划,BI正在考虑通过对打算删除的代码进行一些单元测试来制造魔术的可能性,这些测试在“最后期限”开始失败。你怎么看待这件事?有更好的主意吗?

8
命名问题:“ Isomething”是否应重命名为“ Something”?[关闭]
Bob叔叔在“ 干净代码”中有关名称的章节中建议您避免使用名称编码,主要是关于匈牙利表示法。他还特别提到I从接口中删除前缀,但没有显示此示例。 让我们假设以下内容: 接口的使用主要是通过依赖注入实现可测试性 在许多情况下,这导致与单个实施者具有单个接口 因此,例如,这两个应命名为什么?Parser和ConcreteParser?Parser和ParserImplementation? public interface IParser { string Parse(string content); string Parse(FileInfo path); } public class Parser : IParser { // Implementations } 还是在这样的单一实现案例中忽略该建议?

5
为什么CSS和SVG可以接受大量的幻数?
很多时候,我看到了热网的问题列表像问题这个,基本上问“我怎么画这个任意形状的CSS”。答案总是是几个CSS或SVG数据块,它们带有一堆看似随机的硬编码值,这些值构成了所需的形状。 当我看着这个时,我会想:“好极了!多么丑陋的代码块。我希望我在项目中再也不会看到这种类型的东西。但是,我经常看到这类问答,并且投票数很高,因此很明显,社区并不认为这很糟糕。 但是为什么可以接受呢?从我的后端经验来看,这对我来说毫无意义。那么为什么CSS / SVG可以呢?

4
如果可以提高代码的清晰度,那么调用一个没有效果的函数是否更好?
我的程序(iOS应用程序)中有三个视图。它们中只有一个同时处于活动状态,因此我关闭了其中两个的可见性,并在用户按下按钮时切换可见性。视图被初始化为可见,因此我在显示主视图之前在代码中设置了可见性。 我可以 [view1 setAlpha:0.0f]; [view2 setAlpha:0.0f]; 对于其中两个视图,但现在未解决第三个视图(应在应用程序开始时显示的视图)。我把 [view3 setAlpha:1.0f]; 在前两个视图之后,因为我认为这很清楚,实际上存在三个视图,而不是看到代码时可​​能会想到的两个视图。其他程序员如何做到这一点?纯粹是偏爱还是有一些约定? 如果调用非常繁琐,那么最好不要在不需要时调用它,但是我想知道像我的示例这样的小事情。

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.