Classi di stile Java in c ++

8

Mi sono imbattuto in questo articolo proponendo uno stile di codifica in c ++ che sembra un po 'strano all'inizio . Ma dopo averlo letto e meditato per un po ', sto davvero valutando di provarlo.

Il vantaggio più interessante è la facilità dei metodi di refactoring. Mi trovo a cambiare continuamente nomi di metodi, parametri e così via mentre scrivevo una nuova classe e in c ++ è abbastanza fastidioso dover cambiare il nome di un metodo in due file (.h, .cpp).

Ho cercato di trovare qualcosa di sbagliato in questo stile, ma a parte il fatto che il codice sembrerà veramente strano ai programmatori c ++ esperti non riesco a individuare alcun difetto importante. Ma dal momento che sono un programmatore c ++ piuttosto inesperto, spero che qualcuno qui possa avvertirmi di potenziali pericoli.

Quindi la mia domanda è:

Esistono seri inconvenienti nell'utilizzo di questo stile di codifica?

    
posta bughi 21.12.2012 - 01:18
fonte

4 risposte

13

Sì, confonderai altri programmatori C ++ se scrivi tutto il tuo codice in quel modo. Non ho mai visto codice C ++ non-template scritto in questo modo, con tutto nel file di intestazione. Questo problema è stato discusso in modo approfondito anche in una domanda Overflow dello stack .

Per quanto riguarda i problemi tecnici con esso, mi vengono in mente alcune cose.

  • Tutto il tuo codice diventa effettivamente inline . I tuoi tempi di compilazione aumenteranno probabilmente.
  • Ogni ricompilare compilerà il mondo semplicemente perché deve.
  • Dovrai fare attenzione a non eseguire il controllo di Una regola di definizione . I nomi delle variabili devono essere univoci su tutti i file sorgente, poiché diventano effettivamente un unico file gigante.

Potresti anche voler controllare il linguaggio di programmazione D , che sento risolvere molti di questi problemi. Il compilatore D è stato progettato pensando a questo stile e non ha 30 anni di compatibilità con le versioni precedenti C per il supporto.

    
risposta data 21.12.2012 - 17:02
fonte
9

Non è esattamente una nuova idea. I programmatori principianti evitano dichiarazioni come la peste e per lo più la caveranno perché i loro programmi sono così piccoli. La conseguenza è che ora ti devi preoccupare dell'ordine che definisci le tue funzioni. La conseguenza di preoccuparsi dell'ordine di definizione è la tentazione di minimizzare il problema rendendo le tue funzioni troppo grandi.

Perderai anche la bella separazione tra interfaccia e implementazione. Lo stesso autore si lamenta che i membri privati fanno parte del file di intestazione, quindi "risolve" il problema rendendo una parte del file di intestazione tutti dettagli di implementazione.

    
risposta data 21.12.2012 - 04:58
fonte
7

Se vuoi classi in stile Java, quindi programma in Java !

Fa molte congetture nel suo articolo che sono completamente sbagliate. In nessun ordine particolare:

Compile time

This is not issue either. Assuming you have all operating system headers and frequently used containers (STL) or math libraries in precompiled headers, and assuming that if your program is really huge, you have separated it into components as per above, the remaining amount of code is absolutely negligible for a modern C++ compiler.

Questo è solo sbagliato, e dimostra che non ha mai lavorato su un programma C ++ su larga scala. Scarica qualsiasi grande programma C ++ open source, compila il programma e dimmi se vuoi aspettare così a lungo ogni volta che dimentichi un punto e virgola.

Declare before Use

There is a C++ feature very few programmers seem to know about (or at least, have exploited): and that is that inside a class, declare before use doesn't hold (!). Clearly Bjarne was aware of this legacy problem in C++ and fixed it for the inside of classes, but couldn't do the same for top-level declarations because of backwards compatibility with C (why? there must be some intricacy I am missing here).

[...much much more, each line more painful than the last...]

Ok, prima di tutto, non è una caratteristica che "pochissimi programmatori sembrano conoscere". In secondo luogo, questo è un completo fraintendimento della dichiarazione in avanti e di cosa viene utilizzato. La guida allo stile di codifica di Google ha un'introduzione decente a metà: link

Hanno lo scopo di semplificare il compilatore e riducono sostanzialmente il tempo di compilazione.

    
risposta data 21.12.2012 - 17:21
fonte
0

Questo mi sembra che stia solo dando un nome sciocco a fare forward dichiarazioni invece di #include <blah> .

I vantaggi della inoltro delle dichiarazioni è che i tempi di compilazione possono essere notevolmente più rapidi, ma il principale svantaggio IMO è necessario essere consapevoli di quando è possibile e non si può farla franca con una dichiarazione anticipata, e quando si sbaglia, è possibile ottenere messaggi di errore apparentemente incomprensibili per un errore banale.

    
risposta data 21.12.2012 - 06:38
fonte

Leggi altre domande sui tag