Mari kita asumsikan saya ingin menulis fungsi yang menggabungkan dua string dalam C. Cara saya akan menulisnya adalah:
void concat(char s[], char t[]){
int i = 0;
int j = 0;
while (s[i] != '\0'){
i++;
}
while (t[j] != '\0'){
s[i] = t[j];
i++;
j++;
}
s[i] = '\0';
}
Namun, K&R dalam buku mereka menerapkannya secara berbeda, terutama termasuk sebanyak mungkin dalam bagian loop sementara:
void concat(char s[], char t[]){
int i, j;
i = j = 0;
while (s[i] != '\0') i++;
while ((s[i++]=t[j++]) != '\0');
}
Cara mana yang lebih disukai? Apakah didorong atau tidak disarankan untuk menulis kode seperti yang dilakukan K&R? Saya percaya versi saya akan lebih mudah dibaca oleh orang lain.
programming-practices
coding-style
Richard Smith
sumber
sumber
while (*s++ = *t++);
(C saya sangat berkarat, apakah saya perlu parens di sana untuk diutamakan operator?) Apakah K&R merilis versi baru dari buku mereka? Buku asli mereka memiliki kode yang sangat ringkas dan idiomatik.'\0'
darit
(while
keluar pertama). Ini akan meninggalkans
string yang dihasilkan tanpa berakhir'\0'
(kecuali lokasi memori sudah memusatkan perhatian). Blok kode kedua akan membuat salinan terminating'\0'
sebelum keluar dariwhile
loop.Jawaban:
Selalu lebih suka kejelasan daripada kepintaran. Di masa lalu, programmer terbaik adalah kode yang tidak dapat dimengerti oleh siapa pun. "Aku tidak bisa memahami kodenya, dia pasti jenius , " kata mereka. Saat ini programmer terbaik adalah kode yang siapa pun dapat mengerti. Waktu komputer lebih murah sekarang daripada waktu programmer.
Jadi, tidak diragukan lagi, saya akan memilih opsi A. Dan itu adalah jawaban pasti saya.
sumber
if (a=b)
bisa dengan mudah dikiraif (a==b)
.while ((c = fgetc(file)) != EOF)
sebagai yang pertama muncul di pikiran saya.Aturan emas, sama seperti dalam jawaban Tulains Córdova, adalah memastikan untuk menulis kode yang dapat dipahami. Tapi saya tidak setuju dengan kesimpulannya. Aturan emas itu berarti menulis kode yang bisa dimengerti oleh programmer tipikal yang mempertahankan kode Anda. Dan Anda adalah hakim terbaik siapa programmer khas yang akhirnya akan mempertahankan kode Anda.
Untuk programmer yang tidak memulai dengan C, versi pertama mungkin lebih mudah dipahami, karena alasan yang Anda sudah tahu.
Bagi mereka yang tumbuh dengan gaya C, versi kedua mungkin lebih mudah untuk dipahami: bagi mereka, sama-sama dapat dimengerti apa yang dilakukan oleh kode, bagi mereka, itu meninggalkan lebih sedikit pertanyaan mengapa ditulis seperti apa adanya, dan bagi mereka , lebih sedikit ruang vertikal berarti lebih banyak konteks dapat ditampilkan di layar.
Anda harus mengandalkan akal sehat Anda sendiri. Kepada audiens mana Anda ingin membuat kode Anda paling mudah dipahami? Apakah kode ini ditulis untuk perusahaan? Maka target audiens mungkin adalah programmer lain di perusahaan itu. Apakah ini proyek hobi pribadi yang tidak akan dikerjakan oleh siapa pun kecuali Anda sendiri? Maka Anda adalah target audiens Anda sendiri. Apakah kode ini ingin Anda bagikan dengan orang lain? Lalu yang lainnya adalah audiens target Anda. Pilih versi yang cocok dengan audiens itu. Sayangnya, tidak ada satu pun cara yang disukai untuk mendorong.
sumber
EDIT: Baris
s[i] = '\0';
ditambahkan ke versi pertama, dengan demikian memperbaikinya seperti yang dijelaskan dalam varian 1 di bawah ini, jadi ini tidak berlaku untuk versi kode pertanyaan saat ini lagi.Versi kedua memiliki keunggulan khas menjadi benar , sementara yang pertama tidak - itu tidak null-mengakhiri string target dengan benar.
"Penugasan dalam kondisi" memungkinkan mengekspresikan konsep "salin setiap karakter sebelum memeriksa karakter nol" dengan sangat ringkas dan dengan cara yang membuat pengoptimalan untuk kompiler menjadi lebih mudah, meskipun banyak insinyur perangkat lunak saat ini menemukan gaya kode ini kurang dapat dibaca . Jika Anda bersikeras menggunakan versi pertama, Anda harus melakukannya juga
sumber
Jawaban oleh Tulains Córdova dan hvd mencakup aspek kejelasan / keterbacaan dengan cukup baik. Izinkan saya memberikan pelingkupan sebagai alasan lain yang mendukung penugasan dalam kondisi. Variabel yang dideklarasikan dalam kondisi hanya tersedia dalam lingkup pernyataan itu. Anda tidak dapat menggunakan variabel itu setelah itu secara tidak sengaja. The untuk lingkaran telah melakukan hal ini untuk usia. Dan itu cukup penting bahwa C ++ 17 yang akan datang memperkenalkan sintaksis yang sama untuk jika dan beralih :
sumber
Tidak. Ini adalah gaya C yang sangat standar dan normal. Contoh Anda buruk, karena seharusnya hanya untuk perulangan, tetapi secara umum tidak ada yang salah dengan itu
misalnya (atau dengan sementara).
sumber
!= NULL
.(x != NULL) != 0
. Bagaimanapun, itulah yang benar - benar diperiksa oleh C , bukan?Pada zaman K&R
while ((s[i++]=t[j++]) != '\0')
akan memetakan ke satu instruksi pada sebagian besar CPU (saya harapkan VAC Desember)Ada hari
(Catatan tentang selalu menggunakan kawat gigi - set kode pertama mengambil lebih banyak ruang karena memiliki beberapa "tidak dibutuhkan"
{}
, dalam pengalaman saya ini sering mencegah kode yang telah digabung dengan buruk dari kompiler dan memungkinkan kesalahan dengan penempatan ";" yang salah menjadi terdeteksi oleh alat.)Namun di masa lalu kode versi ke-2 akan membaca. (Jika saya benar!)
sumber
Bahkan bisa melakukan ini sama sekali adalah ide yang sangat buruk. Bahasa sehari-hari dikenal sebagai "The Last Last Bug," seperti:
Meskipun Anda tidak akan membuat kesalahan yang cukup parah, sangat mudah untuk secara tidak sengaja mengacaukan dan menyebabkan kesalahan yang sulit ditemukan dalam basis kode Anda. Sebagian besar kompiler modern akan menyisipkan peringatan untuk tugas di dalam kondisi. Mereka ada di sana karena suatu alasan, dan Anda sebaiknya memperhatikan mereka dan menghindari konstruksi ini.
sumber
CODE_RED = alert
sehingga memberi kesalahan kompiler.Kedua gaya terbentuk dengan baik, benar, dan tepat. Mana yang lebih tepat tergantung pada pedoman gaya perusahaan Anda. IDE modern akan memfasilitasi penggunaan kedua gaya melalui penggunaan sintaks langsung yang secara eksplisit menyoroti area yang mungkin menjadi sumber kebingungan.
Misalnya, ekspresi berikut disorot oleh Netbeans :
dengan alasan "penugasan tak disengaja".
Untuk secara eksplisit memberi tahu Netbeans bahwa "ya, aku benar-benar bermaksud melakukan itu ...", ungkapan itu dapat dibungkus dalam satu set tanda kurung.
Pada akhirnya, itu semua bermuara pada pedoman gaya perusahaan dan ketersediaan alat-alat modern untuk memfasilitasi proses pengembangan.
sumber