Questions tagged «code-smell»

确定什么是“代码气味”,什么不是“代码气味”是主观的,并且随语言,开发人员和开发方法的不同而不同。在询问某种技术是否具有“代码气味”之前,请问自己,如果使用了该技术,将会对您的特定项目造成什么后果。简单地询问某物是否有“代码气味”是很主观的。

8
有没有比TryGetValue使用C#词典更好的方法?
我发现自己经常在网上查找问题,许多解决方案都包括字典。但是,每当我尝试实现它们时,我的代码都会令人讨厌。例如,每次我想使用一个值时: int x; if (dict.TryGetValue("key", out x)) { DoSomethingWith(x); } 这是4行代码,基本上可以执行以下操作: DoSomethingWith(dict["key"]) 我听说使用out关键字是一种反模式,因为它会使函数改变其参数。 另外,我发现自己经常需要“反向”字典,在其中翻转键和值。 同样,我经常想遍历字典中的各项,发现自己将键或值转换为列表等以更好地做到这一点。 我觉得几乎总是有一种更好,更优雅的字典使用方式,但是我很茫然。

9
断言代码太多了吗?
我真的爱上了单元测试和TDD-我被测试感染了。 但是,单元测试通常用于公共方法。有时候,尽管我确实也必须在私有方法中测试一些假设-断言,因为其中一些是“危险的”,并且重构无济于事。(我知道,测试框架允许测试私有方法)。 因此,我的习惯是私有方法的第一行和最后一行都是断言。 但是,我注意到我倾向于“肯定”地在公共方法(以及私有方法)中使用断言。因为公共方法假设是由单元测试框架从外部进行测试的,所以这可能是“测试重复”吗? 有人会认为太多的断言是代码的味道吗?

7
抽象是否必须降低代码的可读性?
最近与我合作的一名优秀开发人员告诉我,他在实现我们继承的某些代码中的功能时遇到了一些困难;他说,问题在于该代码难以遵循。由此,我对产品进行了更深入的了解,并意识到查看代码路径有多么困难。 它使用了许多接口和抽象层,以致于很难理解事物的开始和结束位置。这让我开始思考过去的项目的时间(在我很清楚干净的代码原理之前),发现在项目中走来走去非常困难,这主要是因为我的代码导航工具总是使我进入一个界面。找到具体的实现或某些插件类型体系结构中的连接位置将花费大量的额外精力。 我知道有些开发人员正是出于这个原因严格拒绝依赖注入容器。它极大地混淆了软件的路径,以致代码导航的难度成倍增加。 我的问题是:当框架或模式引入如此多的开销时,是否值得?这是模式实施不当的征兆吗? 我想开发人员应该从更大的角度看待抽象带给项目的东西,以帮助他们度过沮丧。通常,尽管如此,很难使他们看到大局。我知道我未能通过TDD出售IOC和DI的需求。对于那些开发人员而言,使用这些工具只会严重限制代码的可读性。

4
为什么数据类被认为是代码异味?
该文章称,数据类是一个“代码味道”。原因: 当新创建的类仅包含几个公共字段(甚至可能有少数getter / setter)时,这是很正常的事情。但是对象的真正威力在于它们可以包含行为类型或对其数据的操作。 为什么对象仅包含数据是错误的?如果该类的核心职责是代表数据,那么添加对数据进行操作的方法是否会违反“ 单一职责原则”?

7
将对象传递到更改对象的方法中,这是常见的(反)模式吗?
我正在阅读Martin Fowler的《重构》一书中的常见代码气味。在这种情况下,我想知道我在代码库中看到的一种模式,并且可以客观地将其视为一种反模式。 模式是一种将对象作为参数传递给一个或多个方法的模式,所有这些方法都会更改对象的状态,但是没有一个返回对象。因此,它依赖于C#/。NET(在这种情况下)的按引用传递特性。 var something = new Thing(); // ... Foo(something); int result = Bar(something, 42); Baz(something); 我发现(尤其是方法名称不正确时),我需要研究此类方法以了解对象状态是否已更改。由于我需要跟踪调用堆栈的多个级别,因此这会使代码理解更加复杂。 我想建议改进此类代码,以返回具有新状态的另一个(克隆的)对象,或在调用站点更改该对象所需的任何操作。 var something1 = new Thing(); // ... // Let's return a new instance of Thing var something2 = Foo(something1); // Let's use out param to 'return' other info about the operation …

5
函数可以修改参数吗
我们有一个包装Linq To SQL的数据层。在此数据层中,我们有此方法(简化) int InsertReport(Report report) { db.Reports.InsertOnSubmit(report); db.SubmitChanges(); return report.ID; } 在提交更改时,将使用数据库中的值更新报告ID,然后我们将其返回。 从主叫方看起来像这样(简化) var report = new Report(); DataLayer.InsertReport(report); // Do something with report.ID 查看代码,作为一种副作用,已经在InsertReport函数内部设置了ID,然后我们忽略了返回值。 我的问题是,我应该依靠副作用,而是做类似的事情。 void InsertReport(Report report) { db.Reports.InsertOnSubmit(report); db.SubmitChanges(); } 还是应该防止它 int InsertReport(Report report) { var newReport = report.Clone(); db.Reports.InsertOnSubmit(newReport); db.SubmitChanges(); return newReport.ID; } 甚至会 Report …

9
如何判断软件是否高度耦合?
我对术语“高度耦合”很熟悉,但是很好奇是否存在迹象(代码气味)可以表明代码高度耦合。我目前正在使用Java EE,但这可以应用于任何语言。 编辑: 如果有人感兴趣,这篇文章听起来很有帮助:追求代码质量:当心这对夫妇!(IBM)

3
模拟在生产代码中引入处理
假设有一个IReader接口,一个IReader接口ReaderImplementation的实现以及一个使用和处理来自读取器的数据的类ReaderConsumer。 public interface IReader { object Read() } 实作 public class ReaderImplementation { ... public object Read() { ... } } 消费者: public class ReaderConsumer() { public string location // constructor public ReaderConsumer() { ... } // read some data public object ReadData() { IReader reader = new ReaderImplementation(this.location) data …

3
什么时候可以使用并行阵列?
我一直在尝试使用所谓的“并行数组”或列表的代码(新代码)。意味着有2个数组包含相关数据,并通过它们在数组中的位置(索引)进行链接。 我认为这很容易混淆,并且容易出现各种错误。我通常建议的解决方案是创建一个名为CompanyCompanyId和CompanyName 的对象。 一个非常真实的例子: List<string> companyNames; List<int> companyIds; //...They get populated somewhere and we then process for(var i=0; i<companyNames.Count; i++) { UpdateCompanyName(companyIds[i],companyNames[i]); } 这些并行数组是否被认为是不好的做法?

3
我无法跟踪我的PHP Web应用程序的流程,因此变得越来越难以使用
我已经编程了几年,并且随着时间的流逝对C#和JavaScript变得非常熟悉。我有一些较大的C#和JavaScript项目,可以轻松浏览。我最近开始了一个PHP&AngularJS项目,该项目以前没有使用PHP的经验。 PHP方面的流程变得越来越难以跟踪(JavaScript方面更大,但很容易实现),当我尝试通过它进行思考时,我想象一个纠结的线程。一开始我犯的主要设计错误就开始堆积起来,影响着我的设计。实施任何新技术都将花费越来越长的时间。 我的工作期限很紧,发现编写好的DRY SOLID代码变得越来越困难。随着设计时间的增加,复制/粘贴代码块以使其行为略有变化变得越来越具有吸引力。每当我必须进行上下文切换(从一个项目然后回到这个项目)时,也需要很长时间才能回到代码库,每当我回到该项目上工作时,我都会感到恐惧。 我可以采取什么步骤来解决这个问题?另外,还可能需要花费额外的时间来证明其合理性,因为我的老板不是开发人员,也不熟悉开发或软件的生命周期,因此解释起来可能比平时更为困难。


5
是否有“实用”类值得关注?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我有时会创建“ Util”类,这些类主要用于保存似乎并不真正属于其他地方的方法和值。但是每次创建这些类之一时,我都会想:“哦,哦,我以后会后悔的……”,因为我在某处读到不好。 但另一方面,似乎有两个令人信服的案例(至少对我而言): 包中多个类中使用的实现机密 提供有用的功能来扩展类,而不会使其界面混乱 我要毁灭了吗?你说的话 !!我应该重构吗?

7
您为之感到骄傲的最糟糕的代码是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我有一些让我感到骄傲的东西,其中一些是几年前由我自己写的。它不必一定是错误的,只是错误的代码。

7
记录器在参数列表中的位置应该是什么[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 在我的代码中,我通过构造函数的参数列表为许多类注入了记录器 我注意到我将其随机放置:有时它是列表中的第一个,有时是最后一个,有时是介于两者之间 你有什么喜好吗?我的直觉说,在这种情况下,一致性是有用的,而我个人的偏好是将其放在首位,这样在丢失时更容易被注意到,而在丢失时更容易跳过。

5
复杂软件应实现多少冗余/鲁棒性?
这个问题的焦点:尽管软件中存在一个或多个内部错误,某些软件执行“额外工作”以增加“最终成功/令人满意”结果的机会,当这些错误发生时,这需要更长的执行时间。如果结果成功,所有这些都会在用户不知情的情况下发生。 复杂软件的定义: 包含超过10个开发人员在其生命周期内编写的代码(由其提供),并且未在同一时间段内编写 依赖于10多个外部库,每个库都带有警告 典型的软件任务(用于生成用户想要的结果)需要10个或更多输入参数,其中大多数具有默认值,但如果用户需要控制,则可以配置。 最重要的是,相对于要执行的任务具有适当复杂性的软件,即不必造成不必要的复杂性。 编辑:什么是复杂的?请参阅复杂和复杂之间有很大的区别。(直接链接) 此问题内的冗余/鲁棒性的定义:(基于注释增加了鲁棒性) 如果在使用当前参数集时软件任务失败,请尝试其他参数。 显然,必须有内部知识,这些“不同”的参数使用不同的代码路径,可能会导致不同的(希望更好)结果。 有时,这些不同的代码路径是基于对外部库的观察而选择的。 最后,如果执行的实际任务与用户的说明略有不同,则用户将收到详细说明差异的报告。 最后,像10余个可配置参数一样,冗余和报告也是可配置的。 此类软件的示例: 数据库迁移 业务数据库 源代码控制数据库等 在Word文档和OpenOffice文档,PowerPoint和OpenOffice Draw等之间进行批量转换。 自动翻译整个网站 自动分析软件包,例如Doxygen,但需要更可靠的分析(即不仅仅是文档工具) 网络通信,其中数据包可能会丢失并且可能会重试 这个问题最初是由您如何处理故意的不良代码启发而来的?但现在仅关注软件膨胀的原因之一。这个问题没有解决软件膨胀的任何其他原因,例如添加新功能。 可能相关: 如何处理(巨大)项目中的复杂代码 人们如何管理和维护极其复杂且难以阅读的代码?

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.