Normalmente quando vedo un codice pubblicato qui come il tuo, lo modifico, perché odiamo lo scorrimento orizzontale. Ma poiché fa parte della tua domanda, ti mostrerò la modifica qui:
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;
}
}
}
Quella pausa può essere sorprendente, ma è più leggibile rispetto alla versione con scorrimento orizzontale, ed è meglio che accorciando i nomi da i
, j
e k
.
Non è che non si dovrebbe mai usare i
, j
e k
. Questi sono nomi validi quando si indicizzano 3 for
loop nidificati . Ma qui i nomi sono davvero il mio unico indizio su cosa ti aspettavi che accadesse. Soprattutto perché questo codice in realtà non fa nulla.
La migliore regola da seguire sulla lunghezza del nome della variabile è l'ambito. Più a lungo vive una variabile, più altre variabili con cui il suo nome deve competere. Il nome CandiedOrange è unico nello scambio di stack. Se fossimo in chat, potresti semplicemente chiamarmi "Candy". Ma in questo momento, sei in un ambito in cui quel nome potrebbe essere confuso con Candide , Candy Chiu o Candyfloss . Quindi più lungo è l'ambito, più lungo dovrebbe essere il nome. Più breve è l'ambito, più breve può essere il nome.
La lunghezza della linea non dovrebbe mai dettare la lunghezza del nome. Se ne hai voglia, trova un modo diverso di strutturare il tuo codice. Abbiamo molti strumenti per aiutarti a farlo.
Una delle prime cose che cerco è il rumore inutile per sbarazzarsi di. Purtroppo questo esempio non fa nulla, quindi è tutto rumore inutile. Ho bisogno di qualcosa con cui lavorare, quindi prima facciamolo fare qualcosa.
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;
}
Ecco, ora fa qualcosa.
Ora che fa qualcosa, posso vedere di cosa posso liberarmi. Questa roba non è nemmeno usata. continue
Neanche questo fa nulla.
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;
}
Facciamo alcune piccole modifiche agli spazi bianchi, perché viviamo in un mondo di controllo del codice sorgente ed è bello quando l'unica ragione per cui una riga viene segnalata come cambiata è perché sta facendo qualcosa di diverso, non perché una parte di essa doveva essere allineata in una colonna.
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;
}
Sì, lo so che è leggermente meno leggibile, ma altrimenti farai impazzire le persone che usano gli strumenti vdiff per rilevare le modifiche.
Ora risolviamo queste sciocche interruzioni di linea che abbiamo perché stiamo cercando di rimanere sotto i limiti di lunghezza della linea.
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;
}
Lì, ora la logica nel loop è focalizzata su ciò che cambia nel loop. In effetti, tutto tranne cipherColumn
potrebbe essere contrassegnato final
. Ehi! Guarda quello. Ora abbiamo spazio per farlo.
Tutto quello che ho fatto è stato aggiungere altre 3 variabili, rinominarne una e riordinarle un po '. E il risultato è appena arrivato a rendere le linee abbastanza corte da adattarsi senza una sciocca interruzione !=
.
Sicuramente i nomi key
e keyNext
non sono così descrittivi, ma ognuno di essi si abitua solo una volta, non vive così a lungo e, cosa più importante, non sta facendo nulla di così interessante nel ciclo. Quindi non hanno bisogno di essere. Introducendo variabili extra, ora abbiamo spazio per rendere lunghi i loro nomi, se necessario. Le cose cambiano, quindi alla fine potremmo averne bisogno. Se lo facciamo, è bello avere spazio per respirare.
Mi sono anche preso la libertà di mostrarti lo stile variante 6 di Jeff Grigg per la disposizione dei parametri di input per rispettare le restrizioni sulla lunghezza della linea.
cipherColumn + (rowSize*nextWord) + nextWord
che rende chiaro ciò che il calcolo è per , per esempio? Scommetto che quel nome è più breve del calcolo, quindi ottieni un vantaggio di leggibilità e una lunghezza della linea ridotta. Inoltre, non allineare le assegnazioni o devi spostarle tutte se rinomini la variabile più lunga.