Apa konvensi penamaan yang khas untuk fungsi publik dan pribadi OO C? [Tutup]

12

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 
}
Adam Lewis
sumber
2
+1 Untuk topik yang menarik: Desain OO diimplementasikan dalam C! Saya akan mengikuti pendekatan Anda untuk mendeklarasikan fungsi publik dalam file header dan yang pribadi sebagai fungsi statis dalam implementasi file .c. Saya tidak yakin mengapa Anda membutuhkan konvensi penamaan tertentu. Mengapa tidak menggunakan, misalnya, huruf besar untuk fungsi publik dan pribadi?
Giorgio
13
Bjarne Stroustrup mengumpulkan cara yang cukup komprehensif untuk menulis berorientasi objek ...
Ant
Untuk cara lain yang menarik dalam melakukan pemrograman berbasis objek di C, Anda dapat melihat Xt graphics toolkit, yang tidak asing bagi programmer X11. Ref: en.wikipedia.org/wiki/X_Toolkit_Intrinsics
sdg
@Giorgio: Titik huruf besar vs kecil untuk anggota publik dan pribadi adalah agar ketika meninjau kode atau mempertahankan kode itu diketahui sekilas apakah publik atau pribadi tanpa harus mencari deklarasi.
Adam Lewis
@ Ant: Objective-C adalah kemungkinan lain. Saya pikir intinya di sini adalah bahwa jika Anda pemrograman dalam C Anda masih dapat menggunakan desain OO. Tentu saja jika saya banyak menggunakan OOP, saya menggunakan bahasa OO.
Giorgio

Jawaban:

17

Konvensi yang saya gunakan adalah:

  • Fungsi publik (dalam file header):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
  • Fungsi pribadi (statis dalam file implementasi)

    static functionname(struct Classname * me, other args...)

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.

mouviciel
sumber
1
+1 Bukan pakar C yang besar, tapi itu terlihat solid dan benar (bahkan dalam istilah enkapsulasi, yang saya tidak pernah berkorelasi dengan C - sampai sekarang).
Yam Marcovic
Waspadai batas karakter pengidentifikasi yang diberlakukan oleh beberapa kompiler (mis. 31 karakter untuk beberapa!)
detly
8

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.

Jan Hudec
sumber
Senang Anda menyentuh fakta bahwa simbol tidak akan terlihat di luar unit kompilasi. Saya baru sadar setelah berbicara dengan beberapa rekan kerja tentang topik ini. Namun untuk memperjelas fungsi pribadi tidak ada dalam file header, mereka dinyatakan secara statis di file C.
Adam Lewis
-1

Jika "kelas" yang sebenarnya ada, dalam bentuk struct, jenis buram atau serupa, maka saya beri nama sesuai dengan:

typedef struct classname_t classname_t; 

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()atau app_construct(), yang "destructor app_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
_t dicadangkan.
Sungai Lilith