Questions tagged «code-quality»

有关编写高质量代码的最佳做法的问题。

19
您如何知道您是否编写了可读且易于维护的代码?
如何知道一个人创建的代码是否易于阅读,理解和维护?当然,从作者的角度来看,该代码具有可读性和可维护性,因为从一开始,作者就对其进行了编写和编辑。但是,必须有一个客观且可量化的标准,我们的行业可以据此衡量代码。 如果在没有原始作者的专业建议的情况下对代码执行以下操作,则可以达到这些目标: 可以阅读代码并从根本上理解逻辑流程。 可以更深入地了解代码在做什么以包括输入,输出和算法。 其他开发人员可以对原始代码进行有意义的更改,例如错误修复或重构。 可以编写新代码,例如利用原始代码的类或模块。 我们如何量化或衡量代码质量,使我们知道代码的可读性,可理解性和可维护性?

25
BIG何时重写答案?
刚读了有关“大改写”的问题,我就想起了一个我想自己回答的问题。 我有一个可怕的项目,传给我,是用Struts 1.0用旧Java编写的,表具有不一致的关系,或者根本没有关系,甚至没有主键的表也没有要用作主键的字段,但并不是唯一的。大部分应用程序都以某种方式“正常工作”。大多数页面被重用(复制粘贴的代码)并进行硬编码。曾经从事该项目的每个人都以一种或另一种形式诅咒它。 现在,我长期以来一直在考虑向高层管理人员建议对这个可怕的应用程序进行完全重写。我正在慢慢尝试个人时间,但我真的觉得这值得一些专门的资源来实现。阅读有关大型重写的文章后,我有了第二个想法。当我想说服上级支持我的重写时,这不是很好。(我在一家很小的公司工作,因此该提案有可能获得批准) TL; DR什么时候可以重写答案,您可以使用哪些参数来支持它?

7
在JavaScript中使用==是否有意义?
Douglas Crockford 在JavaScript中的Good Parts中写道: JavaScript有两套相等运算符:===和!==,以及它们的邪恶孪生子==和!=。优秀的产品以您期望的方式工作。如果两个操作数具有相同的类型并具有相同的值,则===产生true和!==产生false。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但是如果操作数是不同类型,则它们会试图强制值。他们所依据的规则是复杂而难忘的。这些是一些有趣的情况: '' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 …

21
我的代码大部分都存在主要的设计缺陷。完成还是现在修复?[关闭]
我是一名高中生,和我的一个朋友一起从事C#项目,他的技能与我差不多。到目前为止,我们已经在100次提交中编写了大约3,000行代码和250行测试代码。由于学校的原因,我推迟了几个月的项目,最近我又可以将其重新备份。 备份时,我了解到我编写的代码设计不良,例如在渲染器中包含过多线程,在模拟CPU,GPU和游戏卡带之间的交互中无法很好地防止竞争情况,以及仅仅是多余和令人困惑的代码。 问题是我什至没有完成程序的主要功能,所以我无法真正重构,因此我不鼓励继续完全意识到我的代码设计有缺陷。同时,我不想放弃该项目。已经取得了很大的进步,工作绝不能浪费。 我似乎有两种选择:通过解决不良的设计来简单地完成功能,然后在一切正常进行后进行重构,暂停一切并在完成其余功能之前努力解决一切,开始项目到处都是新鲜的东西,或者由于项目过大(基本上是“回到绘图板”)而彻底放弃该项目。 根据他人在此类项目中的经验,如何使自己重回正轨?根据该站点上的答案,普遍的共识是,通常不需要重写,但是如果不能在不付出过多成本的情况下维护代码,则可以使用重写。我确实很想继续这个项目,但是就目前而言,我的代码设计得不够好,无法继续进行下去,而沮丧的情绪使我无法继续进行下去。

30
编码时微优化重要吗?
最近,我问堆栈溢出问题,找出原因isset()函数比的strlen()快于PHP。这引发了关于可读代码的重要性以及是否值得考虑提高代码中微秒级性能的问题。 我父亲是一位退休的程序员,我给他看了答案。他绝对确定,即使是程序员,即使在微级别上也没有考虑其代码的性能,那么他们就不是优秀的程序员。 我不太确定-也许计算能力的提高意味着我们不再需要考虑这些微性能的改进?也许这种考虑取决于编写实际语言代码的人?(在上述情况下为PHP)。 环境因素可能很重要-互联网消耗了世界能源的10%。我想知道在数百万个网站上万亿次复制时,浪费几微秒的代码是多少? 我想最好根据有关编程的事实来了解答案。 编码时微优化重要吗? 我个人对25个答案的总结,谢谢大家。 有时我们确实需要担心微优化,但仅在极少数情况下才需要担心。在大多数情况下,可靠性和可读性更为重要。但是,不时考虑进行微优化并没有什么坏处。基本的理解可以帮助我们在编码时不要做出明显的错误选择,例如 if (expensiveFunction() || counter < X) 应该 if (counter < X || expensiveFunction()) (来自@ zidarsk8的示例)这可能是一个便宜的函数,因此更改代码将是微优化。但是,有了基本的了解,您就不必这样做了,因为您一开始就可以正确地编写它。

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

28
如何成为零缺陷程序员?[关闭]
我的老板总是告诉我,一个好的程序员应该能够确保他或她更改的代码是可靠,正确和彻底的自我验证的;您应该完全了解所有结果以及更改将导致的影响。我已经尽力成为这样的程序员-通过一次又一次的测试-但是错误仍然存​​在。 我如何才能成为一个零错误的程序员,并且知道我的代码的每个字符都会引起什么影响?
168 code-quality 

14
循环引用有什么问题?
我今天参加了一次编程讨论,在那儿我做了一些声明,这些声明基本上是不合逻辑地假定循环引用(在模块,类之间,无论如何)通常是不好的。一经讲完,我的同事就会问:“循环引用有什么问题?” 我对此有很强烈的感觉,但我很难简洁而具体地表达自己的观点。我可能提出的任何解释都倾向于依赖于我也考虑过公理的其他项目(“不能孤立使用,因此无法测试”,“参与对象中状态发生变化时的未知/不确定行为”,等等。 。),但是我很想听听一个简洁的原因,为什么循环引用很糟糕,却没有我自己的大脑所经历的那种信念飞跃,多年来花了很多时间来弄清它们的理解,修正,并扩展各种代码。 编辑:我不是在问同质的循环引用,就像那些在双链表或指向父母的指针。这个问题的确是在询问“更大范围”的循环引用,例如libA调用libB,后者又回调libA。如果愿意,可将“模块”替换为“库”。到目前为止,感谢您提供所有答案!

17
我如何说服管理层处理技术债务?
与开发人员一起工作时,我经常会问自己一个问题。到目前为止,我已经在四家公司工作,并且我意识到缺乏对保持代码干净和处理技术债务的关注,这些债务阻碍了软件应用程序的未来发展。例如,我工作的第一家公司是从头开始编写数据库,而不是使用MySQL之类的东西,并且在重构或扩展应用程序时给团队造成了麻烦。当经理讨论预测时,我一直试图与我的经理保持诚实和坦率,但是管理层似乎对修复已经存在的问题不感兴趣,并且看到它对团队士气的影响令人震惊。 您对解决此问题的最佳方法有何看法?我所看到的是人们收拾行装离开。然后,公司成为旋转门,开发人员进出,使代码变得更糟。您如何与管理层沟通,以使他们有兴趣解决技术债务?

19
如何更快地编码(不牺牲质量)
我从事专业编码器已有数年了。关于我的代码的注释通常是相同的:编写出色的代码,经过充分测试,但可能会更快。 那么,如何在不牺牲质量的前提下成为更快的编码器呢?出于这个问题的考虑,我将范围限制在C#中,因为这主要是我编写的代码(出于娱乐目的)或Java(在许多方面都足够类似)。 我已经在做的事情: 编写完成工作的最小解决方案 编写一系列自动化测试(防止回归) 为各种事物编写(和使用)可重用的库 在运作良好的地方使用众所周知的技术(例如,休眠) 在适合的位置使用设计模式(例如,Singleton) 这些都很不错,但是我觉得我的速度不会随着时间的推移而增加。我很在意,因为如果我能做些事情来提高生产率(甚至提高10%),那将比我的竞争对手快10%。(不是我有。) 除此之外,无论是小型Flash开发还是企业Java / C ++开发,我都从经理那里得到了回报。 编辑:关于我所说的快,以及我怎么知道我慢,似乎有很多问题。让我更详细地说明一下。 我曾在多家公司的中小型团队(5至50人)中从事各种项目和各种技术(Flash,ASP.NET,Java,C ++)的工作。我的经理们(他们直接告诉我)的观察结果是我“很慢”。 部分原因是因为我的许多同仁为追求速度而牺牲了质量。他们编写的代码有错误,难以阅读,难以维护,并且难以为其编写自动测试。我的代码通常具有良好的文档记录,可读性和可测试性。 在Oracle,我将始终以比其他团队成员慢的速度解决错误。我知道这一点,因为我会得到对此的评论;这意味着其他(是的,更高级和经验丰富的)开发人员可以以几乎相同的质量(可读性,可维护性和可测试性)在比我花费更少的时间内完成我的工作。 为什么?我想念什么?我如何才能更好地做到这一点? 我的最终目标很简单:如果我今天能在40个小时内制造出产品X,并且我能以某种方式提高自己,以便明天20、30甚至38个小时就可以制造出相同的产品,那就是我想知道的-我如何到达那里?我可以使用什么过程来持续改进?我以为这与重用代码有关,但这似乎还不够。

10
关于发展深厚的编程知识
有时,我会看到有关堆栈溢出的边缘情况和其他怪异的问题,这些问题很容易被Jon Skeet和Eric Lippert之类的人回答,这显示出对该语言及其许多复杂性 的深入了解,例如: 您可能会认为,要使用foreach循环,要迭代的集合必须实现IEnumerable或IEnumerable<T>。但是事实证明,这实际上不是必需的。所要求的是,集合的类型必须具有称为的公共方法GetEnumerator,并且必须返回具有称为的公共属性getter Current和MoveNext返回a 的公共方法的某种类型bool。如果编译器可以确定满足所有这些要求,则将生成代码以使用那些方法。仅当不满足这些要求时,我们才会检查对象是否实现IEnumerable或IEnumerable<T>。 这是很酷的事情。我能理解为什么埃里克知道这一点。他在编译器团队中,所以他必须知道。但是那些表现出如此深厚的知识而不是内部人的人呢? 凡人(不是C#编译器团队成员)如何找到类似这样的东西? 具体来说,这些人是否使用方法来系统地扎根此类知识,对其进行探索并对其进行内部化(使其自己拥有)?
136 code-quality 

16
在审查过程中,我该如何在技巧上建议改进其他人设计不良的代码?
我是干净代码和代码技巧的忠实拥护者,尽管我目前从事的工作不被视为重中之重。我有时会发现自己的处境是,同位人的代码充满混乱的设计,并且很少担心将来的维护,尽管它功能正常且几乎没有bug。 当您认为需要进行大量更改并且有最后期限时,您将如何在代码审查中提出改进建议?请记住,建议在截止日期之后进行改进可能意味着,随着新功能和错误修复的到来,它们将被完全取消优先级。

8
递归或while循环
我正在阅读一些开发面试的实践,特别是面试中提出的技术问题和测试,我对这种类型的说法误解了很多次:“好的,您可以用while循环解决问题,现在可以递归”或“每个人都可以用100行while循环解决此问题,但是他们可以用5行递归函数来实现吗?” 等等 我的问题是,递归是否通常比if / while / for构造好? 老实说,我一直认为递归不是首选,因为它仅限于比堆小得多的堆栈内存,而且从性能的角度来看,执行大量的函数/方法调用也不理想。是错的...

16
我是否应该现在添加冗余代码,以防将来可能需要?
对与错,我目前认为我应该始终尝试使我的代码尽可能地健壮,即使这意味着添加我知道现在将无用的冗余代码/检查,但是它们可能是下线的x年。 例如,我目前正在开发具有以下代码的移动应用程序: public static CalendarRow AssignAppointmentToRow(Appointment app, List<CalendarRow> rows) { //1. Is rows equal to null? - This will be the case if this is the first appointment. if (rows == null) { rows = new List<CalendarRow> (); } //2. Is rows empty? - This will be the case if …

14
没有SCM的情况下如何保持代码质量?
我在政府机构工作。这里使用的技术和开发软件的方法已经过时了。 它们具有大量的存储空间,但没有合适的空间来保留和维护用于自动化此处大部分工作的应用程序。 该机构不允许我使用SCM软件(例如GIT或SVN)。 保持代码质量并稍后能够在应用程序中添加新功能的最佳方法是什么? 如何记起对代码所做的更改而又不破坏代码? 编辑:我忘了提及,它们为每台计算机都有网络驱动器,并且这些网络驱动器会以某种方式定期进行备份或保存备份。但是,如果我不创建自己的计划以保存工作并能够在不破坏现有代码的情况下添加新功能,那么与SCM解决方案相比就没有太大的优势。 编辑:由于许多人建议使用便携式Git,所以我必须添加更多信息。我尝试安装Visual SVN服务器,但失败了,因为我没有安装管理员权限。我也尝试下载常规的Git Shell,但是防火墙或网络设置不允许我访问Git下载页面。我什至尝试过,将便携式Git发送到我的Gmail电子邮件中。Google检测到了软件包中的exe文件,也不允许我在工作计算机上下载可移植的Git版本。我还要提到的另一件事是,应用于机构内部计算机的网络策略不允许使用USB存储设备。您可以使用USB端口为智能手机充电或为小扬声器等小工具供电。也有人说过,有些计算机甚至不允许上网。
110 git  code-quality  svn  scm 

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.