过时的编码实践

时间:2009-03-25 21:19:57

标签: coding-style

当我编写代码时,我有时会想知道我是以最好的方式做事还是按照一直以来的方式做事。我正在做的事情是否有意义?

例如,在函数顶部声明所有变量。如果我尝试在我开始使用它的地方宣布它两次或更低,我的IDE会在设计时向我发出警告 - 那么最重要的是什么?似乎将变量声明在它们被使用的块的正上方是更有意义的。

另一个是匈牙利表示法。我讨厌所有与特定对象相关的变量都散布在我的智能感知中。

随着框架和IDE的现代化进步,是否有一些不再适用的编码实践以及其他可能现在完全错误的编码实践?

12 个答案:

答案 0 :(得分:24)

不要在变量上面声明它们将被使用的块 - 在第一次使用时,在可用的最窄范围内声明它们,假设用你的语言是可行的。

匈牙利表示法取决于您的语言/平台的惯例。它还取决于您使用的匈牙利品种 - 明智的(我还是不喜欢)或仅重新提供已有类型信息的版本。

有一点需要注意:当你学习一门新语言时,请确保你同时使用它的成语,特别是命名约定。这将有助于您的代码适应新语言,而不是旧的(可能不相关的)代码。我发现它也有助于我认为与新语言保持一致,而不是反对它。

但是,肯定值得定期重新编写编码实践。如果你无法确定为什么这是一个好主意,那么试试一段时间不做它......

答案 1 :(得分:18)

意外分配保护:

在一些较新的语言(如C#)中不需要将左值放在右侧。

在C#中,以下内容无法编译:

if (variable = 0)

所以在C#中没有必要这样做:

if (0 == variable)

这种做法在C / C ++程序中非常常见,以避免意外分配,这些分配是为了进行比较。


多个返回点:

强制禁止多个返回点主要是因为您不想忘记删除变量。

相反,如果您只使用RAII,则无需担心。

免责声明:仍然有充分的理由尽量减少多个返回点,有时只有一个返回点很有用。


标题文件

在大多数现代语言中,您不会将代码分为声明和定义。


C ++定义了多个头文件包括

在C ++中,您经常这样做:

#ifdef _MYFILE_H_
#define _MYFILE_H_

//code here

#endif

这有时会导致类似以下内容:

#ifdef _MYFILE_H_
#define _WRONGNAME_H_

//code here

#endif

如果您的编译器支持它,可以采用更好的方法:

#pragma once

C变量声明

使用C,您必须在代码块的顶部声明所有变量。即使是更高版本的C也不需要这个,但人们仍然这样做。


匈牙利表示法:(阅读,包含一些独特的信息)

Hungarian notation can still be good。但我并不是指那种匈牙利符号。

在C之前有这样的事情非常重要:

int iX = 5;
char szX[1024];
strcpy(szX, "5");

因为您可以完全键入不安全的函数,例如:

printf("%i", iX);

现在,如果我要调用字符串x,我的程序就会崩溃。

当然,对此的修复是仅使用类型安全功能。因此,只要你这样做,你就不需要匈牙利语。

但乔尔在他看来,这仍然是一个好主意。

答案 2 :(得分:13)

我过去常常将所有行号分开10,以100或1000的间隔开始每个逻辑上独立的代码。

10 Print "Hello"
20 Gosub 100
30 'Peeks and Pokes

由于显而易见的原因,我不再像这样编码了。

答案 3 :(得分:8)

简短标识符:许多老式编码员使用简短,神秘的标识符。简洁是一种有用的优点,但考虑到一个好的IDE具有自动完成功能,描述性名称远比易于键入的名称好得多。

答案 4 :(得分:7)

短线:有些人坚持使用80列文字。我们其他人都有真正的监视器,不介意一条线是否长于80个字符。它可以提高可读性,使其具有更长的线条。

答案 5 :(得分:3)

对齐列(例如声明中的变量或赋值中的=)。

手动维护是一件痛苦的事情,无论如何,自动重命名都会搞砸,有些线条会因为各种各样的东西而变得很长,所以你很难看到这种关系。

答案 6 :(得分:3)

就像之前所说的那样,不要试图将一种语言的习语改编为另一种语言。在完全不同的语言中尤其如此,例如从C ++到Python。另外(这可能只是个人风格的问题),我曾经声明一个变量,然后稍后为它赋值。我发现只需要同时声明和定义它就会更快,更节省空间。

答案 7 :(得分:2)

就变量声明而言,声明它们的最佳位置就在它们被使用之前。如果您的函数/过程太大,以至于在顶部声明了大量变量,请考虑将函数重构为多个较小的变量。

就匈牙利表示法而言,同样的答案也适用。如果函数太大而无法快速发现变量的定义(即使它应该在使用之前声明),那么请考虑重构。

在大多数情况下,一个编写良好,重构良好的函数应该使代码页快速浏览变量声明和数据类型。

答案 8 :(得分:1)

虽然它是Java版本,但我推荐给那些想要优化/现代化编码风格的人:http://www.amazon.com/Implementation-Patterns-Addison-Wesley-Signature-Kent/dp/0321413091

答案 9 :(得分:1)

顶部的变量在像javascript这样的语言中有意义。它没有块范围,因此它确实简化了读取。

考虑一个包含以下内容的函数体:

//some code
if(something)
{
   var c = 123;
}

alert(c); // gives 123 when the if is executed and undefined when it doesn't.

这是剩下的,每种语言都不同,这肯定会影响到什么是不合适的。还要考虑你在相关框架中使用的代码通常使用某种编码风格,如果你选择完全不同的东西,你将不可避免地得到混合风格。

更新: javascript中的上述内容正在发生变化(如评论中所述)。它似乎没有得到广泛的支持(没有找到一个很好的链接思想:(),这也提醒我们,如果不考虑我们使用它们的上下文,我们不能急于进入新功能。

答案 10 :(得分:1)

  

随着框架和IDE的现代进步,是否存在一些不再适用的编码实践以及其他可能现在完全错误的编码实践

在很大程度上取决于语言。

  

W.r.t C:

  • 使用register关键字
  

W.r.t C ++:

  • 滥用static;现在你应该使用namespace即使是匿名的

或者,我是否误解了你的问题?

答案 11 :(得分:1)

手动重新计算指针是一种古老的做法,让我绝对疯狂。我每个月修复1-2个错误,因为有人试图变聪明并手动重新计算一个指针。只需使用智能指针。 节省您的时间。