Qual è lo scopo di fare una distinzione sintattica tra tipi standard e tipi definiti dall'utente?


13

Anche se qui farò riferimento in particolare alle convenzioni di denominazione di C ++ e Bjarne Stroustrup , in linea di principio ho visto che le persone usano regole un po 'simili per altre lingue qua e là.

Quindi, l'idea di base è che si dovrebbe essere in grado di distinguere i tipi standard dai tipi definiti dall'utente durante la lettura del codice. Ad esempio, Bjarne Stroustrup suggerisce che si usa

una lettera maiuscola iniziale per i tipi (ad esempio, Quadrato e Grafico)

quale, tenendo conto di quello

Il linguaggio C ++ e la libreria standard non usano le maiuscole

consente di raggiungere l'obiettivo sopra indicato.

Ma perché dobbiamo farlo? Quale può essere lo scopo di distinguere tipi standard e definiti dall'utente?

Non sono riuscito a trovare alcun ragionamento di Bjarne Stroustrup su tale questione e, inoltre, io stesso penso in modo diametralmente opposto. : DI so, lo so, "Chi sono io per contestare Stroustrup?" Ma, ascolta, un sacco di funzionalità del linguaggio C ++, ad esempio il sovraccarico dell'operatore, hanno lo scopo di consentire ai tipi definiti dall'utente un livello di supporto sintattico simile ai tipi standard. E poi tutto ciò è sconcertato da una diversa disciplina di denominazione ...

PS Per non parlare del fatto che spesso una parola non è sufficiente per nominare una classe e una parola separata da trattino basso che inizia con una lettera maiuscola sembra così estranea.


6
Alla fine potresti anche chiamarlo una forma di notazione ungherese (ovvero incorporare informazioni sul tipo / utilizzo in un nome), che di solito è disapprovata. Quindi: bella domanda.
stijn

2
@stijn: Sì, ma sai perché è malvisto? In passato, quando tutti utilizzavano un editor di testo per scrivere i propri programmi, era utile conoscere il tipo guardando l'identificatore. Ma oggi, puoi semplicemente passare sopra l'identificatore in qualsiasi IDE moderno e ti dirà il tipo.
Robert Harvey,

4
@RobertHarvey Tranne il fatto che la notazione ungherese è evitata anche nelle comunità che non hanno potenti IDE, o piuttosto, usano principalmente editor di testo semplice.

1
@RobertHarvey No, sono a conoscenza di entrambi ("app ungherese" e "sistemi ungherese"), e nella mia esperienza nessuno dei due è comune, ad esempio in Python e Rust.

3
@RobertHarvey Stai dicendo che la notazione ungherese è mai esistita solo in C, C ++ e VB? Indipendentemente da ciò, il mio punto era mettere in discussione il motivo per cui non sei ben visto (che è ridondante solo dal momento che abbiamo IDE che ti dicono il tipo) poiché tale motivo non si applica alle lingue che non hanno tali ID e, secondo il tuo ragionamento, dovrebbe beneficiare dell'ungherese. Il fatto che Python sia tipizzato in modo dinamico non fa alcuna differenza, in effetti dovrebbe migliorare il ragionamento poiché in genere il programmatore conosce i tipi quando scrive il codice, ma non possono essere dedotti automaticamente.

Risposte:


5

Non vi è assolutamente alcuno scopo o beneficio in questo. Uno degli obiettivi del C ++ era quello di trattare in modo intercambiabile UDT e primitivi e, sebbene non abbiano avuto del tutto successo, questa è un'area in cui non è necessario differenziarsi.

Quando si tratta di nominare, Stroustrup è pazzo, e questo è un fatto scientificamente provato.


2
Vedrò la tua RAII e ti darò un SFINAE.
Robert Harvey,

5
Ho potuto vedere come potrebbe essere utile distinguere i tipi standard da quelli UDT. Si consiglia di non modificare il codice in una libreria standard a meno che non si dispone di una veramente buona ragione, in modo da vedere la minuscola indica che non c'è bisogno di andare a vedere il codice, perché, bene, è nella libreria standard.
Robert Harvey,

4
@delnan: Sì. Questo non è altro che un appello all'autorità da parte di "Molte persone". Se "Molte persone" vogliono venire qui e discutere del loro ragionamento, sono liberi di farlo, e fino ad allora, non hanno nulla da aggiungere. FTR, uso maiuscole anche per gli UDT ... ma anche per le primitive ogni volta che ho motivo di aver bisogno di alias.
DeadMG

2
@RobertHarvey: questo presuppone che non sia possibile riconoscere i tipi Standard a vista. O passando il mouse sopra di loro nel tuo ambiente e vedendo lo "std ::". O usando Vai a definizione o altro. Quindi sostanzialmente non si applica.
DeadMG

1
Ho sempre pensato che lo scopo fosse distinguere dai tipi standard, prima dell'avvento degli spazi dei nomi. Al giorno d'oggi, è solo una reliquia del vecchio pensiero (una "best practice" che ha smesso di essere la migliore qualche tempo fa). FWIW, nei miei progetti personali, uso lettere minuscole snake_caseper le mie classi e spazi dei nomi e non ho ancora avuto problemi - o confusione - causati da questo.
utnapistim,

3

Le convenzioni di denominazione riguardano il supporto della comprensione umana (ovvero programmatore e manutentore) del codice.

Gli UDT possono essere specificati in modo che la dichiarazione delle variabili, l'inizializzazione, le espressioni e le istruzioni funzionino su di essi in modo diverso rispetto al caso dei tipi standard. Per la ricerca di problemi, è utile che il manutentore abbia qualche indizio sul fatto che alcune sezioni di codice potrebbero fare cose funky (ad esempio l'implementazione di un tipo integrale definito dall'utente utilizzato all'interno di alcune funzioni potrebbe avere un difetto nel modo in cui viene aggiunta).

Esistono molti modi per fornire tali suggerimenti (commenti, specifiche di progettazione, ecc.). Il vantaggio delle convenzioni di denominazione è che sono presenti nel codice, mentre i commenti possono essere omessi, non aggiornati, ecc.


2

Uno dei motivi per cui uso le parole in maiuscolo per i tipi è quello di distinguere le variabili dai tipi. Ciò consente di dichiarare una variabile con, a parte la maiuscola, lo stesso nome:

Foo foo;
Graph graph;

Ciò può essere utile per le classi in cui viene utilizzata solo un'istanza in ciascun contesto, ad esempio le impostazioni di configurazione.


IMHO questo non risponde alla domanda nell'intestazione. Forse aggiungere "a questo proposito, nominare i tipi standard con lettere minuscole era solo per compatibilità all'indietro con cstdlib".
Vorac,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.