写代码时如何命名变量
计算机界有一句名言:只有两件事情是困难的,缓存失效和命名变量。通过避免不良的开发模式就能避免 80%的错误。下面将讨论我认为不好的命名方式。如果能避免以下错误,就能迫使自己更好地命名变量。
int y;
第一个经典错误是int y;
。我们不应该用单个字母来命名变量。我怀疑这最初来自于计算机科学与数学还没有分家的时候。数学家以简洁而自豪,他们迷恋于最精简的表达方式。现在,我们不是在研究数学,而是在编写代码。因此,对于程序员来说,单字母变量名不会告诉我们关于该变量的任何信息。
device_t bd;
这还远远不够,我认为我们不应该用缩写来命名变量。
Nd* creNd(int dt) {
Nd* nwNd = (Nd*)malloc(sizeof(Nd));
if (nwNd == NULL) {
return NULL;
}
nwNd->dt = dt;
nwNd->nxt = NULL;
return nwNd;
}
void insEd(Nd** hd, int dt) {
Nd* nwNd = creNd(dt);
if (*hd == NULL) {
*hd = nwNd;
return;
}
Nd* cu = *hd;
while (cu->nxt != NULL) {
cur = cur->nxt;
}
cur->nxt = nwNd;
}
看看这两个函数,你能看得出她们的作用吗?
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void insertAtEnd(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
现在呢?上面的缩写取决于上下文,这让我们读代码的耗时大大增加。强行去理解每个项目的命名模式,会让我们在阅读本就不熟悉的代码时感到更加疲惫。缩写的作用有两个,它节省了打字的时间,缩减了代码行数。而现在更大的屏幕已经不再昂贵,IDE 的代码补全功能也越来越好用。现在,缩写变量名实际上的作用微乎其微。
bool bIsVaild;
不要再变量名中添加类型。如果你见多识广的话,你一定见过一种名为匈牙利表示法的编码风格。它的特点是使用变量类型的缩写作为变量的前缀,比如uint32_t uValue;
。这可能源于某些语言变量类型命名无法区分变量有无符号与内存占用量,比如 JS 中常使用var number;
这样的方式声明变量。现在的 C 语言是强类型语言,通过变量的类型就可以得到变量有无符号等信息。因此,完全可以不再在变量前加入代表类型的前缀。而与之类似的,在变量名中加入单位是十分有帮助的,比如int delayMs;
。
class Object: BaseObject
有时我们发现给现有的很抽象的类再新增一个父类是很有帮助的。这是有些人会以 Base 为前缀来命名该父类。这对开发者来说并没有帮助。例如class Dog: BaseDog
,这样 BaseDog 仍然代表一类 Dog。如果你发现自己无法为需要新增的父类取一个好名字,这意味着我们应该重命名子类,例如class PetDog: Dog
。
Utils
有时,你感觉自己很难为一个变量命名。罪魁祸首很可能是代码结构。常见的情况是将全部常用的函数集合进一个名为 Utils 的模块中。有些函数实际上可以集成进一些经常调用该函数的类中。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!