C ++ 11 Libreria solo testata: corpo in classe contro codice corpo fuori classe?

6

BACKGROUND: opzionali

Dal 2002 sto costruendo lentamente la mia libreria Windows Native C ++ . E diciamo che ho saltato 150KLOC (codice riutilizzabile) avendo tutto ciò di cui ho bisogno e il sink della cucina (dalla maggior parte delle API di Windows è stato oggettivato a un un'implementazione decente del client IMAP4 e il client XMLRPC di WordPress per la pubblicazione di massa ... Faccio marketing di affiliazione e strumenti SEO) . Non è ancora .NET ma non è poi così lontano:)

Le sole librerie di terze parti utilizzate in questo sono ZLib , MySQL e SQLite . Tutto il resto è costruito da zero usando STL e / o Windows API . (Ho ancora un lettore / scrittore PDF per implementare, IOCP tutte le cose della rete, e c'è sempre spazio per più lavoro ...)

Negli ultimi 1,5 anni ho lavorato intensamente all'aggiornamento per C ++ 11. Spostare la semantica dove dovuto, (esplicito) operatori bool, costrutti concatenati e molto altro di quello che (modesto MSVC) C ++ 11 ci ha portato. Plus CRTP per chiamate genitore / figlio incatenate, uso minimo di virtuals, rigore costante. E riuscito.

Recentemente ho preso seriamente in considerazione l'idea di pubblicarlo. È un'enorme quantità di lavoro che ho fatto solo a mio vantaggio e presumo che ci siano ancora Windows C++ sviluppatori che potrebbero utilizzare una cosa così. E per farlo, ha continuato a leggere le pratiche del codice C ++ e le linee guida per la progettazione dell'API / libreria . E 'stato fantastico! Ho inchiodato l'80-85% delle migliori pratiche di codifica da solo. Con alcune cose che affronterò presto e una domanda importante .

DOMANDA

Attualmente l'intera libreria è piuttosto basata su modelli e solo sull'intestazione. Ciò significa che tutto il codice si trova nel corpo delle classi. Non è molto facile da gestire, ma va bene. Io comprimo il codice, uso #pragma region s e strutturo le cose con precisione.

MA SONO MOLTO tentato, dopo aver letto diverse linee guida per la codifica della libreria C ++, per suddividerlo in .hpp + .inl file. Fatto sperimentalmente per alcune classi e aumenta la leggibilità e rende più facile per gli altri trattare con (anche se è un po 'più difficile da scrivere) .

So dove si trova (linea di codice, funzionalità) in qualsiasi momento. Ma altri utenti potrebbero desiderare una rapida panoramica di una dichiarazione di classi ... e la definizione SOLO se / quando necessario (debugging) .

  1. Quali sono le pratiche accettate e / o preferite per quanto riguarda la divisione delle dichiarazioni dalle definizioni. Preferiresti avere solo le intestazioni con codice in-body o codice separato dalla dichiarazione della funzione?
  2. Quali sono le pratiche correnti di altre librerie? Ho sempre scritto tutto da solo. Non è così veloce come gli altri lo fanno. Tranne le 3 librerie menzionate sopra, devo ancora usare un altro codice di terze parti.

This is an important question for me because it's a one way road. I can't refactor it the other way later on so any feedback matters and is appreciated...

Grazie .

    
posta CodeAngry 06.08.2013 - 00:03
fonte

2 risposte

4

La tua domanda è piuttosto soggettiva (e potrebbe essere chiusa per questo), perché non esiste pratica universalmente preferita quando si tratta dell'uso di definizioni di funzioni in classe in C ++.

Un progetto che ha un sacco di grandi librerie di sola intestazione è Boost , e non sembrano avere un politica definita in cui dovrebbe andare il corpo di un metodo.

La mia preferenza personale quando utilizzo una libreria di terze parti è (in ordine di preferenza)

  • Per avere una documentazione API separata, comprensibile e ricercabile. Questa documentazione potrebbe essere generata dalla fonte (ad esempio, con uno strumento come Doxygen), ma non dovrei aprire i file sorgente per leggere la documentazione, o
  • Definizioni di classi ben commentate e ben organizzate, senza il "cumulo" di corpi funzione in classe. Questi dettagli di implementazione possono trovarsi nello stesso file dopo la classe o in un file separato o
  • Definizioni di classi ben organizzate e ben organizzate con i corpi delle funzioni in classe.
risposta data 06.08.2013 - 10:07
fonte
1

C'è una differenza maggiore e alcune differenze tecniche minori tra il corpo all'interno della classe e al di fuori di esso.

La principale differenza è che il metodo con il corpo all'interno della classe è implicitamente considerato dichiarato inline . Non che i compilatori non siano in linea ciò che loro vogliono comunque, ma influenza in qualche modo la generazione del codice. È probabile che se si esagera con metodi inline, il binario sarà più grande e un po 'più lento, quindi c'è un argomento per non scrivere corpi più grandi all'interno della classe.

C'è almeno una piccola differenza; l'unico modo per definire una funzione amico (ad es. operatore) per la classe interna del modello di classe è con il corpo all'interno della classe. Il modificatore friend lo rende non un membro.

    
risposta data 06.08.2013 - 10:42
fonte

Leggi altre domande sui tag