Separazione del codice in file più piccoli in C

3

Sono in procinto di pulire il mio codice e renderlo più facile da mantenere. Lo sto facendo trasformando il mio file di oltre 5000 linee in file separati più piccoli.

Ho creato correttamente file sorgente e header separati per cose ovvie come utility e altri componenti che non sono strettamente integrati con l'applicazione.

Ora sto pensando che sarebbe bene suddividere anche il resto della mia applicazione in file più piccoli. Ma la questione che mi riguarda principalmente è che tutto ciò che è rimasto utilizza un gruppo di strutture che sono dichiarate globalmente.

Quindi questa è la scelta che va avanti (felice di sentire anche altri suggerimenti):

1) Potrei lasciare tutto nello stesso file e in questo modo potrei semplicemente definire tutte le funzioni come statiche (che ha i suoi vantaggi e sono spesso raccomandate). È quindi una semplice scelta lasciare i Globali nella parte superiore di questo file sorgente di grandi dimensioni.

o

2) Potrei separare in file più piccoli. È relativamente semplice capire quali parti dovrebbero andare in quali nuovi file. Non è nemmeno troppo difficile elaborare la gerarchia strutturale (quali parti chiamano quali parti). Ma sono incerto sul modo migliore per affrontare tutti questi Globali. Dove dovrebbero essere collocati, dal momento che ogni funzione li usa in qualche modo?

NOTA: sono consapevole che l'uso di Globals dovrebbe essere evitato. Tuttavia questo è un dispositivo incorporato con memoria limitata. I globals sono il modo migliore per ridurre l'utilizzo della memoria e più memoria salvi, più riesco a eseguire una determinata attività.

    
posta Remixed123 29.09.2014 - 12:57
fonte

3 risposte

3

Suggerirei di digitare tutte le strutture e inserire tali dichiarazioni in un file di inclusione separato. Quindi definisci tutte le tue istanze reali delle strutture in qualunque cosa il tuo file "principale" finisca per essere. Quindi, includi semplicemente l'intestazione e dichiara le istanze necessarie extern negli altri file. Il linker si occuperà di confrontare tutti i riferimenti, non dovrebbe esserci alcun problema.

    
risposta data 29.09.2014 - 18:27
fonte
5

Esiste una terza alternativa ibrida, che consiste nel mettere ciascun globale nel proprio modulo e scrivere funzioni per supportarlo. Questo ti dà il vantaggio OOP-y di tutto il codice relativo alla separazione della variabile in un punto e molto più facile da riutilizzare altrove se necessario. Mettere le funzioni di supporto nell'intestazione in modo che possano essere sottolineate invece di forzare le chiamate ti dà i vantaggi di avere tutto in un unico file.

Ad esempio:

// foo.h

typedef int FooType;

extern FooType foo_global_do_not_use_directly;

static inline void foo_init() {
    foo_global_do_not_use_directly = 0;
}

static inline void foo_set(FooType new_foo) {
    foo_global_do_not_use_directly = new_foo;
}

static inline FooType foo() {
    return foo_global_do_not_use_directly;
}

.

// foo.c

// Always include the header even if you're not using a
// typedef so it gets compiled at least once.
#include "foo.h"

FooType foo_global_do_not_use_directly;

Ovviamente, dovrai passare attraverso il resto della tua fonte e regolare ogni utilizzo dei globali per utilizzare le funzioni invece di fare riferimento direttamente ai simboli. Nel processo, potresti trovare altre cose che vengono ripetute ripetutamente e meritare di essere le loro funzioni, il che potrebbe avere dei benefici in fondo se dovessi cambiare il modo in cui queste operazioni funzionano.

    
risposta data 29.09.2014 - 14:52
fonte
1

Vado con la tua Opzione 1: lascia i globali in un unico file dove è facile trovarli .

Come hai notato nei commenti, questo non è OOP . Le "regole di OOP" (sebbene molto buone in senso generale) non si applicano necessariamente a un progetto piccolo su un dispositivo incorporato.

5000 righe in un file sono un problema con cui lavorare. 5000 linee in una soluzione sono piuttosto piccole. Se hai già spostato le altre cose, è probabile che ciò che rimane non sia poi così grande. Se lo dividi, passerai molto tempo a cercare quello globale che desideri modificare.

Ricorda, l'obiettivo è mantenere il codice organizzato in modo da poter seguire chiaramente la struttura, apportare le modifiche necessarie (e comprenderne l'impatto) e separare "cose che cambiano" da "cose che non lo fanno".

OOP è il modo comune per raggiungere questo obiettivo su computer moderni di uso generale. Non è l'unico modo per fare le cose, e potrebbe non essere il modo migliore per un dispositivo embedded con memoria limitata.

    
risposta data 29.09.2014 - 16:36
fonte

Leggi altre domande sui tag