โดยปกติเมื่อฉันเห็นรหัสที่โพสต์ที่นี่เช่นคุณฉันแก้ไขเพราะเราเกลียดการเลื่อนในแนวนอน แต่เนื่องจากเป็นส่วนหนึ่งของคำถามของคุณฉันจะแสดงการแก้ไขที่นี่:
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
เหล่านี้เป็นชื่อที่ดีเมื่อทำดัชนีfor
ลูปซ้อนกัน 3 รายการ แต่ที่นี่ชื่อเป็นเบาะแสเดียวของฉันเกี่ยวกับสิ่งที่คุณคาดว่าจะเกิดขึ้น โดยเฉพาะอย่างยิ่งเนื่องจากรหัสนี้ไม่ได้ทำอะไรเลย
กฎที่ดีที่สุดที่จะติดตามความยาวชื่อตัวแปรคือขอบเขต ยิ่งตัวแปรมีอายุการใช้งานนานเท่าไหร่ตัวแปรที่ยิ่งใหญ่กว่าชื่อของมันก็จะต้องแข่งขันกัน ชื่อCandiedOrangeไม่ซ้ำกันในการแลกเปลี่ยนสแต็ค ถ้าเราอยู่ในการแชทคุณอาจเรียกฉันว่า "แคนดี้" แต่ตอนนี้คุณอยู่ในขอบเขตที่ชื่อที่อาจจะสับสนกับCandide , ขนมหวานชิวหรือ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
ที่ทำให้ชัดเจนว่าการคำนวณนั้นใช้เพื่ออะไร ฉันเดิมพันว่าชื่อนั้นสั้นกว่าการคำนวณดังนั้นคุณจะได้รับประโยชน์การอ่านและความยาวบรรทัดลดลง อย่าปรับการกำหนดหรือคุณต้องย้ายมันทั้งหมดถ้าคุณเปลี่ยนชื่อตัวแปรที่ยาวที่สุด