代码风格
代码风格
代码风格()即程序开发人员所编写源代码的书写风格。良好的代码风格会帮助程序员阅读和理解符合该风格的源代码,并且避免错误。
关于该主题的经典著作是 1970 年代编写的,并以当时流行的 Fortran 和 PL/I 语言的示例进行了说明。
特定程序中使用的编程风格可能源自公司或其他计算组织的,以及代码作者的偏好。编程风格通常是为特定的编程语言(或语言家族)设计的:在 C 源代码中被认为是良好的风格可能不适合 BASIC 源代码等等。但是,一些规则通常适用于许多语言。
良好风格的要素.
总结程序设计实践中的经验,代码风格的要素包括(但不限于)以下几点:
代码外观.
代码风格通常处理源代码的可视外观,带有可读性的目标。软件很长时间都可以格式化源代码,让写代码的人将注意力集中在命名,逻辑和更高级的技术。作为一个实际的点,用计算机来格式化源代码节省了时间,且使不带网络论战地实施全公司的标准成为可能。
缩进.
缩进风格协助确认控制流和代码块。在一些编程语言中,缩进被用来限定代码的逻辑块;在这些情况下正确的缩进不仅仅是风格的事。在其他语言中,缩进和空白字符不影响功能,虽然有逻辑和一贯的缩进是代码更易于阅读。比较:
if (hours "(HTML中),"[code]"..."[/code]"(中)等等时避免。
if hours Bool
isValidDate date = hh>=0 && mm>=0 && ss>=0
&& hh (Int,Int,Int)+.
一个使用纯文本的例子:
The function isValidDate test if date is valid
> isValidDate :: Date -> Bool
> isValidDate date = hh>=0 && mm>=0 && ss>=0
> && hh where (hh,mm,ss) = fromDate date
observe that in this case the overloaded function is fromDate :: Date -> (Int,Int,Int).
垂直对齐.
将相似的元素垂直对齐经常是有帮助的,使错字导致的错误更加明显。比较:
$search = array('a', 'b', 'c', 'd', 'e');
$replacement = array('foo', 'bar', 'baz', 'quux');
// Another example:
$value = 0;
$anothervalue = 1;
$yetanothervalue = 2;
和
$search = array('a', 'b', 'c', 'd', 'e');
$replacement = array('foo', 'bar', 'baz', 'quux');
// Another example:
$value = 0;
$anothervalue = 1;
$yetanothervalue = 2;
空格.
在一些需要空白字符的情况下,绝大部分自由形式语言的语法不关心出现了多少空白字符。与空白字符相关的风格被普遍用来加强可读性。目前没有已知的确凿事实(研究得出的结论)关于哪种空白字符风格有最好的可读性。
例如,比较下列语法上等价的 C 语言代码例子:
int i;
for(i=0;i<10;++i){
printf("%d",i*i+i);
v.s.
int i;
for (i = 0; i < 10; ++i) {
printf("%d", i * i + i);
制表符.
使用制表键来创建空白字符,在不施加足够关注时会造成特定的问题,因为依据使用的工具,甚至是用户的偏好,制表点的位置可能不同。
如一个例子,一个程序员偏好4个,将工具集设置成如此,然后用这些去格式化代码。
int ix; // Index to scan array
long sum; // Accumulator for sum
另一个程序员偏好8个制表位,并将工具集设置成如此。当其他人检查原来那个人的代码时,他们可能会发现很难读。
int ix; // Index to scan array
long sum; // Accumulator for sum
一种对这个问题广泛使用的解决方法可能包含不为对齐使用制表键,或制定必须设置成几个制表位的规则。注意制表符在一贯的情况下工作良好,限制在局部缩进上,并且不用来对齐:
class MyClass {
int foobar(
int qux, // first parameter
int quux); // second parameter
int foobar2(
int qux, // first parameter
int quux, // second parameter
int quuux); // third parameter