同行代码评审中的两个角色是审阅者和被审阅者。
项目经理同意参与同行代码评审的人员。
在请求同行代码审查之前,您可以通过确保您的代码和测试所有工作、您对项目执行代码分析并修复提出的任何问题,以及您的代码遵守公司的编码准则来节省审查人员的时间和精力。
在检查代码时,请注意命名、格式、编程风格、潜在错误、代码和测试的正确性、安全性和性能问题。
这三类反馈是积极的、可选的和关键的。
没有参数的方法称为 niladic 方法。
只有一个参数的方法称为一元方法。
具有两个参数的方法称为并矢方法。
具有三个参数的方法称为三参数方法。
具有三个以上参数的方法称为多元方法。
您应该避免重复代码。它不是一种高效的编程方式,会使程序变得不必要的大,并且有可能在整个代码库中传播相同的异常。
函数式编程是一种软件编码方法,它将计算视为不修改状态的计算的数学评估。
函数式编程的优点包括多线程应用中的安全代码,以及易于阅读和理解的更小、更有意义的方法。
输入和输出可能是功能程序的问题,因为它依赖于副作用。功能性编程不考虑副作用。
湿代码与干代码相反,因为每次需要时都会编写代码。这会产生重复,并且相同的异常可能发生在程序中的多个位置,从而使维护和支持更加困难。
干代码与湿代码相反,因为代码只编写一次,并且可以在需要时重用。这减少了代码库和异常占用,从而使程序更易于阅读和维护。
通过使用重构删除重复的代码,可以使湿代码变干。
长方法很麻烦,而且容易出现异常。它们越小,越容易阅读和维护。程序员引入 bug 的机会也较少,尤其是逻辑性 bug。
为了避免使用 try/catch 块,您可以编写参数验证器。然后调用方法顶部的验证器。如果参数验证失败,则抛出相应的异常,并且不执行该方法。
已检查异常是在编译时检查的异常。
未检查的异常是在编译时未检查或忽略的异常。
当无法将高阶位分配给目标类型时,将引发溢出异常。在检查模式下,OverflowException
升起。在未检查模式下,无法分配的高阶位将被忽略。
试图访问空对象上的属性或方法的尝试。
实现一个Validator
类和一个Attribute
类,该类检查参数是否为 null,并抛出ArgumentNullException
。您可以在方法的顶部使用Validator
类,这样在引发异常之前,您就不会中途完成方法。
业务规则例外(BRE)。
BRE 是一种不好的做法,因为它们期望引发异常以控制程序流。
正确的编程不应该通过期望异常作为输出来控制计算机程序的流程。所以,考虑到 BRE 是坏的,因为它们期望异常的输出并使用它来控制程序流,更好的解决方案是使用条件编程。对于条件程序,使用布尔逻辑。布尔逻辑允许两种可能的执行路径,并且从不引发异常。条件检查是显式的,使程序更易于阅读和维护。您还可以轻松地扩展此类代码,而使用 BRE 则无法。
首先,使用 Microsoft.NET Framework 中的已知异常类型,从错误捕获已知类型的异常开始,例如ArgumentNullExceptions
和OverflowExceptions
。但是,当这些数据不足,并且不能为您的特定情况提供足够的数据时,您将编写并使用自己的自定义异常,并应用有意义的异常消息。
自定义异常必须继承自System.Exception
,并实现三个构造函数:默认构造函数、接受文本消息的构造函数以及接受文本消息和内部异常的构造函数。
一个好的单元测试必须是原子的、确定性的、可重复的和快速的。
一个好的单元测试不能是无结论的。
测试驱动开发。
行为驱动的发展。
一个小的代码单元,其唯一目的是测试只做一件事的单个代码单元。
单元测试使用的假对象,用于测试真实对象的公共方法和属性,但不测试方法或属性依赖关系。
伪对象与模拟对象相同。
MSTest、NUnit 和 xUnit。
犀牛模仿和 Moq。
SpecFlow。
不必要的注释、死代码和冗余测试。
线程是一个进程。
一
背景线程和前景线程。
背景线程。
前景线程。
Thread.Sleep(500);
var thread = new Thread(Method1);
将IsBackground
设置为true
。
死锁是两个线程被阻塞并等待另一个线程释放资源的情况。
Monitor.Exit(objectName);
使用相同资源的多个线程根据每个线程的计时生成不同的输出。
使用带ContinueWith()
的 TPL,使用Wait()
等待任务完成后退出方法。
使用其他方法共享的成员变量,并传入引用变量。
对
线程池。
它是一个一旦构建就无法修改的对象。
它们允许您在线程之间安全地共享数据。
应用级、类级和方法级。
布尔盲症、组合爆炸、人为复杂性、数据块、除臭剂注释、重复代码、失去意图、变量突变、奇怪的解决方案、散弹枪手术、解决方案蔓延和不可控的副作用。
圈复杂度、发散变化、降级、过度文字使用、特征嫉妒、不恰当的亲密关系、不雅的暴露、大类(也称为上帝对象)、懒惰类(也称为免费装载者和懒惰对象)、中间人类、变量和常量的孤儿类、原始痴迷、拒绝遗产、,好吧,说吧,别问了!,临时场。
害群之马、圈复杂度、人为复杂度、死代码、数据返回过多、功能嫉妒、标识符大小、不恰当的亲密关系、长线又称神线、懒惰方法、长方法(神法)、长参数列表(参数太多)、消息链、中间人方法、古怪的解决方案和推测性通用性。
使用 LINQ 而不是循环。让类只负责一件事。让方法只做一件事。用参数对象替换长参数列表。使用创造性设计模式来提高昂贵对象的创建和利用效率。将方法保持在 10 行或更少。使用 AOP 从方法中删除样板代码。分离对象并使其可测试。使代码高度内聚。
表示分支和循环数量的值。
减少发生的分支和循环的数量,直到圈复杂度值变为 10 或更少。
使事情变得比需要的更复杂。
保持简单,愚蠢(亲吻。
同样的事情是通过不同的方法和不同的参数组合来完成的。
创建可以对不同数据类型执行相同任务的通用方法,以便只有一个方法和一组参数。
修复错误代码并删除注释。
请求帮助。
堆栈溢出。
长参数列表可以替换为参数对象。
将其重构为只做一件事的较小方法,并使用 AOP 将样板代码删除为方面。
不超过 10 行。
0-10; 除此之外的任何事情,你都是在自找麻烦。
一
未使用的变量、类、属性和方法。摆脱他们。
选择最佳的实现方法,然后重构代码以仅使用该实现方法。
将临时字段及其操作方法重构为它们自己的类。
不同类中使用的同一组变量。将变量重构为它们自己的类,然后引用该类。
类继承自另一个类,但不使用其所有方法。
得墨忒尔定律。
只允许班级与他们的近邻交谈。
在另一个类或方法中花费太多时间的类或方法。
重构它们自己的类或方法中的依赖项。
工厂法。
从基类继承,然后创建从基类继承的新类。
单一责任是在应用的不同层的不同类的不同方法中实现的。将职责重构到自己的类中,使其仅位于单个位置。
数据应放在对其进行操作的同一对象中。
当您创建一个向另一个对象请求数据以使其可以对其执行操作的对象时。
单个更改需要在多个位置进行更改。消除重复,消除耦合,提高内聚性。
丢失意图是指类或方法的原因不清楚,因为有许多不相关的项聚集在一起。重构代码,使所有方法都位于正确的类中。这样,类和方法的意图就变得清晰了。
您可以使用 LINQ 查询重构循环。LINQ 是一种函数式语言,它不改变位置变量,而且执行速度比循环快得多。
GoF是四人帮模式的缩写。这是 23 种模式,分为创意、结构和行为设计模式。它们被认为是所有软件设计模式的基础。它们一起工作以生成干净的面向对象代码。
创建模式支持抽象和继承,以提供一种面向对象的方法,在对象创建成本较高时消除代码重复并提高性能。创建模式包括抽象工厂、工厂方法、单例、原型和构建器。
结构模式可以正确管理对象之间的关系。我们可以使用结构模式使不兼容的接口能够协同工作,将抽象与其实现分离,并提高性能。结构模式包括适配器、桥接器、复合材料、装饰器、立面、flyweight 和代理。
行为模式控制对象之间的交互和通信方式。我们可以使用它们来生成管道、封装将来要执行的命令和信息、在对象之间进行调解、观察对象中的状态变化等等。行为模式包括责任链、命令、解释器、迭代器、中介、记忆、观察者、状态、策略、模板方法和访问者。
对
在应用的整个生命周期中,singleton 只允许对象的单个实例。所有需要该对象的对象都可以全局访问该对象。当我们需要确保有一个集中的对象创建和对象访问点时,我们使用这种模式。
当需要创建对象而不指定要实例化的确切类时,我们使用工厂方法。
正面。
使用 flyweight 设计图案。
桥
使用生成器模式。
您可以使用责任链模式,因为您可以有一个处理程序管道,每个处理程序执行一项任务。如果处理程序无法处理该任务,则会将该任务传递给后续处理程序进行处理。