Questions tagged «code-quality»

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

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

11
在处理极其糟糕的代码时,如何保持生产力?
我没有在软件行业工作的经验,没有自学成才的经验,并且在决定工作之前参加过开源。现在,我为钱而工作,我还必须处理一些不愉快的事情,这当然是正常的。 最近,我被分配将日志记录添加到一个大型SharePoint项目中,该项目是由一些显然正在学习编写工作代码的程序员编写的。经过2年的合作,客户转到了我们公司,但是造成了损害,现在我需要以某种方式维护此代码。 并不是说代码太难读。尽管存在问题-每个项目都有一个类,其中包含几种复制粘贴的方法,大量的if嵌套,匈牙利语的系统,未处理的连接-但它仍然可读。 但是,尽管进行诸如添加日志记录之类的简单操作,但我发现自己绝对没有生产力。基本上,我只需要逐步完成代码并添加一些跟踪调用。但是,代码的愚蠢到令人讨厌,以至于在开始的10分钟之内我就感到疲倦。最初,我曾经添加using结构,通过反转来减少嵌套if,将变量重命名为可读的名称,但是该项目很大,最终我放弃了。我知道这不是我应该做的任务,但是至少减少混乱使我获得了某种心理上的回报,所以我可以继续前进。现在,这个技巧停止了工作,我还有60%的工作要做。 我下班后开始头痛,而且不再有以前的满足感,通常这使我可以连续10个小时编写代码,但仍然感到新鲜。 这不仅是一个大麻烦,因为我确实有一个实际的问题: 有没有办法保持生产力而不与风车战斗? 是否有某种心理把戏保持专注的任务,而不是想着“如何愚蠢的是那个?”每次我在以前的程序员看到另外一个巧招时间?添加日志记录的问题在于,我实际上必须了解代码的作用,而这样做却以令人不快的方式伤害了我的大脑。

10
是否存在过多的私有功能/方法?
我了解文件齐全的代码的重要性。但是我也了解自我记录代码的重要性。直观地读取特定功能越容易,我们在软件维护期间就可以进行得越快。 话虽如此,我喜欢将大型功能分离为其他较小的功能。但是我这样做的程度是,一个班级最多可以有五个班级,以服务于一种公共方法。现在将五个私有方法乘以五个公共方法,您会得到大约二十五个隐藏方法,这些隐藏方法可能只会被那些公共方法调用一次。 当然,现在可以更轻松地阅读这些公共方法,但是我不禁认为,拥有太多函数是不明智的做法。 [编辑] 人们一直在问我为什么认为过多的功能是不好的做法。 简单的答案:这是一种直觉。 我的信念一点都没有任何小时的软件工程经验作为后盾。只是不确定性给了我一个“作家的障碍”,但对于程序员而言。 过去,我只编写个人项目。就在最近,我开始进行基于团队的项目。现在,我想确保其他人可以阅读和理解我的代码。 我不确定会提高可读性。一方面,我正在考虑将一个较大的功能分成名称可理解的其他较小的功能。但是我还有另一面说这是多余的。 因此,我要对此进行启发以选择正确的路径。 [编辑] 下面,我包括我怎么两个版本可以解决我的问题。第一个解决方案是不分离大块代码。第二个做不同的东西。 第一版: public static int Main() { // Displays the menu. Console.WriteLine("Pick your option"); Console.Writeline("[1] Input and display a polynomial"); Console.WriteLine("[2] Add two polynomials"); Console.WriteLine("[3] Subtract two polynomials"); Console.WriteLine("[4] Differentiate two polynomials"); Console.WriteLine("[0] Quit"); } 第二版: public static int …

12
我应该重用变量吗?
我应该重用变量吗? 我知道许多最佳实践表明您不应该这样做,但是,稍后,当不同的开发人员调试代码并具有3个看起来相似的变量时,唯一的区别是它们是在代码中的不同位置创建的,困惑。单元测试就是一个很好的例子。 但是,我确实知道,最佳实践通常都是反对的。例如,他们说不要“覆盖”方法参数。 最佳做法甚至是反对使以前的变量为空(在Java中,Sonar会在您分配null给变量时发出警告,因为Java 6不需要调用它来调用垃圾回收器。您无法始终控制哪些警告已关闭;大多数情况下默认设置为开启。)

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

10
在什么情况下,更少的代码更好?[关闭]
我最近在工作中重构了一些代码,并且我认为自己做得很好。我将980行代码减少到450行,并将类数量减半。 当向我的同事展示时,有些人不同意这是一种进步。 他们说-“更少的代码行不一定更好” 我可以看到,在某些极端情况下,人们会写很长的行和/或将所有内容放在一个方法中以节省几行,但这不是我要做的。在我看来,由于代码只有一半大小,因此其结构合理且易于理解/维护。 我正在努力地弄清楚为什么有人希望将完成工作所需的代码加倍,而且我想知道是否有人会觉得与我的同事一样,并且可以提出一些理由,使事半功倍?

9
代码一致性和代码改进之间的正确平衡是什么?
最近,我与一位同事讨论了代码风格。他在争辩说,您对API的使用以及所使用的一般模式应与周围的代码尽可能地相似,如果与整个代码库无关,则应与代码外观(括号位置,大写字母等)相同。 。例如,如果我要在C#中将方法添加到DAO类中,那么即使该类中的其他任何方法都没有使用LINQ,我也会尝试在适当的地方使用LINQ来帮助使我的代码干净并易于维护。但是,我的同事会争辩说我不应该在这种情况下使用它,因为它会违背该类的现有风格,因此更难以理解。 起初我发现他的立场相当极端,但是经过一会儿的思考,我开始明白他的观点。在假设的LINQ示例中,也许该类不包含它,因为我的同事们不熟悉LINQ?如果是这样的话,如果我不使用我的代码,对我的开发人员来说,它的代码维护起来会更好吗?另一方面,如果我真的相信使用这种技术可以使代码更简洁,那么即使它与周围的代码有很大的不同,我也不应该使用它吗? 我认为,我同事观点的症结在于,如果我们都打算以不同的方式在代码库中实现相似的功能,而我们每个人都认为我们的方式是“最佳”的,那么最终整个代码将变得更加困难了解。但是此刻,我仍然认为,如果我们盲目地遵循现有代码,那么质量将随着时间的流逝而缓慢恶化。 那么,模式在何种程度上成为代码风格的一部分,我们应该在保持一致性和进行改进之间划清界限吗?

12
如何退后一步,以崭新的眼光看代码?[关闭]
去年,我以一个人的团队工作,开发了一个富客户端应用程序(价值35,000多个LoC)。目前处于稳定状态并已投入生产。但是,我知道我的技能在项目开始之初就生锈了,因此毫无疑问,代码中存在重大问题。在这一点上,大多数问题都在架构,结构和交互方面-容易的问题,甚至是架构/设计问题,已经被淘汰。 不幸的是,我在这个项目上花费了很多时间,以至于我难以思考它之外的问题-从一个新的角度来处理它,以查看深层掩盖或固有于设计中的缺陷。 我该如何超越自己的头脑和代码范围,以使外观焕然一新并变得更好?

7
我们进行版本控制的方式有问题吗?
我和一个程序员团队一起担任业务分析师。我们刚刚发布了该产品的2.0版,并且正在开发3个月内发布的下一个版本(这是内部软件产品)。不幸的是,版本2.0存在一些必须修复的问题,我们将在几周内部署这些修复程序。问题在于,我们也不想部署仍在进行中且计划在未来3个月内不发布的更改。 程序员认为管理此问题的方法是仅检入缺陷代码,而新增强功能的代码将保留在开发人员的本地计算机上,直到完成。我将不得不从他们的机器上获取本地版本进行测试,因为如果他们签入代码,并且我们必须推出另一个补丁来修复缺陷,我们现在还不希望包括这些增强功能。还有一个问题,即同一代码文件同时包含缺陷修复程序和增强功能,因此他们必须在本地复制该代码文件,然后进行更改以修复错误并检查其中的一个错误,然后通过采用以下方法继续进行增强功能:他们制作的本地副本。 似乎很令人费解-是否有更好的方法来处理这种情况?我们正在使用Team Foundation Server和Visual Studio 2010。

12
如果您的单元测试代码“闻起来”真的有关系吗?
通常,我只是使用复制和粘贴以及所有其他不良做法将单元测试放在一起。单元测试通常看起来很难看,充满了“代码味道”,但这真的重要吗?只要“真实”代码是“良好”,我总是告诉自己,这很重要。另外,单元测试通常需要诸如存根函数之类的各种“臭味”。 我应该如何应对设计不佳(“臭”)的单元测试?

10
什么时候“适当的”编程不再重要?
我在业余时间一直在开发一款Android游戏。它使用的是libgdx库,因此为我完成了很多繁重的工作。 在开发过程中,我不小心为某些过程选择了数据类型。我使用哈希表是因为我想要一些接近关联数组的东西。可读键值。在其他地方要实现类似的目的,我使用向量。我知道libgdx具有vector2和vector3类,但是我从未使用过它们。 当我遇到奇怪的问题并在Stack Overflow上寻求帮助时,我看到很多人只是在技术上“合适”另一个问题时就对使用某种数据类型的问题进行了讨论。就像使用ArrayList一样,因为它不需要定义的范围,而与使用新的已知边界重新定义int []一样。甚至像这样琐碎的事情: for(int i = 0; i < items.length; i ++) { // do something } 我知道它每次迭代都会评估item.length。但是,我也知道项目永远不会超过15到20个项目。因此,我是否应该在每次迭代中评估items.length? 我进行了一些测试,以查看应用程序使用我刚刚描述的方法相对于正确方法的性能,并按照教程进行操作,并使用社区建议的确切数据类型。结果:一样。平均45 fps。我打开了手机和银河标签上的每个应用程序。没有不同。 所以我想我对您的问题是:是否不再需要适当的门槛?可以说-“只要完成工作,我不在乎?”

14
使用反射是否有问题?
我不知道为什么,但是当我使用反射时,我总是觉得自己在“作弊”-也许是因为我知道我要表现出色。 我的一部分说,如果它是您正在使用的语言的一部分,并且可以完成您尝试做的事情,那么为什么不使用它呢?我的另一部分说,必须有一种无需使用反射即可执行此操作的方法。我想也许这取决于情况。 使用反射时需要注意哪些潜在问题,我应该如何关注它们?尝试寻找更常规的解决方案需要花费多少精力?

7
一致的代码样式的实际价值是什么
我是顾问团队的成员,该团队为客户实施新的解决方案。我负责客户端代码库(React和javascript)上的大多数代码审查。 我注意到一些团队成员使用独特的编码模式,以至于我可以从一个样式中随机选择一个文件,以告诉谁是作者。 示例1(一次性内联函数) React.createClass({ render: function () { var someFunc = function () { ... return someValue; }; return <div>{someFunc()}</div> } }); 作者认为,通过为someFunc分配有意义的名称,代码将更易于阅读。我相信,通过内联函数并添加注释,可以达到相同的效果。 示例2(未绑定函数) function renderSomePart(props, state) { return ( <div> <p>{props.myProp}</p> <p>{state.myState}</p> </div> ); } React.createClass({ render: function () { return <div>{renderSomePart(this.props, this.state)}</div>; } }); 这是我们通常的做法(避免通过状态和道具): React.createClass({ renderSomePart: function …

4
为什么#include <iostream.h>不好?
我正在阅读另一个线程,一个人向初学者询问有关C ++的书籍,一个回答的程序员写道: 警告:请避免所有带有“ hello world”字样的书都标明 #include &lt;iostream.h&gt; 我打开了我的C ++书,并确定它像上面的示例一样包含iostream标头。 为什么这么糟?学习C ++时,我还应牢记其他哪些指针? 背景:我精通C语言,下学期将开始学习C ++。

10
标志变量是绝对邪恶吗?[关闭]
标志变量是邪恶的吗?以下类型的变量是否极不道德,是否邪恶地使用它们? “布尔值或整数变量,您可以在某些位置分配值,然后向下选择以下值,然后进行其他操作,例如,使用newItem = true下面的某些行if (newItem ) then” 我记得做过几个项目,在这些项目中我完全忽略了使用标志,最终得到了更好的体系结构/代码。但是,这在我从事的其他项目中是一种常见的做法,当代码增长并添加标志时,恕我直言,意大利面条也随之增长。 您是否会说在任何情况下都使用标志是一种好习惯甚至是必要的做法?或者您是否同意在代码中使用标志是...红色标志,应避免/重构。我,我只是通过执行实时检查状态的函数/方法来解决问题。

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.