自我记录代码的10条原则

你好 今天,我想分享一些关于编写完美,易于理解的代码的技巧,这些技巧摘自Peter Goodlif的书“程序员的技巧//编写良好代码的实践”。

当然,最好将这本有趣的书读给任何编写该代码的人,但是对于那些特别懒惰但又想停止折磨,误导同事( 有良心 )的人,我在cat下介绍了自我记录代码的10条原则:

1.编写具有良好格式的简单代码


表示格式对理解代码的难易程度有很大的影响。 合理的表示表达了代码的结构:函数,循环和条件语句变得更加清晰。

int fibonacci(int position) { if (position < 2) { return 1; } int previousButOne = 1; int previous = 1; int answer = 2; for (int n = 2; n < position; ++n) { previousButOne = previous; previous = answer; answer = previous + previousButOne; } return answer; } 

  • 确保代码的正常执行是显而易见的。 错误处理不应影响正常的执行顺序。 条件if-then-else构造必须具有统一的分支顺序(例如,始终将“常规”代码分支置于“错误处理”分支之前,反之亦然)。
  • 避免使用很多级别的嵌套语句。 否则,代码将变得很复杂,需要大量的说明。 一般认为,每个功能应只有一个退出点; 这就是所谓的“ 单项输入,单项退出(SESE,一个输入,一个输出)”代码。 但是通常,此限制使读取代码变得困难,并增加了嵌套级别。 我更喜欢上面的fibonacci函数选项,而不是下面的SESE -style 选项

     int fibonacci(int position) { int answer = 1; if (position >= 2) { int previousButOne = 1; int previous = 1; for (int n = 2; n < position; ++n) { previousButOne = previous; previous = answer; answer = previous + previousButOne; } } return answer; } 

    我会拒绝这种过多的嵌套以支持附加的return语句 -读取该函数变得更加困难。 将返回值隐藏在函数深处的适当性值得高度怀疑,但是在其开始时进行简单的删节计算就非常容易阅读。
  • 当心代码优化,这些优化会导致底层算法的清晰度。 当很明显会影响可接受的程序性能时才对代码进行优化。 优化时,请对本节代码的功能做出明确的注释。

2.选择有意义的名称


所有变量,类型,文件和函数的名称均应有意义且不会引起误解。 该名称必须正确描述其含义。 如果您找不到有意义的名称,那么您是否理解代码的操作就值得怀疑。

命名系统应保持一致,并且不会引起不愉快的意外。 确保始终仅将变量用于其名称所暗示的目的。

正确选择名称可能是避免不必要评论的最好方法。 使用名称可以使代码更接近自然语言的表达能力。

3.将代码分解为独立的功能


如何将代码分解为函数以及给它们命名的名称会使代码易于理解或完全无法理解。

  • 一机一动

尽量减少任何意外的副作用,无论它们看起来有多有用。 他们将需要其他文档。
编写短函数。 它们更容易理解。 如果将复杂的算法划分为多个具有有意义名称的小片段,则可以使用这种算法进行导航,但是这无法用无形的代码量来完成。

4.选择有意义的类型名称


尽可能使用可用的语言功能描述限制或行为。 例如:

  • 确定不会改变的值时,请为其分配一个常量类型(在C中使用const )。
  • 如果该变量不应采用负值,请使用无符号类型(如果在语言中存在)。
  • 使用枚举来描述关联的数据集。
  • 正确选择变量的类型。 在C / C ++中,将size写入size_t类型的变量,并使用指向ptrdiff_t类型的变量的指针进行算术运算的结果。

5.使用命名常量


诸如if(counter == 76)之类的代码令人困惑。 76的神奇含义是什么? 此检查的含义是什么? 魔术数字的做法是恶毒的。 它们使代码的含义难以理解。 最好这样写:

 const size_t bananas_per_cake = 76; ... if (count == bananas_per_cake) { //    } 

如果在代码中经常找到常数76的代码(对不起, bananas_per_cake ),则可以实现另一个优势:当需要更改饼中香蕉的内容时,只需在一个地方修改代码,而不是对数字76进行全局搜索/更改就足够了,这充满了错误。

这不仅适用于数字,还适用于常量字符串。 查看代码中的所有文字,尤其是当它们反复出现时。 改用命名常量会更好吗?

6.突出显示重要的代码


尝试在普通材料的背景下突出显示重要的代码。 在正确的位置,您应该引起读者的注意。 有许多技巧。 例如:

  • 明智地在教室里放置广告。 首先,应该打开有关打开对象的信息,因为需要它的是类的用户。 封闭的实现细节应放在最后,因为大多数读者对此不太感兴趣。
  • 如果可能,隐藏所有非必要信息。 不要在全局名称空间中留下不必要的垃圾。 C ++具有惯用法pimpl,它使您可以隐藏类实现的详细信息。 (迈耶斯97)。
  • 不要隐藏重要的代码。 在一行中不要写多个语句,并且使该语句简单。 该语言允许您编写非常有创造力的for循环运算符,其中所有逻辑在许多逗号的帮助下合而为一,但是此类运算符很难阅读。 避免他们。
  • 限制条件语句的嵌套深度。 否则,很难注意到在ifs和括号堆后面真正重要的案例的处理。

7.合并相关数据


所有相关信息都应该放在一个地方。 否则,您将使读者不仅跳过篮球,还用ESP查找这些篮球。 每个组件的API必须由一个文件表示。 如果有太多相互关联的信息无法在一处呈现,则值得修改代码体系结构。

如果可能,请使用语言构造来组合对象。 在C ++和C#中,您可以在同一命名空间中合并元素。 在Java中,包引擎是联合工具。 相关常量可以在枚举中定义。

8.标签文件


在文件的开头放置一个注释块,其中包含文件内容及其相关项目的描述。 这不需要很多工作,但是很有好处。 任何必须陪同此文件的人都会对它所处理的内容有个很好的了解。 该标题可能具有特殊含义:出于法律原因,大多数软件公司要求每个源文件都具有版权声明。 通常,文件头看起来像这样:

 /********************************************************* * File: Foo.java * Purpose: Foo class implementation * Notice: (c) 1066 Foo industries. All rights reserved. ********************************************************/ 

9.正确处理错误


将所有错误的处理置于最合适的环境中。 如果存在对磁盘的读/写问题,则必须使用处理磁盘访问的代码对其进行处理。 要处理此错误,您可能需要生成另一个错误(例如异常“我无法加载文件”),并将其传递给更高级别。 这意味着在程序的每个级别,错误必须是在上下文中对问题的准确描述。 处理用户界面代码中与磁盘故障相关的错误没有任何意义。

自记录代码可以帮助读者了解错误的出处,错误的含义以及对程序的后果。

10.撰写有意义的评论


因此,我们试图避免使用其他间接的文档编写方法来编写注释。 但是,在您竭尽全力编写易于理解的代码之后,所有其他内容都需要提供注释。 为了使代码易于理解,需要在代码中添加适当数量的注释。 哪一个

首先尝试其他技巧。 例如,检查是否可以通过更改名称或创建帮助函数来使代码更清晰,从而避免注释。



我敢肯定,在将其中一些原则引入习惯后,您将使一个程序员更加快乐。 您将成为这个快乐的程序员。 什么时候 在六个月前返回工作时。

Source: https://habr.com/ru/post/zh-CN458264/


All Articles