Pertanyaan Singkat
Apakah ada cara khas untuk memberi nama anggota 'publik' dan 'pribadi' dari proyek OO C?
Latar Belakang
Saya sepenuhnya memahami bahwa anggota publik dan pribadi tidak benar - benar ada dalam bahasa C. Namun, seperti kebanyakan programmer C, saya masih memperlakukan anggota sebagai publik atau pribadi untuk mempertahankan desain OO. Selain metode OO khas saya menemukan diri saya mengikuti pola (lihat contoh di bawah) yang membuatnya lebih mudah bagi saya untuk membedakan metode mana yang dimaksudkan untuk dunia luar vs anggota pribadi yang mungkin memiliki lebih sedikit pemeriksaan / lebih efisien dll ... Apakah standar atau praktik terbaik ada untuk hal seperti itu atau apakah contoh saya di bawah ini adalah cara yang baik untuk mendekati ini?
Header Contoh
#ifndef _MODULE_X_H_
#define _MODULE_X_H_
bool MOD_X_get_variable_x(void);
void MOD_X_set_variable_x(bool);
#endif /* _MODULE_X_H_ */
Sumber Contoh
// Module Identifier: MOD_X
#include "module_x.h"
// Private prototypes
static void mod_x_do_something_cool(void);
static void mod_x_do_something_else_cool(void);
// Private Variables
static bool var_x;
// Public Functions - Note the upper case module identifier
bool MOD_X_get_variable_x(void) {return var_x;}
void MOD_X_set_variable_x(bool input){var_x = input;}
// Private Functions - Note the lower case module identifier
void mod_x_do_something_cool(void){
// Some incredibly cool sub routine
}
void mod_x_do_something_else_cool(void){
// Another incredibly cool sub routine
}
sumber
Jawaban:
Konvensi yang saya gunakan adalah:
Fungsi publik (dalam file header):
Fungsi pribadi (statis dalam file implementasi)
Jangan fokus pada kasing. Intinya adalah untuk membedakan dua metode publik dari dua kelas dengan menambahkan awalan (nama kelas dalam konvensi ini).
Selain itu, apa yang membuat OO-C adalah cara objek dilewatkan sebagai argumen pertama.
sumber
Biasanya konvensi adalah tidak menempatkan fungsi pribadi di header sama sekali .
Karena Anda biasanya meletakkan implementasi satu objek sepenuhnya dalam satu sumber, fungsi pribadi biasanya dapat berupa file-statis. Jika demikian, Anda biasanya melewatkan awalan untuk menyimpan pengetikan (simbol tidak akan terlihat di luar unit kompilasi).
Jika Anda karena suatu alasan perlu membuat fungsi tersebut tersedia untuk beberapa kelas lain, tetapi jika tidak, masih bersifat pribadi, daripada Anda menamainya seperti metode lainnya, tetapi letakkan di header "-private" yang terpisah.
Hal yang sama berlaku untuk definisi tipe juga. Jika memungkinkan, Anda hanya meneruskan-menyatakan struktur sebagai tipe yang tidak lengkap di header dan mendefinisikannya baik di sumber atau di header "-private". Anda memerlukan definisi untuk mewarisi kelas, jadi Anda akan memperlakukan tajuk tambahan sebagai hal yang dilindungi dan bukan sebagai hal pribadi.
Mungkin bagian terbesar dari kode berorientasi objek di C adalah platform Gnome. Anda dapat paling mudah melihat konvensi di pustaka GObject, yang menyediakan kelas basis tingkat terendah . Ini kira-kira apa yang saya jelaskan di atas dan digunakan di seluruh Gnome.
sumber
Jika "kelas" yang sebenarnya ada, dalam bentuk struct, jenis buram atau serupa, maka saya beri nama sesuai dengan:
Akhiran _t adalah konvensi penamaan yang sangat umum dalam C, digunakan oleh standar C itu sendiri. Yang kurang umum adalah menggunakan huruf kapital untuk kelas / tipe.
Hal berikutnya yang Anda lakukan adalah membuat awalan penamaan untuk semua fungsi publik. Biasanya sekitar 3 huruf. Semua fungsi yang termasuk dalam "kelas apel" mungkin akan dinamai
app_set_something()
,app_get_something()
dll.Maka Anda akan ingin menggunakan konvensi penamaan yang konsisten. The "konstruktor" bisa diberi nama
app_init()
atauapp_construct()
, yang "destructorapp_clear()
,app_destruct()
,app_destroy()
atau serupa. Gunakan konvensi penamaan yang sama untuk semua kelas Anda. Kemudian melakukan hal yang sama untuk fungsi setter / getter, dan sebagainya.Fungsi privat (statis) tidak benar-benar memerlukan awalan kelas karena tidak dapat diakses di luar file .c. Anda masih bisa memberi mereka awalan yang sama untuk alasan konsistensi, atau mungkin cukup beri nama mereka semua dengan awalan pribadi, seperti
private_func()
. Cara yang sangat umum adalah memberi mereka nama yang dimulai dengan garis bawah, tetapi ini buruk karena mungkin bertabrakan dengan fungsi perpustakaan. Sebenarnya Anda tidak diperbolehkan menggunakan pengidentifikasi yang dimulai dengan garis bawah.Saya tidak akan merekomendasikan untuk menggunakan huruf besar sebagai cara untuk membedakan antara pribadi dan publik. Konvensi dalam hampir semua standar pengkodean C adalah bahwa semua huruf besar menunjukkan konstanta, makro atau definisi pra-prosesor. Konvensi itu digunakan oleh standar C itu sendiri, oleh Windows API, oleh kernel Linux dan sebagainya.
sumber