Обычно, когда я вижу код, размещенный здесь как ваш, я редактирую его, потому что мы ненавидим горизонтальную прокрутку. Но так как это часть вашего вопроса, я покажу вам правку здесь:
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 является уникальным для обмена стека. Если бы мы были в чате, вы могли бы просто назвать меня «Кенди». Но сейчас вы находитесь в области, где это имя можно спутать с 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;
}
Да, я знаю, что это немного менее читабельно, но в противном случае вы сведете с ума людей, которые используют инструменты VDIF для обнаружения изменений.
Теперь давайте исправим эти глупые разрывы строк, которые у нас есть, потому что мы пытаемся не выходить за пределы длины строки.
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
не то, что описательный характер, но каждый из них только один раз привыкаешь, не живут так долго, а самое главное это все , что интересно в цикле не делает. Таким образом, они не должны быть. Благодаря введению дополнительных переменных у нас теперь есть возможность сделать их имена длинными, если это необходимо. Вещи меняются, поэтому в конечном итоге нам может понадобиться. Если мы это сделаем, хорошо, что у нас есть передышка.
Я также позволил себе показать вариант стиля Джеффа Григга в форме 6 для размещения входных параметров с учетом ограничений на длину строки.
cipherColumn + (rowSize*nextWord) + nextWord
что становится ясно , что это расчет для , например? Бьюсь об заклад, это имя короче, чем расчет, так что вы получите преимущество читабельности и уменьшенную длину строки. Также не выравнивайте назначения, или вы должны переместить их все, если вы переименуете самую длинную переменную.