Saya berjuang untuk menemukan saran dunia nyata pragmatis tentang konvensi penamaan fungsi untuk proyek perpustakaan C berukuran sedang. Proyek perpustakaan saya dipisahkan menjadi beberapa modul dan submodul dengan tajuknya sendiri, dan secara longgar mengikuti gaya OO (semua fungsi menggunakan struct tertentu sebagai argumen pertama, tanpa global, dll). Itu meletakkan sesuatu seperti:
MyLib
- Foo
- foo.h
- foo_internal.h
- some_foo_action.c
- another_foo_action.c
- Baz
- baz.h
- some_baz_action.c
- Bar
- bar.h
- bar_internal.h
- some_bar_action.c
Secara umum fungsinya terlalu besar untuk (misalnya) menempel some_foo_action
dan another_foo_action
dalam satu foo.c
file implementasi, membuat sebagian besar fungsi statis, dan menyebutnya sehari.
Saya dapat menangani pengupasan simbol internal ("modul pribadi") saat membangun perpustakaan untuk menghindari konflik bagi pengguna saya dengan program klien mereka, tetapi pertanyaannya adalah bagaimana cara memberi nama simbol di perpustakaan saya? Sejauh ini saya sudah melakukan:
struct MyLibFoo;
void MyLibFooSomeAction(MyLibFoo *foo, ...);
struct MyLibBar;
void MyLibBarAnAction(MyLibBar *bar, ...);
// Submodule
struct MyLibFooBaz;
void MyLibFooBazAnotherAction(MyLibFooBaz *baz, ...);
Tapi saya berakhir dengan nama simbol panjang gila (lebih lama dari contoh). Jika saya tidak mengawali nama dengan "ruang nama palsu", simbol internal modul menamai semua bentrok.
Catatan: Saya tidak peduli dengan camelcase / Pascal case dll, hanya namanya saja.
sumber
git merge
ing. Sebagai contoh saya punya modul untuk menggambar UI dengan OpenGL, dan saya punya.c
file terpisah untuk setiap elemen yang saya butuhkan (slider.c
,indicator.c
dll). Implementasi elemen ini memiliki fungsi menggambar utama mungkin beberapa ratus baris panjang, dan cukup banyakstatic
pembantu di dalamnya. Mereka juga memanggil beberapa fungsi geometri murni dari dalam modul UI. Apakah itu terdengar agak khas?Audio Module > Engines > Channels > Filters
yang berarti sesuatu sepertiMyLibAudioEngines<EngineName>Channel<ActionName>
. Atau dalam submodule filter saya:MyLibAudioFilters<FilterName><Type><Action>
mis.MyLibAudioFiltersBigSoundingCompressorFloat32Process
Konvensi biasa untuk pustaka C adalah menggunakan nama pustaka sebagai awalan untuk nama yang dapat digunakan secara eksternal, misalnya
Untuk nama perpustakaan-internal yang masih harus dapat diakses di beberapa unit perpustakaan, tidak ada konvensi yang ketat, tapi saya akan menggunakan awalan nama perpustakaan dan indikasi bahwa itu adalah fungsi internal. Sebagai contoh:
Saya setuju bahwa ini dapat menyebabkan nama yang cukup panjang dan sulit untuk diketik, tetapi sayangnya itu adalah harga yang harus kita bayar karena tidak memiliki mekanisme seperti ruang nama C ++. Untuk mengurangi panjang nama, dengan mengorbankan kejelasan, Anda dapat memilih untuk menggunakan singkatan dalam nama Anda, tetapi Anda harus mempertimbangkan kelebihan dan kekurangannya dengan cermat.
sumber
Jika Anda ingin menghindari awalan panjang, Anda dapat menyingkat nama perpustakaan seperti yang dilakukan Apple di iOS dan OS X:
sumber
Bagaimana dengan memiliki variabel struktur global yang diawali dengan pointer fungsi?
lib.h
lib.c:
Memanfaatkan:
Kata kunci statis membatasi ruang lingkup ke unit terjemahan sehingga tidak akan bertabrakan dengan orang lain.
Pengguna kemudian dapat mempersingkatnya dengan menggunakan pointer seperti
YourApi *ya = &yourApi
, lalu menggunakanya->doFoo(...)
.Ini juga menyediakan cara yang bagus untuk mengejek perpustakaan Anda untuk pengujian.
sumber