Perché i file di intestazione sono progettati male? [duplicare]

6

questo dice che i file di intestazione sono di cattiva progettazione, ma io non sapere perché. Le risposte specificate riguardano l'inefficienza del file di intestazione durante la creazione. Perché è cattivo design non viene realmente toccato.

Per quanto ne so:
- le intestazioni ti permettono di rompere il file sorgente in modo da poter compilare più piccole cose più velocemente
- le intestazioni ti consentono di separare l'interfaccia dall'implementazione
- le intestazioni ti consentono di specificare la funzionalità in un'unica posizione. vale a dire. senza ripetere

Tuttavia, l'utilizzo di include, include guardie, intestazioni, ecc. è considerato un cattivo design. Come mai? Quali sono le alternative?

- EDIT: re. Problemi di DRY

Un argomento comune è che viola DRY in quanto si ripetono i cambiamenti nelle firme in entrambi i file .cpp e .h. Tuttavia, se il codice è progettato per riutilizzare la funzionalità specificata in file esterni, non è inevitabile che i file di intestazione debbano essere utilizzati?

La domanda chiede perché i file di intestazione sono di cattiva progettazione, ma senza le intestazioni, la modularità non viene persa? Se la modularità viene persa, non è di per sé un problema di progettazione? Pertanto, l'utilizzo di file di intestazione causa un problema di progettazione separato.

Ripetendo in generale è una cattiva idea, l'ho capito, ma sembra inevitabile se richiedi funzionalità comuni. In tal caso le intestazioni sono cattive, in termini di ripetizione della firma. In termini di progettazione del software, sono incline a dire che suddividere il codice / modularizzare e riutilizzare il codice significa che il codice è stato progettato correttamente.

    
posta user2738698 24.03.2014 - 15:40
fonte

2 risposte

12

Questa risposta esamina i file di intestazione da una prospettiva di progettazione linguistica. Il mio punto non è che non dovresti usare intestazioni nei tuoi programmi C o C ++ - le intestazioni sono richieste da queste lingue. Invece, questa risposta è un argomento che non dovresti progettare nuove lingue che usano i file di intestazione.

I file di intestazione sono una cattiva progettazione del linguaggio, almeno da una prospettiva moderna:

  • I file di intestazione in C sono un cattivo progetto, non ultimo perché il sistema macro di C è cattivo: funziona tramite la sostituzione di token, non su un livello AST. Questo significa:

    • I barfs su circular include
    • Significa che le stesse cose sono compilate più volte
    • Un programma apparentemente breve e semplice potrebbe diventare un gigantesco colosso a causa di alcuni include.
    • È incredibilmente limitato (rispetto a quello che può fare il gold standard delle macro - Lisp).
  • I file header non sono validi perché sono file. E questi file sono separati dal codice reale. Oppure no: nessuno ti impedisce di inserire il codice nell'intestazione. Perché l'header non dovrebbe essere nello stesso file del codice sorgente? Non esiste una solida ragione tecnica per non farlo, a meno che non sia richiesta la compilazione in un'unica passata di ciascuna unità di compilazione.

  • Le intestazioni sono cattive perché un compilatore non ingenuo può benissimo capire i riferimenti in avanti dei simboli senza che questi siano pre-dichiarati. Le predeclarazioni sono utili solo se un compilatore multi-pass non è un'opzione per qualche motivo. Le pre-dichiarazioni non hanno valore per un lettore umano (è una violenta violazione DRY) e aggiungono troppo poco valore per un compilatore.

E ora per confutare alcune possibili confutazioni dell'idea di "headers are bad":

  • " Senza intestazioni non possiamo collegarci alle librerie " - Sono sicuro che è vero per C e discendenti (che sfortunatamente sono onnipresenti), ma questo non vale per altre lingue.

    • Una semplice alternativa è usare direttamente il codice sorgente di una libreria per estrarre l'interfaccia (questo è il numero di linguaggi di scripting come il tipo di lavoro Perl o Python).

    • Questo potrebbe non essere desiderabile in ambienti closed-source, dove l'output del compilatore potrebbe essere usato per collegarsi (che è approssimativamente come funziona Java, dove .class contiene l'interfaccia insieme al bytecode eseguibile).

    Il punto chiave non è che non esiste alcuna specifica di collegamento, la chiave è che questa specifica non è scritta dagli esseri umani.

  • " Senza intestazioni non possiamo condividere cose (funzioni, macro, classi) tra file " - sì, possiamo, con cose come spazi dei nomi e moduli contenenti queste cose. Diciamo che ho un #define PI 3.1415 in qualche codice C. Per condividere quella definizione tra i miei file sorgente, dovrei #include "my_math_constans.h" o qualcosa del genere. La soluzione di Python from math import pi che carica il modulo math e importa il simbolo pi da quel modulo nello scope corrente funziona almeno altrettanto bene.

risposta data 24.03.2014 - 16:42
fonte
0

I file di intestazione sono un retaggio dell'eredità di C: è stato scritto per essere vicino all'hardware, ma abbastanza astratto da poter essere eseguito su piattaforme simili, se un compilatore viene creato per la piattaforma.

Quali file di intestazione fanno sono definiti simboli che altri file possono usare senza che il compilatore abbia un problema. Il compilatore sostituisce quindi il riferimento simbolico con un collegamento o una copia del codice effettivo.

Il problema di progettazione con questo è che devi ripetere te stesso. Si definiscono gli stessi simboli in due file separati e quando uno cambia (diciamo una firma di metodo o un nome di classe), anche l'altro deve essere modificato.

Questo viola DRY - "Do not Repeat Yourself". Ciò crea una dipendenza automatica da un altro file a causa dei file di intestazione. Quindi, quando cerchi di capire cosa stanno facendo gli oggetti e le classi, hai bisogno di entrambi, poiché c'è una tonnellata di manopole sintattiche che possono essere trasformate in entrambi i file.

    
risposta data 24.03.2014 - 16:18
fonte

Leggi altre domande sui tag