Normalde burada sizinki gibi yayınlanan kodları gördüğümde, onu düzenlerim, çünkü yatay kaydırmadan nefret ederiz. Ancak bu, sorunuzun bir parçası olduğundan, size düzenlemeyi burada göstereceğim:
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;
}
}
}
Bu kırılma şaşırtıcı olabilir, ancak yatay kaydırma ile sürümden daha okunabilir, ve o isimler kısaltarak daha iyi i
, j
ve k
.
Bu kullanmaması gerektiğini değil i
, j
ve k
. 3 iç içe for
döngüyü dizine eklerken bunlar iyi adlardır . Ama burada isimler gerçekten ne olmasını beklediğime dair tek ipucum. Özellikle bu kod aslında hiçbir şey yapmadığı için.
Değişken adı uzunluğunda uygulanacak en iyi kural kapsamdır. Bir değişken ne kadar uzun yaşarsa, adının rekabet etmesi gereken diğer değişkenler de o kadar fazla olur. CandiedOrange adı yığın değişiminde benzersizdir. Bir sohbette olsaydık, bana sadece "Şeker" diyebilirsin. Ama şu anda, bu ismin Candide , Candy Chiu veya Candyfloss ile karıştırılabileceği bir kapsamın içindesiniz . Yani kapsam ne kadar uzun olursa, ad o kadar uzun olmalıdır. Kapsam ne kadar kısa olursa, ad o kadar kısa olabilir.
Satır uzunluğu asla ad uzunluğunu dikte etmemelidir . Eğer öyle olduğunu düşünüyorsanız kodunuzu düzenlemek için farklı bir yol bulmak. Bunu yapmanıza yardımcı olacak birçok aracımız var.
Aradığım ilk şeylerden biri, kurtulmak için gereksiz gürültüdür. Ne yazık ki bu örnek hiçbir şey yapmaz, bu yüzden hepsi gereksiz gürültüdür. Çalışmak için bir şeye ihtiyacım var, bu yüzden önce bir şey yapalım.
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;
}
Orada, şimdi bir şey yapıyor.
Şimdi bir şey yaptığını görebildiğim şeyden anlayabiliyorum. Bu uzunluktaki şeyler bile kullanılmıyor. Bu continue
da hiçbir şey yapmıyor.
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;
}
Bazı küçük beyaz boşluk ayarlamaları yapalım, çünkü kaynak kontrolü dünyasında yaşıyoruz ve bir satırın değiştiği bildirilmesinin tek nedeni, bir kısmının bir sütunda sıralanması gerektiği için değil, farklı bir şey yapmasıdır.
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;
}
Evet, biraz daha az okunabilir olduğunu biliyorum, ancak aksi takdirde değişiklikleri tespit etmek için vdiff araçlarını kullanan insanları delirteceksiniz.
Şimdi sahip olduğumuz bu aptal satır sonlarını düzeltelim çünkü satır uzunluğu sınırlarının altında kalmaya çalışıyoruz.
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;
}
Orada, şimdi döngüdeki mantık döngüdeki değişikliklere odaklanıyor. Aslında, hariç her şey cipherColumn
işaretlenebilir final
. Ve hey! Şuna bak. Şimdi bunu yapacak yerimiz var.
Tüm yaptığım 3 değişken daha eklemek, birini yeniden adlandırmak ve biraz yeniden düzenlemek oldu. Ve sonuç sadece çizgileri aptalca bir çizgi kırmadan sığacak kadar kısa hale getirdi !=
.
Tabii isimler key
ve keyNext
değil o tanımlayıcı, ama sadece bir kez alışması her Çok uzun olmayan canlı yapmak ve en önemlisi döngü içinde ilginç olduğu bir şey yapmıyoruz. Yani olmalarına gerek yok. Ekstra değişkenler ekleyerek artık ihtiyaç duymamız halinde isimlerini uzun süre uzatabiliriz. İşler değişir, bu yüzden sonunda yapmamız gerekebilir. Eğer yaparsak, nefes alanımız olması güzel.
Ayrıca, hat uzunluğu kısıtlamalarına uymak için Jeff Grigg'in form 6 değişken giriş parametrelerini gösterme özgürlüğünü de aldım .
cipherColumn + (rowSize*nextWord) + nextWord
o hesaplama ne olduğu açık olduğunu markaları için örneğin? Bahse girerim bu ad hesaplamadan daha kısa olur, böylece okunabilirlik avantajı ve daha az satır uzunluğu elde edersiniz . Ayrıca atamaları hizalamayın veya en uzun değişkeni yeniden adlandırırsanız tümünü taşımanız gerekir.