Normalmente cuando veo un código publicado aquí como el tuyo, lo edito, porque odiamos el desplazamiento horizontal. Pero como esa es parte de tu pregunta, te mostraré la edición aquí:
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;
}
}
}
Esa ruptura puede ser sorprendente, pero es más fácil de leer que la versión con desplazamiento horizontal, y es mejor que acortar los nombres de i
, j
y k
.
No es que nunca se debe utilizar i
, j
y k
. Esos son buenos nombres al indexar 3 for
bucles anidados . Pero aquí los nombres son realmente mi única pista sobre lo que esperabas que sucediera. Especialmente porque este código en realidad no hace nada.
La mejor regla a seguir en la longitud del nombre variable es el alcance. Cuanto más viva una variable, más variables compañeras tendrá que competir con su nombre. El nombre CandiedOrange es único en el intercambio de pila. Si estuviéramos en un chat, podrías llamarme "Candy". Pero en este momento, estás en un ámbito en el que ese nombre podría confundirse con Candide , Candy Chiu o Candyfloss . Entonces, cuanto más largo sea el alcance, más largo debe ser el nombre. Cuanto más corto sea el alcance, más corto puede ser el nombre.
La longitud de la línea nunca debe dictar la longitud del nombre. Si siente que es así, busque una forma diferente de diseñar su código. Tenemos muchas herramientas para ayudarlo a hacer eso.
Una de las primeras cosas que busco es un ruido innecesario para eliminar. Lamentablemente, este ejemplo no hace nada, por lo que todo es ruido innecesario. Necesito algo con lo que trabajar, así que primero hagamos que haga algo.
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;
}
Ahí, ahora hace algo.
Ahora que hace algo, puedo ver de qué me puedo deshacer. Estas cosas de longitud ni siquiera se usan. Esto continue
tampoco hace nada.
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;
}
Hagamos algunos ajustes menores en el espacio en blanco, porque vivimos en un mundo de control de fuente y es agradable cuando la única razón por la que una línea se informa como modificada es porque está haciendo algo diferente, no porque parte de ella tenga que alinearse en una columna.
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í, sé que es un poco menos legible, pero de lo contrario enloquecerá a las personas que usan herramientas vdiff para detectar cambios.
Ahora arreglemos estos saltos de línea tontos que tenemos porque estamos tratando de permanecer por debajo de los límites de longitud de línea.
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;
}
Allí, ahora la lógica en el bucle se centra en lo que cambia en el bucle. De hecho, todo excepto cipherColumn
podría estar marcado final
. Y oye! Mira eso. Ahora tenemos espacio para hacerlo.
Todo lo que hice fue agregar 3 variables más, renombrar una y reorganizarlas un poco. Y el resultado simplemente hizo que las líneas fueran lo suficientemente cortas como para caber sin un salto de línea tonto !=
.
Claro los nombres key
ykeyNext
no son tan descriptivos, pero cada uno solo se usa una vez, no viven tanto tiempo y, lo más importante, no están haciendo nada tan interesante en el ciclo. Entonces no necesitan serlo. Al introducir variables adicionales, ahora tenemos espacio para alargar sus nombres si es necesario. Las cosas cambian, por lo que eventualmente tendremos que hacerlo. Si lo hacemos, es bueno que tengamos espacio para respirar.
También me tomé la libertad de mostrarle el estilo variante de la forma 6 de Jeff Grigg de diseñar parámetros de entrada para respetar las restricciones de longitud de línea.
cipherColumn + (rowSize*nextWord) + nextWord
que deje claro lo que el cálculo es de , por ejemplo? Apuesto a que ese nombre es más corto que el cálculo, por lo que obtienes un beneficio de legibilidad y una longitud de línea reducida. Tampoco alinee las asignaciones, o debe moverlas todas si cambia el nombre de la variable más larga.