Gestione dell'allineamento della tabella del codice sorgente

0

A volte è necessario avere tabelle (grandi o piccole) nel codice sorgente.

ItemType const SomeTable[] = {
    //   id  name  min  max
    ITEM( 3, "Foo", 70, 180),
    ITEM(13, "Bar", 30,  50),
    ITEM(14, "Baz", 30,  60),
    ITEM(60, "Abc",  1,   4),
};

Nel tempo sono state aggiunte nuove righe e quelle esistenti sono state modificate:

ItemType const SomeTable[] = {
    //   id  name  min  max
    ITEM( 3, "Foo", 70, 180),
    ITEM(13, "BetterBar", 30,  50),
    ITEM(14, "Baz", BAZ_MIN, BAZ_MAX),
    ITEM(60, "Abc",  1,   4),
    ITEM(80, "AAAAAA", 0, A_COUNT),
    ITEM(81, "BBB  BBBB B", 0, B_COUNT),
};

Sembra orribile. Possiamo correggere l'allineamento:

ItemType const SomeTable[] = {
    //   id  name               min      max
    ITEM( 3, "Foo"        ,      70,     180),
    ITEM(13, "BetterBar"  ,      30,      50),
    ITEM(14, "Baz"        , BAZ_MIN, BAZ_MAX),
    ITEM(60, "Abc"        ,       1,       4),
    ITEM(80, "AAAAAA"     ,       0, A_COUNT),
    ITEM(81, "BBB  BBBB B",       0, B_COUNT),
};

Sembra migliore, ma il cambiamento effettivo è perso. Se si guarda il diff di controllo della versione, è quasi impossibile vedere cosa è stato aggiunto quando l'intera tabella è stata riscritta. Ciò è particolarmente grave se le tabelle sono diverse centinaia di righe, come tendono a essere.

È possibile stimare le dimensioni delle tabelle in anticipo, ma in pratica tendono a non essere attive: o troppo piccole, nel qual caso sono inutili o troppo grandi, nel qual caso viene persa molta leggibilità.

Sicuramente qualcuno ha trovato una buona strategia per gestire questi casi. Non deve essere un sistema perfetto, purché sia ragionevolmente leggibile.

Le seguenti cose sono fuori dallo scopo della domanda:

  • Uso di file di dati esterni: la piattaforma di destinazione potrebbe non avere il file system.

  • Utilizzo di uno script di conversione / conversione esterno per convertire il file di dati in codice: introduce una dipendenza aggiuntiva, che potrebbe non essere possibile o preferibile.

Vorrei mantenere questa domanda in modo agnostico, ma la situazione tipica in cui ho questo problema è nei progetti C incorporati. Ad esempio, una libreria di scopi speciali per diverse piattaforme. Quindi fondamentalmente ho solo il preprocessore a mia disposizione, e X-macros va solo lontano.

    
posta user694733 16.04.2015 - 08:57
fonte

3 risposte

2

Un possibile kludge che ti consentirebbe di mantenere la cronologia delle modifiche ma allineare correttamente il codice sarebbe quello di commentare l'intera tabella esistente. E aggiungi una nuova tabella allineata correttamente dopo.

Questo dovrebbe / dovrebbe essere registrato come solo due cambiamenti nel codice sorgente.

Dopo che la nuova tabella è stata salvata nel repository, puoi eliminare la sezione commentata alla prossima modifica (di nuovo registrata come una singola modifica!).

Questo può o non può funzionare a seconda di quanto sia intelligente il tuo software di controllo della versione.

In una nota più generale I (quasi sempre quando sono bravo e qualcuno potrebbe stare a guardare) tabelle di codice come questa come una classe / funzione separata. Ciò aiuta a mantenere leggibile il corpo principale del codice e consente di passare facilmente a un file esterno / xml / database / servizio web in un secondo momento.

    
risposta data 16.04.2015 - 09:24
fonte
2

If you look at the version control diff, it's nearly impossible to see what was added as whole table has been rewritten

Quindi non guardare il controllo di versione diff.

Ad esempio WinMerge , che è gratuito & funziona su Windows e amp; Linux ha un'opzione "Differenze di linea con Whitespace: Ignorando tutti".

Non potresti usarlo? Non mostrerà quelle regolazioni di allineamento come linee modificate.

E se il tuo controllo di versione diff non offre qualcosa di simile, allora perché non inviare e-mail e chiedere loro di aggiungerlo? Oppure codificalo da solo, se il controllo della versione è FOSS.

    
risposta data 16.04.2015 - 09:39
fonte
0

Che cosa succede se si genera automaticamente il file che contiene la dichiarazione della tabella?

Poiché è generato automaticamente, non è mai necessario diffare quel file leggibile. La diffusione del file di input mostrerà solo le linee realmente cambiate, dal momento che non riformatterai mai il file di input per renderlo più leggibile.

Q.E.D: -)

    
risposta data 16.04.2015 - 13:43
fonte