Quali sono le tipiche convenzioni di denominazione per le funzioni pubbliche e private di OO C? [chiuso]

11

Domanda breve
Esiste un modo tipico per nominare membri "pubblici" e "privati" di un progetto OO C?

Sfondo
Comprendo perfettamente che i membri pubblici e privati non veramente esistono nel linguaggio C. Tuttavia, come la maggior parte dei programmatori C, continuo a trattare i membri come pubblici o privati per mantenere il design OO. In aggiunta ai tipici metodi OO, ho trovato il mio sé seguendo un modello (vedi esempio sotto) che mi rende più facile distinguere quali metodi sono intesi per il mondo esterno rispetto ai membri privati che possono avere meno controlli / sono più efficienti ecc ... Esiste una pratica standard o migliore per una cosa del genere o il mio esempio è un buon modo per avvicinarsi a questo?

Intestazione di esempio

#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_ */

Origine di esempio

// 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 
}
    
posta Adam Lewis 21.10.2011 - 02:44
fonte

3 risposte

16

La convenzione che uso è:

  • Funzione pubblica (nel file di intestazione):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
    
  • Funzione privata (statica nel file di implementazione)

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

Non concentrarti sul caso. Il punto è distinguere due metodi pubblici da due classi anteponendo un prefisso (nome di classe in questa convenzione).

Inoltre, ciò che rende OO-C è il modo in cui l'oggetto viene passato come primo argomento.

    
risposta data 21.10.2011 - 14:27
fonte
8

Di solito la convenzione è non inserire le funzioni private nell'intestazione .

Dato che normalmente si mette l'implementazione di un oggetto interamente in una fonte, la funzione privata di solito può essere solo statica. In tal caso, di solito salti il prefisso per salvare un po 'di digitazione (il simbolo non sarà visibile al di fuori di tale unità di compilazione).

Se per qualche ragione hai bisogno di rendere la funzione disponibile per qualche altra classe, ma altrimenti ancora privata, di come la chiami come qualsiasi altro metodo, ma inseriscila in un'intestazione separata "-private".

Lo stesso vale per la definizione del tipo. Se possibile, devi solo inoltrare la struttura come tipo incompleto nell'intestazione e definirla nell'origine o nell'intestazione "-private". È necessario che la definizione erediti la classe, quindi considererai l'intestazione aggiuntiva come protetta anziché privata.

Probabilmente il più grande pezzo di codice orientato agli oggetti in C è la piattaforma Gnome. Puoi facilmente vedere la convenzione nella libreria GObject, che fornisce le classi base di livello più basso . È approssimativamente ciò che descrivo sopra e viene utilizzato in Gnome.

    
risposta data 22.10.2011 - 22:46
fonte
-1

Se esiste una "classe" effettiva, sotto forma di una struttura, di un tipo opaco o simile, la nomino in base a:

typedef struct classname_t classname_t; 

Il suffisso _t è una convenzione di denominazione molto comune in C, utilizzata dallo stesso standard C. Meno comune è usare una maiuscola per classi / tipi.

La prossima cosa che fai è trovare un prefisso di denominazione per tutte le funzioni pubbliche. Tipicamente qualcosa di 3 lettere. Tutte le funzioni che appartengono alla "classe mela" potrebbero essere chiamate app_set_something() , app_get_something() ecc.

Quindi vorrai utilizzare una convenzione di denominazione coerente. Il "costruttore" potrebbe essere chiamato app_init() o app_construct() , il "distruttore app_clear() , app_destruct() , app_destroy() o simili. Utilizza la stessa convenzione di denominazione per tutte le classi. Quindi fai lo stesso per setter / getter funzioni e così via.

Le funzioni private (statiche) non hanno realmente bisogno di un prefisso di classe poiché non sono comunque accessibili al di fuori del file .c. Puoi ancora dare loro lo stesso prefisso per motivi di coerenza, o forse semplicemente nominarli tutti con un prefisso privato, come private_func() . Un modo molto comune è di dare loro i nomi che iniziano con un carattere di sottolineatura, ma questo è un problema poiché potrebbe interferire con le funzioni della libreria. A rigor di termini non ti è permesso utilizzare identificatori che iniziano con un carattere di sottolineatura.

Non consiglierei di usare maiuscole come modo per distinguere tra privato e pubblico. La convenzione in quasi tutti gli standard di codifica C è che tutte le lettere maiuscole indicano una definizione costante, macro o pre-processore. Tale convenzione viene utilizzata dallo standard C stesso, dall'API di Windows, dal kernel di Linux e così via.

    
risposta data 22.08.2012 - 15:19
fonte

Leggi altre domande sui tag