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