Konvensi penamaan yang digunakan untuk variabel dan fungsi dalam C [ditutup]

13

Sementara pengkodean proyek besar dalam CI menemukan masalah. Jika saya terus menulis kode lagi maka akan ada waktu ketika saya akan kesulitan mengatur kode. Maksud saya, penamaan untuk fungsi dan variabel untuk bagian program yang berbeda mungkin keliru.

Jadi saya berpikir apakah ada konvensi penamaan yang berguna yang dapat saya gunakan untuk variabel dan fungsi C?

Sebagian besar bahasa menyarankan konvensi penamaan. Tetapi untuk C satu-satunya hal yang saya baca sejauh ini adalah nama-nama harus deskriptif untuk keterbacaan kode.

EDIT:

Contoh beberapa contoh konvensi penamaan yang disarankan:

Saya membaca beberapa konvensi penamaan untuk java di suatu tempat tetapi tidak ingat di mana.

Aseem Bansal
sumber
Kutip beberapa contoh bahasa dengan konvensi penamaan yang disarankan. Dan di mana kita dapat menemukan konvensi penamaan itu.
Philip
@Philip Menambahkan contoh
Aseem Bansal
1
Seharusnya tidak ada masalah dengan variabel karena Anda tidak menggunakan global. Dan untuk nama fungsi: jika nama modulnya order.c, Anda bisa memberi nama fungsinya order_add(), order_del()dan semacamnya. Mungkin ada sistem lama yang memberi tahu Anda bahwa namanya harus unik dalam 8 karakter pertama. Bila Anda beralih ke c ++ kemudian oleh kecelakaan, Anda akan menyukai untuk menulis order::add()dan order::del()kemudian.
ott--

Jawaban:

17

Jika saya terus menulis kode lagi maka akan ada waktu ketika saya akan kesulitan mengatur kode.

Ini adalah masalah Anda: perbaiki organisasi, dan gaya harus mengalir lebih mudah.

Jangan menunggu untuk mengatur kode Anda: pertahankan kode Anda tetap berjalan. Meskipun bahasa tidak melakukannya untuk Anda, kode tetap harus diatur ke dalam modul dengan kopling rendah dan kohesi tinggi.

Modul-modul ini kemudian secara alami menyediakan namespace. Singkat nama modul (jika panjang) dan awali nama fungsi dengan modul mereka untuk menghindari tabrakan.

Pada tingkat pengidentifikasi individu, ini secara kasar berada dalam urutan subyektivitas yang meningkat:

  1. pilih satu konvensi dan ikuti saja
    • misalnya, function_like_this(struct TypeLikeThis variable)umum
  2. pasti menghindari notasi Hongaria (maaf JNL)

    • kecuali Anda bersedia menggunakannya seperti yang dimaksudkan semula, yang berarti notasi aplikasi Simonyi daripada versi sistem yang mengerikan

      Mengapa? Saya bisa menulis esai tentang ini, tetapi saya akan menyarankan Anda membaca artikel ini oleh Joel Spolsky, dan kemudian berburu lagi jika Anda tertarik. Ada tautan ke kertas asli Simonyi di bagian bawah.

  3. hindari pointer typedefs kecuali jenis cookie yang benar-benar buram - mereka hanya membingungkan hal-hal

    struct Type *ok;
    typedef struct Type *TypePtr;
    TypePtr yuck;

    Apa yang saya maksud dengan jenis cookie buram ? Maksud saya sesuatu yang digunakan di dalam modul (atau perpustakaan, atau apa pun) yang harus diteruskan ke kode klien, tetapi kode klien itu tidak dapat digunakan secara langsung. Itu hanya meneruskannya kembali ke perpustakaan.

    Sebagai contoh, pustaka database mungkin mengekspos antarmuka seperti

    /* Lots of buffering, IPC and metadata magic held in here.
       No, you don't get to look inside. */
    struct DBContextT;
    /* In fact, you only ever get a pointer, so let's give it a nice name */
    typedef struct DBContexT *DBContext;
    
    DBContext db_allocate_context(/*maybe some optional flags?*/);
    void db_release_context(DBContext);
    int db_connect(DBContext, const char *connect);
    int db_disconnect(DBContext);
    int db_execute(DBContext, const char *sql);

    Sekarang, konteksnya buram ke kode klien, karena Anda tidak dapat melihat ke dalam. Anda baru saja mengembalikannya ke perpustakaan. Sesuatu seperti FILEjuga buram, dan deskriptor file integer juga cookie , tetapi tidak buram.


Catatan tentang desain

Saya menggunakan frasa kopling rendah dan kohesi tinggi di atas tanpa penjelasan, dan saya merasa agak buruk tentang itu. Anda dapat mencarinya, dan mungkin menemukan beberapa hasil yang baik, tetapi saya akan mencoba mengatasinya secara singkat (sekali lagi, saya bisa menulis esai tetapi akan berusaha untuk tidak melakukannya).

Pustaka DB yang digambarkan di atas menunjukkan kopling rendah karena memperlihatkan antarmuka kecil ke dunia luar. Dengan menyembunyikan detail implementasinya (sebagian dengan trik cookie yang tidak jelas), ia mencegah kode klien bergantung pada detail itu.

Bayangkan alih-alih cookie buram, kami mendeklarasikan struktur konteks sehingga isinya terlihat, dan itu termasuk deskriptor file socket untuk koneksi TCP ke database. Jika kami kemudian mengubah implementasi untuk mendukung menggunakan segmen memori bersama ketika DB berjalan pada mesin yang sama, klien perlu dikompilasi ulang daripada hanya dihubungkan kembali. Lebih buruk lagi, klien bisa mulai menggunakan deskriptor file, misalnya panggilan setsockoptuntuk mengubah ukuran buffer default, dan sekarang perlu perubahan kode juga. Semua perincian ini harus disembunyikan di dalam modul kami di mana praktis, dan ini memberikan sambungan rendah antara modul.

Contoh ini juga menunjukkan kohesi yang tinggi , bahwa semua metode dalam modul berkaitan dengan tugas yang sama (akses DB). Ini berarti bahwa hanya kode yang perlu tahu tentang detail implementasi (yaitu, konten cookie kami) yang benar-benar memiliki akses ke mereka, yang menyederhanakan proses debug.

Anda juga dapat melihat bahwa memiliki satu masalah memudahkan untuk memilih awalan untuk mengelompokkan fungsi-fungsi ini bersama-sama.

Sekarang, mengatakan contoh ini baik itu mudah (terutama karena itu bahkan tidak lengkap), tetapi tidak segera membantu Anda. Triknya adalah menonton, saat Anda menulis dan memperluas kode Anda, untuk fungsi yang melakukan hal serupa atau beroperasi pada tipe yang sama (yang mungkin merupakan kandidat untuk modul mereka sendiri), dan juga untuk fungsi yang melakukan banyak hal terpisah yang tidak benar-benar terkait, dan mungkin menjadi kandidat untuk berpisah.

Tak berguna
sumber
Bisakah Anda membantu saya memahami mengapa Hongaria dihindari? Penasaran saja ingin tahu lebih banyak tentang hal itu. :)
JNL
@JNL: Komentar terlalu pendek untuk dijelaskan dengan benar. Saya sarankan Anda mempostingnya sebagai pertanyaan baru.
Bart van Ingen Schenau
with low coupling and high cohesion. Apa artinya? Dan tolong jelaskan tentang jenis cookie buram. Saya tidak tahu apa artinya itu.
Aseem Bansal
Saya mencoba membahas keduanya secara singkat, dan terus terang gagal pada singkatnya. Semoga ini bisa membantu Anda memulai.
berguna
Saya membalas setelah beberapa hari. Maaf untuk itu. Saya membaca deskripsi Anda tentang low coupling and high cohesion. Jadi itu pada dasarnya berarti merangkum hal-hal ketika saya bisa dan itu harus dilakukan dengan cara bahwa fungsi yang sebenarnya perlu harus memiliki akses. Beberapa hal terlintas di kepalaku, tapi tetap saja aku pikir aku mengerti maksudmu.
Aseem Bansal
5

Menurut pendapat saya 90% dari masalah penamaan diselesaikan jika Anda mengingat tiga hal: a) membuat nama variabel dan fungsi Anda sejelas mungkin, b) konsisten di seluruh kode Anda (yaitu, jika suatu fungsi bernama addNumber, a Fungsi kedua harus dinamai multiplyNumber dan bukan numberMul) dan c) mencoba menyingkat nama jika mungkin, karena kita perlu mengetiknya.

Yang dikatakan jika Anda ingin melihat aspek-aspek lain pada topik ini halaman Wikipedia tentang Konvensi Penamaan memiliki daftar hal-hal yang baik yang harus Anda ingat. Ia juga memiliki bagian pada C dan C ++:

Dalam C dan C ++, kata kunci dan pengidentifikasi pustaka standar kebanyakan huruf kecil. Di pustaka standar C, nama yang disingkat adalah yang paling umum (misalnya isalnum untuk suatu fungsi yang menguji apakah suatu karakter alfanumerik), sedangkan pustaka standar C ++ sering menggunakan garis bawah sebagai pemisah kata (misalnya out_of_range). Pengidentifikasi yang mewakili makro, oleh konvensi, ditulis hanya menggunakan huruf besar dan garis bawah (ini terkait dengan konvensi dalam banyak bahasa pemrograman menggunakan pengidentifikasi semua huruf besar untuk konstanta). Nama-nama yang mengandung garis bawah ganda atau diawali dengan garis bawah dan huruf kapital dicadangkan untuk implementasi (kompiler, pustaka standar) dan tidak boleh digunakan (mis. Reserved__ atau _Reserved). [5] [6] Ini sangat mirip dengan penjambretan, tetapi semantiknya berbeda:

Daniel Scocco
sumber
3
"cobalah untuk mempersingkat nama jika mungkin" Gunakan IDE dengan pelengkapan otomatis, maka nama fungsi Anda dapat sepanjang dan deskriptif seperti yang diperlukan karena Anda hanya perlu mengetik lalu satu kali.
Joel
1
@ Joel nasihat yang mengerikan. Tidak semua orang akan menggunakan IDE yang sama seperti Anda.
James
6
@ James Mereka tidak perlu, mereka bisa menggunakan IDE yang layak. Maka Anda tidak harus mengorbankan kejelasan demi produktivitas.
Joel
Istilah IDE direntangkan agak tipis sekarang menjadi beberapa hari. Secara teknis Notepad ++ adalah IDE karena Anda dapat mengonfigurasinya untuk mengkompilasi dan menjalankan proyek Anda, tetapi ini terutama editor teks. Dan itu secara otomatis selesai.
Philip
5

Satu-satunya kendala di C adalah bahwa tidak ada ruang nama. Oleh karena itu, Anda harus menemukan cara untuk membuat rename()fungsi pustaka sistem file Anda berbeda dari rename()fungsi pustaka media Anda . Solusi yang biasa adalah awalan, seperti: filesystem_rename()dan media_rename().

Saran umum lainnya adalah: tetap konsisten dalam proyek atau tim. Keterbacaan akan ditingkatkan.

mouviciel
sumber
+1: Itu terutama berlaku untuk simbol yang diekspor di perpustakaan. "Saya minta maaf, tetapi pustaka filesystem itu tidak sesuai dengan pustaka media itu, karena keduanya memiliki fungsi yang diekspor, ganti nama.
Residuum
2

JIKA ANDA MENCARI FORMAT DITERIMA GLOBAL

MISRA / JSF / AUTOSAR mencakup hampir 100% dari setiap dan setiap standar industri untuk penamaan dan pengorganisasian kode C / C ++. Masalahnya adalah bahwa mereka tidak akan bebas untuk mendapatkan yaitu masing-masing buku panduan biaya uang. Saya tahu bahwa buku standar pengkodean MISRA 2008 C / C ++ mungkin berharga sekitar 50 USD.

Anda dapat menganggap ini sebagai Referensi Harvard untuk daftar pustaka dan bacaan tambahan ketika Anda menulis jurnal. Saya telah menggunakan MISRA dan ini adalah cara yang baik untuk memberi nama fungsi dan variabel Anda, dan mengaturnya untuk penggunaan yang tepat.

JIKA ANDA MENCARI SESUATU SEMENTARA

Referensi yang Anda berikan untuk Python dan Java oke saya kira. Saya telah melihat orang mengadopsi gaya javadoc berkomentar, penamaan, dan pengorganisasian kode. Sebagai soal fakta, dalam proyek terakhir saya, saya harus menulis kode C ++ dalam fungsi / nama variabel seperti Java. Dua alasan di balik ini:

1) Tampaknya lebih mudah diikuti.

2) Persyaratan kode produksi tidak menyentuh landasan standar sistem perangkat lunak keamanan-kritis.

3) Kode lama (entah bagaimana) dalam format itu.

4) Doxygen diizinkan berkomentar tentang sytle Javadoc. Pada saat itu, kami menggunakan doxygen untuk menghasilkan dokumentasi untuk orang-orang produksi.

Banyak programmer akan menentang hal ini, tetapi saya pribadi berpendapat bahwa tidak ada yang salah dengan mengadopsi fungsi gaya javadoc / penamaan variabel dalam C / C ++. YA TENTU SAJA, praktik pengorganisasian kontrol aliran Anda, keamanan benang, dll. Perlu diatasi. Namun, saya bukan pelamar di sini. Saya juga tidak tahu seberapa ketat persyaratan format kode produksi Anda. Tanpa mengalihkannya ke area di luar topik, saya sarankan Anda meninjau persyaratan Anda, mencari tahu seberapa tergantung Anda pada konvensi penamaan tertentu, dan pergi dengan solusi yang disebutkan dalam jawaban saya dan orang lain

Semoga ini bisa membantu !?

hagubear
sumber
Sebenarnya saya meminta ini untuk kode C pribadi. Tapi saya akan ingat saran Anda.
Aseem Bansal
@AseemBansal Pribadi atau profesional, itu bagus untuk dipelajari dan juga bagus untuk memakai CV Anda :) .... Terserah Anda.
hagubear
0

Beberapa hal penting yang perlu dipertimbangkan saat penamaan adalah;

  1. Lihatlah jenis actionObject atau ObjectAction. (Bukan Objek untuk C. Tapi secara umum ketika Anda pergi ke Bahasa Berorientasi Objek lainnya) Ini akan membantu

  2. Istirahat akan MENJADI KONSISTEN, singkat dan deskriptif pasti.

  3. Juga, memiliki satu-satunya tujuan dari setiap variabel dan fungsi yang didefinisikan, Misalnya: Jika untuk menyimpan nilai sementara, beri nama sebagai nTempVal untuk int
  4. Variabel harus menjadi kata benda dan Metode harus kata kerja.
JNL
sumber
6
Notasi Hungaria (awalan variabel dengan huruf yang menunjukkan tipe) menyebabkan tidak ada akhir dari rasa sakit. Untungnya sebagian besar sudah keluar dari mode.
Gort the Robot
@StevenBurnap Ingin tahu mengapa format Hongaria dihindari? Saya percaya itulah yang mereka ajarkan kepada kami di sekolah dan saya telah melihat kode seperti itu di beberapa tempat kerja juga. Mana yang akan Anda rekomendasikan jika bukan Hongaria. Terima kasih
JNL
1
Konvensi penamaan terbaik hanya digunakan secara konsisten, dengan nama deskriptif yang jelas idealnya dibuat relatif singkat tanpa singkatan yang berlebihan dan menghindari awalan yang berlebihan. Notasi Hungaria memiliki sedikit utilitas aktual, membuat kode lebih sulit untuk dibaca dan membuat tipe perubahan lebih sulit.
Gort the Robot
2
Berikut adalah deskripsi dari niat asli dan kekejian yang menjadi notasi Hungaria: joelonsoftware.com/articles/Wrong.html
Residuum
@Residuum Itu tautan yang bagus. Banyak membantu. Menghargai itu.
JNL
0

Sebagian besar jawabannya baik, tetapi saya ingin mengatakan beberapa hal tentang penamaan konvensi untuk perpustakaan dan termasuk file, mirip dengan menggunakan ruang nama dalam bahasa lain seperti C ++ atau Java:

Jika Anda membangun perpustakaan, temukan awalan umum untuk simbol yang diekspor, yaitu fungsi global, typedefs, dan variabel. Ini akan mencegah bentrokan dengan perpustakaan lain dan mengidentifikasi fungsi yang berasal dari Anda. Ini sedikit aplikasi Notasi Hungaria.

Mungkin melangkah lebih jauh dan kelompokkan simbol Anda yang diekspor: libcurl menggunakan curl_ * untuk simbol global, curl_easy_ *, curl_multi_ *, dan curl_share_ * untuk antarmuka yang berbeda. Jadi selain menggunakan curl_ * untuk semua fungsi, mereka telah menambahkan level lain dari "namespaces" untuk antarmuka yang berbeda: memanggil fungsi curl_easy_ * pada pegangan curl_multi_ * sekarang terlihat salah, lihat nama fungsi di http: // curl. haxx.se/libcurl/c/

Menjaga aturan untuk simbol yang diekspor, Anda harus menggunakannya untuk fungsi statis dalam #includefile ed: Cobalah untuk menemukan awalan umum untuk fungsi-fungsi ini. Mungkin Anda memiliki fungsi utilitas string statis dalam file bernama "my_string"? Awali semua fungsi itu dengan my_string_ *.

Residuum
sumber
Dengan simbol yang diekspor maksud Anda variabel global, fungsi, typedefs dll. Jika saya benar. Bisakah Anda menjelaskan sedikit tentang pengelompokan simbol yang diekspor? Saya pikir Anda sudah menjelaskannya pada paragraf sebelumnya. Apa yang Anda tambahkan di paragraf ke-3?
Aseem Bansal