Zwykle, gdy widzę kod opublikowany tutaj jak twój, edytuję go, ponieważ nienawidzimy przewijania w poziomie. Ale ponieważ jest to część twojego pytania, pokażę ci edycję tutaj:
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;
}
}
}
Że przerwa może być zaskakujące, ale to jest bardziej czytelny niż wersja z poziomego przewijania, i to lepiej niż skrócenie nazwy do i
, j
, i k
.
To nie tak, że nigdy nie powinno się używać i
, j
i k
. Są to dobre nazwy podczas indeksowania 3 zagnieżdżonych for
pętli. Ale tutaj nazwy są moją jedyną wskazówką na temat tego, czego się spodziewałeś. Zwłaszcza, że ten kod nic nie robi.
Najlepszą regułą dotyczącą długości nazwy zmiennej jest zakres. Im dłużej żyje zmienna, tym więcej innych zmiennych musi konkurować z jej nazwą. Nazwa CandiedOrange jest unikalna pod względem wymiany stosów. Gdybyśmy byli na czacie, możesz po prostu nazwać mnie „Candy”. Ale teraz jesteś w zasięgu, w którym ta nazwa mogłaby być mylona Candide , Candy Chiu lub Candyfloss . Im dłuższy zakres, tym dłuższa powinna być nazwa. Im krótszy zakres, tym krótsza może być nazwa.
Długość linii nigdy nie powinna dyktować długości nazwy. Jeśli masz na to ochotę, znajdź inny sposób ułożenia kodu. Mamy wiele narzędzi, które Ci w tym pomogą.
Jedną z pierwszych rzeczy, których szukam, jest niepotrzebny hałas do pozbycia się. Niestety ten przykład nic nie robi, więc to wszystko niepotrzebny hałas. Potrzebuję czegoś do pracy, więc najpierw zróbmy coś.
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;
}
Tam, teraz coś robi.
Teraz, gdy coś robi, widzę, czego mogę się pozbyć. Ta długość nie jest nawet używana. To też continue
nic nie robi.
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;
}
Dokonajmy drobnych poprawek w białej przestrzeni, ponieważ żyjemy w świecie kontroli źródła i jest to miłe, gdy jedynym powodem, dla którego linia jest zgłaszana jako zmieniona, jest to, że robi coś innego, a nie dlatego, że część z niej musiała ustawiać się w kolumnie.
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;
}
Tak, wiem, że jest to nieco mniej czytelne, ale w przeciwnym razie doprowadzisz ludzi do szaleństwa, którzy używają narzędzi vdiff do wykrywania zmian.
Teraz naprawmy te głupie podziały linii, które mamy, ponieważ staramy się trzymać poniżej limitów długości linii.
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;
}
Tam, teraz logika w pętli koncentruje się na zmianach w pętli. W rzeczywistości wszystko oprócz cipherColumn
można oznaczyć final
. I hej! Spójrz na to. Teraz mamy na to miejsce.
Wszystko, co zrobiłem, to dodać 3 kolejne zmienne, zmienić nazwę na jedną i trochę zmienić ich kolejność. Rezultatem było to, że linie były wystarczająco krótkie, aby zmieściły się bez głupiego łamania linii !=
.
Pewnie nazwiska key
ikeyNext
nie są tak opisowe, ale każdy tylko przyzwyczaić się raz, nie mieszkają tak długo, a co najważniejsze nie robią niczego, co ciekawe w pętli. Więc nie muszą tak być. Wprowadzając dodatkowe zmienne, mamy teraz możliwość, aby ich nazwy były długie, jeśli zajdzie taka potrzeba. Rzeczy się zmieniają, więc w końcu możemy potrzebować. Jeśli tak, to fajnie, że mamy pokój do oddychania.
Pozwoliłem sobie również na pokazanie ci wariantu 6 stylu Jeffa Grigga, który określa parametry wejściowe w celu przestrzegania ograniczeń długości linii.
cipherColumn + (rowSize*nextWord) + nextWord
to sprawia, że jasne, co to obliczenie jest za , na przykład? Założę się, że ta nazwa jest krótsza niż obliczenie, więc zyskujesz na czytelności i zmniejszonej długości linii. Nie wyrównuj też przypisań, albo musisz przenieść je wszystkie, jeśli zmienisz nazwę najdłuższej zmiennej.