通常,当我看到像您这样发布在此处的代码时,我会对其进行编辑,因为我们讨厌水平滚动。但是,由于这是您的问题的一部分,因此我将在此处向您显示编辑内容:
int extractMessage(char keyWord[25], char cipherText[17424],
int rowSize, char message[388])
{
int keyColumn = 0;
int cipherColumn = 0;
int offset = 1;
int nextWord = 1;
int lengthOfWord = 0;
int lengthOfCipher = 0;
lengthOfWord = length(keyWord);
lengthOfCipher = length(cipherText);
while (keyWord[keyColumn] != cipherText[cipherColumn]) {
cipherColumn++;
if (keyWord[keyColumn + offset]
!= cipherText[cipherColumn + (rowSize*nextWord) + nextWord]) {
cipherColumn++;
continue;
}
}
}
这突破可能会令人吃惊,但它比与横向滚动的版本更具可读性,它是优于缩短名字i
,j
和k
。
这并不是说你不应该使用i
,j
和k
。在索引3个嵌套for
循环时,这些名字很不错。但是,这里的名字确实是我关于您期望发生的事情的唯一线索。特别是由于此代码实际上没有执行任何操作。
遵循变量名长度的最佳规则是范围。变量的生存时间越长,其名称就必须与其他变量竞争。名称CandiedOrange在堆栈交换中是唯一的。如果我们在聊天中,您可能会称我为“ Candy”。但是现在,您所处的名称可能会与Candide,Candy Chiu或Candyfloss混淆。因此,范围越长,名称应越长。范围越短,名称就越短。
线路长度应永远决定名称的长度。如果您觉得这样,那么可以找到另一种方式来布置代码。我们有许多工具可以帮助您做到这一点。
我要寻找的第一件事是消除不必要的噪音。不幸的是,这个例子没有做任何事情,所以都是不必要的噪音。我需要处理一些事情,所以首先让它做点什么。
int calcCipherColumn(char keyWord[25], char cipherText[17424],
int rowSize, char message[388])
{
int keyColumn = 0;
int cipherColumn = 0;
int offset = 1;
int nextWord = 1;
int lengthOfWord = 0;
int lengthOfCipher = 0;
lengthOfWord = length(keyWord);
lengthOfCipher = length(cipherText);
while (keyWord[keyColumn] != cipherText[cipherColumn]) {
cipherColumn++;
if (keyWord[keyColumn + offset]
!= cipherText[cipherColumn + (rowSize*nextWord) + nextWord]) {
cipherColumn++;
continue;
}
}
return cipherColumn;
}
在那里,现在它正在执行某些操作。
现在,它可以执行操作了,我可以看到可以摆脱的东西了。这种长度的东西甚至没有使用。这continue
也不做任何事情。
int calcCipherColumn(char keyWord[25], char cipherText[17424],
int rowSize, char message[388])
{
int keyColumn = 0;
int cipherColumn = 0;
int offset = 1;
int nextWord = 1;
while (keyWord[keyColumn] != cipherText[cipherColumn]) {
cipherColumn++;
if (keyWord[keyColumn + offset]
!= cipherText[cipherColumn + (rowSize*nextWord) + nextWord]) {
cipherColumn++;
}
}
return cipherColumn;
}
让我们进行一些小的空白调整,因为我们生活在源代码控制的世界中,当行被报告为更改的唯一原因是因为它在做不同的事情,而不是因为它的一部分必须在列中对齐时,这很好。
int calcCipherColumn(char keyWord[25], char cipherText[17424],
int rowSize, char message[388])
{
int keyColumn = 0;
int cipherColumn = 0;
int offset = 1;
int nextWord = 1;
while (keyWord[keyColumn] != cipherText[cipherColumn]) {
cipherColumn++;
if (keyWord[keyColumn + offset]
!= cipherText[cipherColumn + (rowSize*nextWord) + nextWord]) {
cipherColumn++;
}
}
return cipherColumn;
}
是的,我知道它的可读性稍差,但否则,使用vdiff工具检测更改的用户会发疯。
现在,让我们修复这些愚蠢的换行符,因为我们试图保持在行长限制内。
int calcCipherColumn(
char keyWord[25],
char cipherText[17424],
int rowSize,
char message[388]
) {
int keyColumn = 0;
int keyOffset = 1;
int nextWord = 1;
int cipherColumn = 0;
int cipherOffset = (rowSize * nextWord) + nextWord;
char key = keyWord[keyColumn];
char keyNext = keyWord[keyColumn + keyOffset];
while (key != cipherText[cipherColumn]) {
cipherColumn++;
if (keyNext != cipherText[cipherColumn + cipherOffset]) {
cipherColumn++;
}
}
return cipherColumn;
}
在那里,循环中的逻辑现在专注于循环中的变化。实际上,除cipherColumn
标记外的所有内容都可以标记final
。嘿!看那个。我们现在有空间来做。
我要做的就是再添加3个变量,重命名一个变量,然后重新排列一下。结果恰好使得线足够短,可以适应而没有愚蠢的换行!=
。
确定名称key
和keyNext
没有那么描述性,但是它们每个仅使用一次,使用寿命不长,最重要的是,在循环中没有做任何有趣的事情。因此,它们不必是。通过引入额外的变量,我们现在可以根据需要将其名称加长。事情发生了变化,所以最终我们可能需要这样做。如果这样做,我们有呼吸的空间就很好。
我还自由地向您展示了Jeff Grigg的形式6变体样式,布局了输入参数以遵守行长限制。
cipherColumn + (rowSize*nextWord) + nextWord
这清楚地表明,计算是什么了,例如?我敢打赌,这个名字比计算的要短,因此您将获得可读性和减少的行长。也不要对齐分配,否则,如果重命名最长的变量,则必须全部移动分配。