Sebelum kita menulis program C ++ pertama kita, kita perlu mengetahui persyaratan dasar untuk kode C ++, tidak ada sebanyak yang terlihat pada pandangan pertama. Berikut daftar sebenarnya:
- setiap perintah berakhir dengan titik koma ,,
- tidak ada spasi dalam nama-nama perintah dan instruksi lainnya, juga tidak dapat dimulai dengan angka,
- C ++ sensitif huruf. Artinya, CODE, CoDe dan kode dapat melakukan tugas yang sama sekali berbeda,
Ini adalah aturan utama yang menjadi dasar pemrograman di C ++.
2. Aturan dapat dilanggar jika ada keberatan pribadi terhadapnya.
Ini adalah upaya untuk membuat serangkaian rekomendasi umum tanpa memaksakan gaya seragam pada semua orang. Pemrogram berpengalaman biasanya menyesuaikan gaya. Daftar rekomendasi yang ada (atau setidaknya persyaratan untuk membiasakan diri dengan itu) biasanya membuat orang berpikir tentang gaya pemrograman dan mengevaluasi praktik mereka sendiri di bidang ini.
Pemula dan programmer yang tidak berpengalaman, di sisi lain, biasanya menggunakan pedoman gaya untuk lebih memahami jargon programmer.
9. Singkatan dan akronim untuk nama harus huruf kecil.
Menggunakan huruf besar dapat menyebabkan konflik nama seperti yang dijelaskan di atas. Kalau tidak, variabel akan memiliki nama dVD, hTML, dll, yang tidak dapat dibaca. Masalah lain telah dijelaskan di atas, ketika nama dikaitkan dengan yang lain, keterbacaan menurun, kata yang mengikuti singkatan tidak menonjol sebagaimana mestinya.
11. Anggota kelas dengan pengubah pribadi harus diberi sufiks-garis bawah.
Terlepas dari nama dan tipe, cakupan adalah properti paling penting dari suatu variabel. Menentukan pengubah akses secara eksplisit sebagai garis bawah menghilangkan kebingungan antara anggota kelas dan variabel lokal. Ini penting karena variabel kelas lebih penting daripada variabel dalam metode, dan harus diperlakukan lebih hati-hati.
Efek tambahan dari sufiks garis bawah adalah untuk menyelesaikan masalah penamaan dalam metode yang menetapkan nilai, serta dalam konstruktor:
Masalahnya adalah bahwa ada dua opsi untuk menggarisbawahi - dalam bentuk akhiran dan dalam bentuk awalan. Kedua opsi banyak digunakan, tetapi opsi pertama direkomendasikan, karena memberikan keterbacaan yang lebih baik. Perlu dicatat bahwa definisi pengubah akses untuk variabel kadang-kadang titik diperdebatkan. Meskipun tampaknya praktik yang direkomendasikan adalah mendapatkan pendukung dan menjadi lebih umum di kalangan profesional.
12. Variabel khusus harus diberi nama yang sama dengan jenisnya.
batal setTopic (Topik * topik) // JANGAN: batal setTopic (Nilai * topik)
// JANGAN LAKUKAN: batal setTopic (Topik * aTopic)
// JANGAN LAKUKAN: batal setTopic (Topik * t)
void connect (Database * database) // JANGAN: void connect (Database * db)
// JANGAN LAKUKAN: void connect (Database * oracleDB)
Kurangi kompleksitas dengan mengurangi jumlah istilah dan nama yang digunakan. Juga menyederhanakan pengenalan tipe hanya dengan nama variabel.
Jika karena alasan tertentu rekomendasi ini tampaknya tidak sesuai, itu berarti bahwa nama jenis yang dipilih salah.
Variabel non-kustom dapat dinamai sesuai dengan tujuan dan jenisnya:
14. Variabel dengan cakupan besar harus disebut nama panjang, dengan cakupan kecil - pendek.
Nama variabel sementara yang digunakan untuk menyimpan nilai sementara atau indeks sebaiknya dibuat pendek. Seorang programmer yang membaca variabel seperti itu harus dapat mengasumsikan bahwa nilainya tidak digunakan di luar beberapa baris kode. Biasanya ini adalah variabel i, j, k, l, m, n (untuk bilangan bulat), serta c dan d (untuk karakter).
31. Konstanta dalam enumerasi dapat memiliki awalan - nama jenis umum.
Ini memberikan informasi tambahan tentang di mana deklarasi itu berada, konstanta mana yang dijelaskan dalam satu daftar, dan juga konstanta konsep apa.
Pendekatan lain adalah memanggil konstanta sesuai dengan tipe umum mereka: Warna :: RED, Maskapai Penerbangan: AIR_FRANCE, dll.
Perhatikan bahwa nama enumerasi biasanya tunggal, misalnya: enum Color <. >. Nama jamak terlihat bagus ketika diiklankan, tetapi tidak cocok untuk penggunaan praktis.
39. Ketidaklengkapan garis putus-putus harus jelas.
totalSum = a + b + c +
d + e
fungsi (param1, param2,
param3),
setText ("Perpecahan garis panjang"
"menjadi dua bagian."),
untuk (int tableNo = 0, tableNo
Pemutusan garis muncul ketika batas 80 kolom yang dijelaskan di atas dilanggar. Sulit untuk memberikan aturan kerusakan yang ketat, tetapi contoh di atas menunjukkan prinsip umum.
- titik desimal
- istirahat setelah operator,
- perataan garis baru dengan awal ekspresi pada baris sebelumnya.
Spasi dan indentasi
Pisahkan kawat gigi dengan spasi:
Beri spasi antara operator dan operan:
Ketika baris menjadi lebih dari 100 karakter, membaginya menjadi dua, membuat baris baru setelah pernyataan, dan terus menulis:
Biarkan garis kosong antara fungsi dan antara grup ekspresi:
49. Variabel kelas tidak boleh dinyatakan sebagai publik.
Variabel-variabel ini melanggar prinsip menyembunyikan informasi dan enkapsulasi. Sebagai gantinya, gunakan variabel dengan pengubah pribadi dan fungsi akses yang sesuai. Pengecualian adalah kelas tanpa perilaku, praktis struktur data (setara dengan struktur bahasa C). Dalam hal ini, tidak masuk akal untuk menyembunyikan variabel-variabel ini.
Harap dicatat bahwa struktur dalam C ++ dibiarkan hanya untuk kompatibilitas dengan C, penggunaannya merusak pembacaan kode. Gunakan kelas bukan struktur.
53. Perbandingan implisit variabel boolean (logis) dan pointer dengan nol harus dihindari.
Standar C ++ tidak menjamin bahwa nilai variabel int dan float yang sama dengan nol akan direpresentasikan sebagai biner 0. Selain itu, dengan perbandingan eksplisit, tipe yang dibandingkan terlihat.
Akan logis untuk mengasumsikan bahwa pointer juga tidak boleh secara implisit dibandingkan dengan nol, misalnya, jika (baris == 0) alih-alih jika (baris). Yang terakhir adalah praktik yang sangat umum di C / C ++, jadi ini juga bisa digunakan.
57. Putaran do-while dapat dihindari.
Siklus seperti itu kurang dapat dibaca karena kondisinya dijelaskan setelah tubuh. Pembaca harus melihat seluruh siklus untuk memahami karyanya.
Putaran do-while bukanlah keharusan mutlak sama sekali. Setiap loop seperti itu dapat diganti dengan while atau for loop.
Lebih sedikit penggunaan desain meningkatkan keterbacaan.
61. Hindari frasa tangkapan yang rumit. Masukkan variabel boolean sebagai gantinya.
bool isFinished = (elementNo maxElement),
bool isRepeatEntry = elementNo == lastElement,
if (isFinished || isRepeatEntry) <
:
>
// TIDAK:
if ((elementNo maxElement) ||
elementNo == lastElement) <
:
>
Menetapkan variabel boolean untuk ekspresi akan mengarah pada pendokumentasian diri sendiri dari program. Desainnya akan lebih mudah dibaca, di-debug, dan dirawat.
66. Konstanta titik apung harus ditulis dengan titik desimal dan dengan setidaknya satu tempat desimal.
total ganda = 0,0, // TIDAK DIANJURKAN: total ganda = 0,
kecepatan ganda = 3.0e8, // TIDAK DIANJURKAN: kecepatan ganda = 3e8,
jumlah ganda,
:
jumlah = (a + b) * 10.0,
Ini menekankan berbagai pendekatan ketika berhadapan dengan bilangan bulat dan angka floating point. Dari sudut pandang matematika, kedua model ini sangat berbeda dan tidak kompatibel.
Dan juga (seperti yang ditunjukkan pada contoh terakhir di atas), penekanannya adalah pada jenis variabel (jumlah) di tempat di mana ini tidak jelas.
72. Blok kode harus dirancang seperti yang ditunjukkan pada contoh 1 (disarankan) atau dalam contoh 2, tetapi dalam kasus apapun tidak seperti yang ditunjukkan pada contoh 3. Desain fungsi dan kelas harus mengikuti contoh 2.
while (! done) <
doSomething (),
selesai = moreToDo (),
>
sementara (! selesai)
<
doSomething (),
selesai = moreToDo (),
>
sementara (! selesai)
<
doSomething (),
selesai = moreToDo (),
>
Contoh 3 menggunakan margin tambahan, yang mencegah tampilan yang jelas dari struktur logis kode.
75. Konstruksi if-else harus disusun sebagai berikut:
jika (kondisi) <
pernyataan
>
jika (kondisi) <
pernyataan
>
lain <
pernyataan
>
jika (kondisi) <
pernyataan
>
lain jika (kondisi) <
pernyataan
>
lain <
pernyataan
>
Konsekuensi dari aturan di atas. Selain itu, menulis yang lain di baris yang sama di mana kurung kurawal penutupan blok pertama tidak dilarang:
Lebih baik menempatkan setiap bagian if-else pada baris yang berbeda. Ini menyederhanakan operasi kode, seperti memindahkan blok yang lain.
80. Desain sakelar harus dibuat sebagai berikut:
beralih (kondisi) <
case ABC:
pernyataan
// Tidak ada "istirahat"
kasus DEF:
pernyataan
istirahat
kasus XYZ:
pernyataan
istirahat
Perhatikan bahwa setiap kata case diindentasi relatif terhadap keseluruhan konstruk, yang membantu untuk menyorotnya. Perhatikan juga spasi sebelum titik dua. Jika kata kunci istirahat tidak ada di suatu tempat, maka komentar harus berfungsi sebagai peringatan. Pemrogram sering lupa untuk menuliskan kata ini, sehingga kasus kelalaian yang disengaja harus dijelaskan secara khusus.
84. Kesenjangan
- Operator harus dibuang dengan spasi.
- Setelah kata kunci C ++ yang dicadangkan, spasi harus diberikan.
- Anda harus memberi spasi setelah koma.
- Usus besar harus dibuang dengan spasi.
- Setelah titik koma di dalam for loop, Anda harus meletakkan spasi.
a = (b + c) * d, // TIDAK DIANJURKAN: a = (b + c) * d
while (true) // TIDAK DIANJURKAN: while (true)
<
.
doSomething (a, b, c, d), // TIDAK DIANJURKAN: doSomething (a, b, c, d),
case 100: // TIDAK DIANJURKAN: case 100:
Sorot setiap bagian dari ekspresi. Meningkatkan keterbacaan. Sulit untuk memberikan serangkaian rekomendasi komprehensif tentang ruang di C ++. Rekomendasi di atas harus menunjukkan prinsip umum.
85. Spasi dapat mengikuti nama metode jika nama lain mengikuti.
Sorot satu nama. Meningkatkan keterbacaan. Jika tidak ada nama lebih lanjut, Anda dapat menghilangkan spasi (doSomething ()).
Pendekatan lain adalah menentukan ruang segera setelah tanda kurung buka. Mereka yang menggunakannya juga biasanya memberi spasi sebelum braket penutup: doSomething (currentFile),. Ini memungkinkan Anda untuk menyorot nama-nama individual, ruang sebelum braket penutup terlihat tidak wajar, tetapi tanpa itu ekspresi akan terlihat asimetris (doSomething (currentFile),).
89. Gunakan perataan di mana pun itu meningkatkan keterbacaan.
jika (a == lowValue) compueSomething (),
lain jika (a == mediumValue) computeSomethingElse (),
lain jika (a == highValue) computeSomethingElseYet (),
value = (potensial * oilDensity) / konstan1 +
(kedalaman * kepadatan air) / konstan2 +
(zCoordinateValue * gasDensity) / constant3,
minPosition = computeDistance (min, x, y, z),
averagePosition = computeDistance (rata-rata, x, y, z),
beralih (nilai) <
case PHASE_OIL: strcpy (fase, "Minyak"), break,
case PHASE_WATER: strcpy (fase, "Water"), break,
case PHASE_GAS: strcpy (fase, "Gas"), break,
>
Ada banyak kasus di mana kode dapat lebih disejajarkan, bahkan jika itu melanggar aturan yang ditetapkan sebelumnya.
94. Komentar tentang kelas dan header metode harus dibuat sesuai dengan konvensi JavaDoc.
Pemrogram Java menggunakan pendekatan yang lebih maju untuk dokumentasi karena alat otomatis standar Javadoc, yang merupakan bagian dari paket pengembangan dan memungkinkan Anda untuk secara otomatis membuat dokumentasi dalam format HTML dari komentar dalam kode.
Ada alat serupa di C ++. Mereka mengikuti konvensi sintaksis tag yang sama seperti JavaDoc (lihat, misalnya, Doc ++ atau Doxygen).
Nama dan Variabel
Berikan variabel nama deskriptif seperti firstName atau homeworkScore. Hindari nama huruf tunggal seperti x atau c, kecuali untuk iterator seperti saya.
Beri nama variabel dan fungsi menggunakan daftar unta. Panggil kelas PascalRegister, dan konstanta di UPPER_REG. Anda dapat mempelajari lebih lanjut tentang kasing unta di artikel ini.
Jika variabel hanya digunakan di dalam spesifik jika, maka buatlah lokal dengan mendeklarasikan dalam blok kode yang sama, bukan global.
SmartDec, Moskow, dari 60.000 hingga 250.000 ₽
Pilih tipe data yang sesuai untuk variabel Anda. Jika variabel hanya berisi bilangan bulat, maka definisikan sebagai int, bukan double.
Gunakan string teks yang standar untuk C ++, bukan C. C ++ bingung dengan fakta bahwa ia memiliki dua jenis string teks: kelas string dari C ++ dan karakter lama * (array karakter) dari C:
Jika konstanta tertentu sering digunakan dalam kode Anda, maka tunjuk sebagai konstanta dan selalu merujuk pada konstanta ini, bukan nilainya:
Jangan pernah mendeklarasikan variabel global yang dapat berubah. Variabel global seharusnya hanya berupa konstanta. Alih-alih membuat nilai global, jadikan parameter dan kembalikan nilai bila perlu:
C ++ ekspresi dasar
C ++ didasarkan pada C, jadi selalu ada opsi untuk memecahkan masalah "oleh C ++" dan "oleh C". Misalnya, ketika Anda ingin mengeluarkan sesuatu ke konsol sistem, Anda dapat melakukannya "C ++ way" menggunakan operator keluaran cout, sementara "C way" Anda akan menggunakan fungsi global seperti printf:
Apakah Anda sering merasa sulit untuk memilih antara untuk dan sementara? Gunakan loop untuk ketika Anda tahu jumlah pengulangan, dan loop sementara ketika jumlah pengulangan tidak diketahui:
Saat menggunakan operator kontrol seperti if / else, untuk, sementara, selalu gunakan <> dan indentasi yang sesuai, bahkan jika isi seluruh pernyataan kontrol hanya terdiri dari satu baris:
Cobalah untuk menghindari penggunaan break atau melanjutkan ekspresi. Gunakan hanya jika benar-benar diperlukan.
C ++ memiliki fungsi keluar yang segera keluar dari program. Sangat tidak disarankan untuk menggunakan fitur ini. Suatu program harus selalu berakhir secara alami dengan mencapai pernyataan pengembalian utama.
Dengan menggunakan ekspresi if / else, pilih di antara berbagai pola if dan else dengan tepat tergantung pada kondisi yang terkait satu sama lain. Hindari yang tidak perlu jika tes:
Jika Anda memiliki pernyataan if / else yang mengembalikan boolean, kembalikan hasil tes secara langsung:
Jangan pernah memeriksa nilai boolean menggunakan == atau! = Dengan benar atau salah:
Kelebihan
Jika Anda menggunakan kode yang sama dua kali atau lebih, temukan cara untuk menghapus kode yang berlebihan sehingga tidak berulang. Misalnya, dapat ditempatkan dalam fungsi bantu. Jika kode yang diulang mirip, tetapi tidak sepenuhnya, maka cobalah untuk membuat fungsi pembantu yang mengambil parameter dan mewakili bagian yang berbeda:
Pindahkan kode generik dari pernyataan if / else sehingga tidak mengulangi:
Komentar
Komentar Judul. Posting komentar tajuk yang menjelaskan tujuan file di bagian atas setiap file. Asumsikan bahwa pembaca komentar Anda adalah seorang programmer tingkat lanjut, tetapi bukan seseorang yang telah melihat kode Anda sebelumnya.
Header Fungsi / Konstruktor. Tempatkan tajuk komentar di setiap konstruktor dan fungsi file Anda. Header harus menggambarkan perilaku dan / atau tujuan fungsi.
Parameter / Pengembalian. Jika fungsi Anda menerima parameter, jelaskan secara singkat tujuan dan artinya. Jika fungsi Anda mengembalikan nilai, jelaskan secara singkat apa yang dikembalikannya.
Pengecualian. Jika fungsi Anda secara sengaja melempar pengecualian untuk kasus kesalahan tertentu, maka ini perlu disebutkan.
Komentar di satu baris. Jika ada bagian kode di dalam fungsi yang panjang, kompleks, atau tidak dapat dipahami, maka jelaskan tujuannya secara singkat.
Todo. Anda harus menghapus semua // komentar TODO sebelum mengakhiri dan mengirimkan program.
Fungsi dan Desain Prosedural
Fungsi yang dirancang dengan baik memiliki karakteristik sebagai berikut:
- Sepenuhnya melakukan tugas yang jelas,
- Tidak butuh terlalu banyak pekerjaan
- Tidak terhubung dengan fungsi lain tanpa tujuan,
- Menyimpan data sebanyak mungkin terkompresi,
- Membantu mengenali dan berbagi struktur program,
- Membantu menghilangkan surplus yang seharusnya ada dalam program.
Gunakan parameter untuk mengirim informasi dari suatu fungsi atau ketika suatu fungsi perlu mengembalikan beberapa nilai. Jangan gunakan parameter yang tidak perlu. Perhatikan bahwa a, b, dan c bukan parameter dalam fungsi di bawah ini, karena ini tidak perlu:
Saat Anda ingin mengembalikan nilai dari suatu fungsi, gunakan nilai balik:
Saat mengirim objek ke fungsi sebagai parameter, Anda harus meneruskannya dengan referensi, karena jika dilewatkan sebagai nilai, seluruh objek akan disalin. Menyalin objek mahal.
Gunakan variabel referensi, bukan pointer. Salah satu alasannya adalah bahwa variabel referensi, tidak seperti pointer, tidak boleh NULL:
Jika Anda meneruskan objek ke suatu fungsi dan kode tidak mengubah tampilan objek, meneruskannya sebagai referensi const:
Hindari panggilan berantai ketika beberapa fungsi memanggil satu sama lain dalam suatu rantai tanpa mengembalikan nilai ke utama. Pastikan main adalah deskripsi singkat dari keseluruhan program:
Desain kelas
Enkapsulasi. Pisahkan objek Anda dengan menjadikan semua bidang data di kelas Anda pribadi:
.h vs .cpp. Selalu tempatkan deklarasi class dan part dalam file Anda sendiri, ClassName.h. Selalu runtuh file deklarasi kelas .h ke blok preprocessor # ifndef / define / endif untuk menghindari beberapa deklarasi dari kelas yang sama:
kelas vs struct. Selalu gunakan kelas hanya jika Anda tidak membuat bentuk data yang sangat kecil dan sederhana yang hanya membutuhkan beberapa variabel publik dan, mungkin, konstruktor untuk menginisialisasi mereka.
Hindari bidang yang tidak perlu. Gunakan bidang untuk menyimpan data penting tentang objek Anda, tetapi bukan nilai sementara yang digunakan sekali.
Bagaimana Yandex menggunakan data dan pembelajaran mesin Anda untuk mempersonalisasi layanan - baca dan tonton YaC 2019.