Kurze Frage
Gibt es eine typische Möglichkeit, "öffentliche" und "private" Mitglieder eines OO C-Projekts zu benennen?
Hintergrund
Ich verstehe voll und ganz, dass öffentliche und private Mitglieder in der C-Sprache nicht wirklich existieren. Wie die meisten C-Programmierer behandle ich Mitglieder jedoch weiterhin als öffentlich oder privat, um das OO-Design beizubehalten. Zusätzlich zu den typischen OO-Methoden habe ich mich nach einem Muster wiedergefunden (siehe Beispiel unten), das es mir erleichtert, zu unterscheiden, welche Methoden für die Außenwelt gedacht sind , und welche privaten Mitglieder möglicherweise weniger Prüfungen haben / effizienter sind usw. ... Gibt es für so etwas einen Standard oder eine Best Practice oder ist mein Beispiel unten ein guter Weg, dies zu erreichen?
Beispiel-Header
#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_ */
Beispielquelle
// 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
}
quelle
Antworten:
Die Konvention, die ich benutze, ist:
Öffentliche Funktion (in der Header-Datei):
Private Funktion (statisch in Implementierungsdatei)
Konzentriere dich nicht auf den Fall. Es geht darum, zwei öffentliche Methoden von zwei Klassen zu unterscheiden, indem ein Präfix (Klassenname in dieser Konvention) vorangestellt wird.
Darüber hinaus macht OO-C die Art und Weise aus, wie das Objekt als erstes Argument übergeben wird.
quelle
Normalerweise besteht die Konvention darin , die privaten Funktionen überhaupt nicht in den Header zu setzen .
Da Sie normalerweise die Implementierung eines Objekts vollständig in einer Quelle ablegen, kann die private Funktion normalerweise nur dateistatisch sein. In diesem Fall überspringen Sie normalerweise das Präfix, um einige Eingaben zu speichern (das Symbol ist außerhalb dieser Kompilierungseinheit nicht sichtbar).
Wenn Sie die Funktion aus irgendeinem Grund einer anderen Klasse zur Verfügung stellen müssen, aber ansonsten immer noch privat sind, benennen Sie sie wie jede andere Methode, setzen Sie sie jedoch in einen separaten "-privaten" Header.
Gleiches gilt auch für die Definition des Typs. Wenn möglich, deklarieren Sie die Struktur nur als unvollständigen Typ im Header und definieren sie entweder im Quell- oder im "-privaten" Header. Sie benötigen die Definition, um die Klasse zu erben, sodass Sie den zusätzlichen Header eher als geschützt als als privat behandeln würden.
Der wahrscheinlich größte objektorientierte Code in C ist die Gnome-Plattform. Sie können die Konvention am einfachsten in der GObject-Bibliothek sehen, die die Basisklassen der niedrigsten Ebene bereitstellt . Es ist ungefähr das, was ich oben beschrieben habe und wird in Gnome verwendet.
quelle
Wenn eine tatsächliche "Klasse" in Form einer Struktur, eines undurchsichtigen Typs oder ähnlichem existiert, benenne ich sie wie folgt:
Das Suffix _t ist eine sehr häufige Namenskonvention in C, die vom C-Standard selbst verwendet wird. Weniger verbreitet ist die Verwendung eines Großbuchstabens für Klassen / Typen.
Als nächstes müssen Sie ein Namenspräfix für alle öffentlichen Funktionen erstellen. Normalerweise eine 3-Buchstaben-Sache. Alle Funktionen zum „Apfel - Klasse“ gehören , vielleicht nennen würde
app_set_something()
,app_get_something()
usw.Dann möchten Sie eine konsistente Namenskonvention verwenden. Der „Konstruktor“ könnte genannt werden
app_init()
oderapp_construct()
die „destructorapp_clear()
,app_destruct()
,app_destroy()
oder ähnliches. Verwenden Sie die gleiche Namenskonvention für alle Klassen. Dann das gleiche tun für Setter / Getter - Funktionen, und so weiter.Private (statische) Funktionen benötigen kein Klassenpräfix, da sie außerhalb der C-Datei sowieso nicht verfügbar sind. Sie können ihnen aus Konsistenzgründen immer noch dasselbe Präfix geben oder sie einfach alle mit einem privaten Präfix benennen, z
private_func()
. Eine sehr häufige Methode besteht darin, ihnen Namen zu geben, die mit einem Unterstrich beginnen. Dies ist jedoch schlecht, da sie möglicherweise mit Bibliotheksfunktionen kollidieren. Genau genommen dürfen Sie keine Bezeichner verwenden, die mit einem Unterstrich beginnen.Ich würde nicht empfehlen, Großbuchstaben zu verwenden, um zwischen privat und öffentlich zu unterscheiden. Die Konvention in fast allen C-Codierungsstandards ist, dass alle Großbuchstaben eine Konstante, ein Makro oder eine Vorprozessordefinition angeben. Diese Konvention wird vom C-Standard selbst, von der Windows-API, vom Linux-Kernel usw. verwendet.
quelle