C: "questo" vs "nome dell'istanza"

1

Sto usando C in uno stile OOP minimo ed efficiente per costruire un motore di gioco. Un problema che ho iniziato ad affrontare mentre il codice del motore si stabilizza è la mia (precedente) scelta di usare this . Ad esempio, ho:

void Engine_initialise(Engine * this);

void Window_terminate(Window * this);

Window * this contiene un riferimento al singleton Engine . Ora, diciamo che faccio riferimento a questo Engine membro sia da Engine_initialise(..) sia da Window_terminate(..); . Nel primo sarà this->member , ma nel secondo sarà ( window-> ) engine->member .

Questa incoerenza mi infastidisce; se è uguale, dovrebbe cercare lo stesso. E visto che lavoro esclusivamente con un editor di testo senza IDE, voglio un singolo find-replace su tutti i file, invece che su più find-replace.

Consideriamo un altro esempio, in cui non esiste solo un argomento del tipo specificato.

Blob_compare(Blob * this, Blob * that);

vs.

Blob_compare(Blob * blob, Blob * blobOther); //or blob1 and blob2, or whatever

... nonostante la mia preferenza per perdere this , la prima sembra migliore in quanto è descrittiva e concisa.

Domanda : esistono argomenti particolarmente validi per continuare a utilizzare this come nome dell'istanza dell'oggetto corrente nelle varie funzioni? Sto pensando di sostituire tutto this con engine (o simile). Mi piacerebbe accontentarsi di uno standard di codifica in questo senso, per tutto il codice C.

Sto chiedendo l'utilità di this come argomento della funzione primary ; i nomi di altri parametri di tipo simile non sono di grande importanza qui nonostante il mio secondo esempio. Per me sembra ragionevole, se la funzione ha come prefisso Blob_ , per supporre che blob si riferisca all'istanza corrente. E no, non mi interessa davvero una virgola circa i tipi di ridenominazione - questi sono ben sistemati.

    
posta Engineer 14.08.2015 - 11:00
fonte

2 risposte

7

Se si suppone che siano single e si voglia veramente fare cose nel proprio stile (concettuale), si potrebbe voler usare Oggetto di contesto .

(Prima di tutto: scuse C non è la mia lingua madre, C ++ è.)

In sostanza,

struct Context
{
    Engine * engine;
    Window * window;
    // any other things that are considered singletons 
    // according to your conceptual style
};

void Engine_initialize(Context * context);
void Window_terminate(Context * context);

Per riferimento, dai un'occhiata a jpeglib e libtiff sul loro uso di alcuni oggetti di livello root che contengono puntatori a tutte le altre cose rilevanti necessarie al codice.

Come sidenote, usando this come nome identificativo nel codice C (e nei file di intestazione) creeremo problemi per le persone che cercano di integrare il tuo codice C in progetti C ++. Vedi questa domanda per opinioni su questo.

    
risposta data 14.08.2015 - 12:51
fonte
2

Suggerirei di evitare di usare this come nome formale in C, perché this è una parola chiave C ++. Potresti usare per es. self (o me o recv , o ipse -it è auto in latino) invece di this

Se si codifica il codice C senza usare parole chiave C ++, è molto più probabile che si possa usare il proprio codice con un compilatore C ++.

In particolare, molto spesso un file di intestazione C foo.h (con alcune funzioni static inline ) che non usa alcuna parola chiave C ++ è molto probabile che sia utilizzabile da un programma C ++ (forse circondando la direttiva #include "foo.h" con extern "C" { & }; , perché C ++ è stato (originariamente) progettato per essere compatibile con C in alto (questo è leggermente meno vero con C ++ 11 e C11).

    
risposta data 14.08.2015 - 18:14
fonte

Leggi altre domande sui tag