Normalerweise bearbeite ich den Code, wenn ich ihn wie Ihren hier sehe, weil wir horizontales Scrollen hassen. Da dies jedoch Teil Ihrer Frage ist, zeige ich Ihnen die Bearbeitung hier:
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;
}
}
}
Das Pause mag überraschend sein, aber es ist besser lesbar als die Version mit horizontalem Bildlauf, und es ist besser als die Namen der Verkürzung i
, j
und k
.
Es ist nicht , dass Sie nie benutzen sollten i
, j
und k
. Dies sind gute Namen für die Indizierung von 3 verschachtelten for
Schleifen. Aber hier sind die Namen wirklich mein einziger Hinweis darauf, was Sie erwartet haben. Zumal dieser Code eigentlich gar nichts macht.
Die beste Regel für die Länge von Variablennamen ist der Gültigkeitsbereich. Je länger eine Variable lebt, desto mehr andere Variablen müssen mit ihrem Namen konkurrieren. Der Name CandiedOrange ist beim Stapelaustausch eindeutig. Wenn wir in einem Chat wären, könntest du mich einfach "Candy" nennen. Aber im Moment befinden Sie sich in einem Bereich, in dem dieser Name mit Candide , Candy Chiu oder Candyfloss verwechselt werden könnte . Je länger der Gültigkeitsbereich, desto länger sollte der Name sein. Je kürzer der Gültigkeitsbereich, desto kürzer kann der Name sein.
Die Zeilenlänge sollte niemals die Länge des Namens bestimmen. Wenn Sie das Gefühl haben, finden Sie einen anderen Weg, um Ihren Code zu gestalten. Wir haben viele Tools, die Ihnen dabei helfen.
Eines der ersten Dinge, die ich suche, ist unnötiger Lärm, den ich loswerden muss. Leider macht dieses Beispiel nichts, daher ist alles unnötiges Rauschen. Ich brauche etwas zum Arbeiten, also lassen wir es zuerst etwas tun.
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;
}
Dort macht es jetzt etwas.
Jetzt, wo es etwas tut, kann ich sehen, was ich loswerden kann. Diese Länge Zeug wird nicht einmal verwendet. Das continue
macht auch nichts.
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;
}
Lassen Sie uns ein paar kleinere Änderungen an Leerzeichen vornehmen, da wir in einer Welt der Quellcodeverwaltung leben und es schön ist, wenn eine Zeile nur deshalb als geändert gemeldet wird, weil sie etwas anderes tut, und nicht, weil ein Teil davon in einer Spalte ausgerichtet werden musste.
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;
}
Ja, ich weiß, dass es etwas weniger lesbar ist, aber sonst werden Sie Leute verrückt machen, die vdiff-Tools verwenden, um Änderungen zu erkennen.
Beheben wir nun diese dummen Zeilenumbrüche, die wir haben, weil wir versuchen, unter den Grenzen der Zeilenlänge zu bleiben.
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;
}
Dort konzentriert sich nun die Logik in der Schleife darauf, was sich in der Schleife ändert. Tatsächlich konnte alles außer cipherColumn
markiert werden final
. Und hey! Sieh dir das an. Wir haben jetzt Raum dafür.
Alles, was ich getan habe, war, 3 weitere Variablen hinzuzufügen, eine umzubenennen und sie ein wenig neu anzuordnen. Und das Ergebnis war, dass die Linien kurz genug waren, um ohne dummen Zeilenumbruch zu passen !=
.
Sicher , die Namen key
und keyNext
ist nicht so beschreibend, aber sie jeweils nur einmal gewöhnen, nicht so lange leben, und vor allem nicht etwas zu tun , dass in der Schleife interessant. Sie müssen es also nicht sein. Durch die Einführung zusätzlicher Variablen haben wir jetzt Platz, um ihre Namen zu verlängern, wenn dies erforderlich ist. Die Dinge ändern sich, also müssen wir es eventuell tun. Wenn wir das tun, ist es schön, dass wir Raum zum Atmen haben.
Ich habe mir auch die Freiheit genommen, Ihnen Jeff Griggs Form-6-Variante zu zeigen, bei der Eingabeparameter so angeordnet werden, dass sie die Beschränkungen der Zeilenlänge einhalten.
cipherColumn + (rowSize*nextWord) + nextWord
das macht es , dass die Berechnung klar , was ist für , zum Beispiel? Ich wette, dieser Name ist kürzer als die Berechnung, sodass Sie einen Vorteil für die Lesbarkeit und eine reduzierte Zeilenlänge erhalten. Richten Sie auch keine Zuweisungen aus, oder Sie müssen alle verschieben, wenn Sie die längste Variable umbenennen.