Thông thường khi tôi thấy mã được đăng ở đây giống như của bạn, tôi chỉnh sửa nó, vì chúng tôi ghét cuộn ngang. Nhưng vì đó là một phần câu hỏi của bạn, tôi sẽ chỉ cho bạn chỉnh sửa ở đây:
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;
}
}
}
Nghỉ mà bạn có thể ngạc nhiên, nhưng nó dễ đọc hơn so với phiên bản cuộn ngang, và đó là tốt hơn so với rút ngắn tên để i
, j
và k
.
Nó không phải là bạn không bao giờ nên sử dụng i
, j
và k
. Đó là những cái tên đẹp khi lập chỉ mục 3 for
vòng lặp lồng nhau . Nhưng ở đây, những cái tên thực sự là manh mối duy nhất của tôi về những gì bạn dự kiến sẽ xảy ra. Đặc biệt là vì mã này không thực sự làm gì cả.
Quy tắc tốt nhất để làm theo chiều dài tên biến là phạm vi. Cuộc sống biến càng dài, tên biến của nó càng phải cạnh tranh. Tên CandiedOrange là duy nhất trên trao đổi ngăn xếp. Nếu chúng tôi đang trò chuyện, bạn có thể gọi tôi là "Candy". Nhưng ngay bây giờ, bạn đang ở trong một phạm vi mà tên đó có thể bị nhầm lẫn với Candide , Candy Chiu hoặc Candyfloss . Vì vậy, phạm vi càng dài, tên càng dài. Phạm vi càng ngắn, tên càng ngắn.
Độ dài dòng không bao giờ chỉ ra chiều dài tên. Nếu bạn cảm thấy như vậy thì hãy tìm một cách khác để trình bày mã của bạn. Chúng tôi có nhiều công cụ để giúp bạn làm điều đó.
Một trong những điều đầu tiên tôi tìm kiếm là tiếng ồn không cần thiết để loại bỏ. Thật không may, ví dụ này không làm gì cả, vì vậy tất cả đều là tiếng ồn không cần thiết. Tôi cần một cái gì đó để làm việc với vì vậy trước tiên hãy làm cho nó làm một cái gì đó.
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;
}
Ở đó, bây giờ nó làm một cái gì đó.
Bây giờ nó làm một cái gì đó, tôi có thể thấy những gì tôi có thể thoát khỏi. Thứ chiều dài này thậm chí không được sử dụng. Điều này continue
cũng không làm gì cả.
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;
}
Chúng ta hãy thực hiện một số điều chỉnh không gian trắng nhỏ, bởi vì chúng ta sống trong một thế giới kiểm soát nguồn và thật tuyệt khi lý do duy nhất một dòng được báo cáo là thay đổi là vì nó làm một cái gì đó khác nhau, không phải vì một phần của nó phải xếp hàng trong một cột.
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;
}
Vâng, tôi biết nó hơi khó đọc nhưng nếu không, bạn sẽ khiến mọi người phát điên khi sử dụng các công cụ vdiff để phát hiện các thay đổi.
Bây giờ chúng ta hãy sửa những ngắt dòng ngớ ngẩn mà chúng ta có bởi vì chúng ta đang cố gắng duy trì giới hạn độ dài của dòng.
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;
}
Ở đó, bây giờ logic trong vòng lặp được tập trung vào những gì thay đổi trong vòng lặp. Trong thực tế, tất cả mọi thứ ngoại trừ cipherColumn
có thể được đánh dấu final
. Và này! Nhìn kìa. Bây giờ chúng ta có chỗ để làm điều đó.
Tất cả những gì tôi đã làm là thêm 3 biến nữa, đổi tên một và sắp xếp lại chúng một chút. Và kết quả chỉ xảy ra để làm cho các dòng đủ ngắn để phù hợp mà không có một dòng ngắt ngớ ngẩn trên !=
.
Chắc chắn tên key
và keyNext
không phải là mô tả, nhưng mỗi cái chỉ được sử dụng một lần, không sống lâu như vậy và quan trọng nhất là không làm bất cứ điều gì thú vị trong vòng lặp. Vì vậy, họ không cần phải như vậy. Bằng cách giới thiệu các biến phụ, giờ đây chúng ta có chỗ để đặt tên của chúng dài nếu chúng ta cần. Mọi thứ thay đổi, vì vậy cuối cùng chúng ta có thể cần phải. Nếu chúng ta làm, thật tốt khi chúng ta có phòng thở.
Tôi cũng có quyền tự do chỉ cho bạn kiểu biến thể mẫu 6 của Jeff Grigg trong việc đưa ra các tham số đầu vào để tôn trọng các hạn chế độ dài dòng.
cipherColumn + (rowSize*nextWord) + nextWord
mà làm cho nó rõ ràng những gì tính toán đó là cho , ví dụ? Tôi cá rằng tên đó ngắn hơn tính toán, vì vậy bạn sẽ có được lợi ích dễ đọc và giảm độ dài dòng. Ngoài ra, không căn chỉnh các bài tập, hoặc bạn phải di chuyển tất cả chúng nếu bạn đổi tên biến dài nhất.