Qual o sentido de fazer uma distinção sintática entre tipos padrão e tipos definidos pelo usuário?

13

Embora aqui me refira especificamente às convenções de nomenclatura de C ++ e Bjarne Stroustrup , em princípio, vi que as pessoas usam regras um pouco semelhantes para outras linguagens aqui e ali.

Portanto, a idéia básica é que seja possível distinguir tipos padrão de tipos definidos pelo usuário enquanto lê o código. Por exemplo, Bjarne Stroustrup sugere que se use

uma letra maiúscula inicial para tipos (por exemplo, Quadrado e Gráfico)

que, tendo em conta que

A linguagem C ++ e a biblioteca padrão não usam letras maiúsculas

permite atingir o objetivo mencionado acima.

Mas por que precisamos fazer isso? Qual pode ser o objetivo de distinguir tipos padrão e definidos pelo usuário?

Não consegui encontrar nenhum raciocínio de Bjarne Stroustrup sobre esse assunto e, além disso, penso eu de maneira diametralmente oposta. : Eu sei, eu sei: "Quem sou eu para disputar a Stroustrup?" Mas ouça, vários recursos da linguagem C ++, por exemplo, sobrecarga do operador, servem ao propósito de permitir que tipos definidos pelo usuário tenham um nível semelhante de suporte sintático aos tipos padrão. E então tudo isso é confundido por uma disciplina de nomeação diferente ...

PS Sem mencionar que muitas vezes uma palavra não é suficiente para nomear uma classe e uma palavra separada por sublinhado que começa com uma letra maiúscula parece tão estranha.

Gato selvagem
fonte
6
No final, você também pode chamá-lo de uma forma de notação húngara (ou seja, incorporar informações sobre tipo / uso em um nome), que geralmente é desaprovada. Portanto: boa pergunta.
Stijn
2
@stijn: Sim, mas você sabe por que isso é mal visto? No passado, quando todos usavam um editor de texto para escrever seus programas, era útil conhecer o tipo olhando o identificador. Mas hoje, você pode simplesmente passar o mouse sobre o identificador em qualquer IDE moderno e ele informará o tipo.
Robert Harvey
4
@RobertHarvey Exceto que a notação húngara também é evitada em comunidades que não possuem IDEs poderosos, ou melhor, usam principalmente editores de texto simples.
1
@RobertHarvey Não, eu conheço os dois ("aplicativos húngaro" e "sistemas húngaro") e, na minha experiência, nenhum dos dois é comum, por exemplo, em Python e Rust.
3
@RobertHarvey Você está dizendo que a notação húngara só existiu em C, C ++ e VB? Independentemente disso, meu objetivo era questionar o motivo que você dá para que isso seja desaprovado (que é redundante apenas porque temos IDEs que informam o tipo), pois esse motivo não se aplica a idiomas que não têm esses IDes e, pelo seu raciocínio, deve se beneficiar do húngaro. O fato de o Python ser digitado dinamicamente não faz diferença; na verdade, ele deve aprimorar o raciocínio, pois normalmente o programador conhece os tipos ao escrever o código, mas eles não podem ser inferidos automaticamente.

Respostas:

5

Não há absolutamente nenhum propósito ou benefício em tal. Um dos objetivos do C ++ era tratar UDTs e primitivos de forma intercambiável e, embora não tenham sido totalmente bem-sucedidos, essa é uma área em que você não precisa se diferenciar.

Quando se trata de nomear, Stroustrup é maluco, e esse é um fato cientificamente comprovado.

DeadMG
fonte
2
Vou ver seu RAII e criar uma SFINAE.
Robert Harvey
5
Pude ver como seria útil distinguir tipos padrão dos UDTs. Você não deve alterar o código em uma biblioteca padrão, a menos que tenha um motivo realmente bom, portanto, ver a letra minúscula indica que você não precisa procurar no código porque, bem, está na biblioteca padrão.
Robert Harvey
4
@ delnan: Sim. Isso nada mais é do que um apelo à autoridade por parte de "Muitas pessoas". Se "muitas pessoas" quiserem vir aqui e discutir seu raciocínio, estão livres para fazê-lo e, até então, não têm nada a acrescentar. FTR, eu também uso maiúsculas para UDTs ... mas também para primitivas sempre que preciso fazer um alias para elas.
DeadMG
2
@RobertHarvey: Isso pressupõe que você não pode reconhecer tipos padrão à vista. Ou passando o mouse sobre eles em seu ambiente e vendo o "std ::". Ou usando Ir para definição ou o que for. Então, basicamente, não se aplica.
DeadMG
1
Eu sempre pensei que o objetivo era distinguir dos tipos padrão, antes do advento dos namespaces. Atualmente, é apenas uma relíquia do pensamento antigo (uma "melhor prática" que deixou de ser a melhor há algum tempo). FWIW, em meus projetos pessoais, uso letras minúsculas snake_casepara minhas classes e espaços de nomes e não tive problemas - ou confusão - causados ​​por isso ainda.
Utnapishtim
3

As convenções de nomenclatura são sobre o suporte à compreensão humana (ou seja, programador e mantenedor) do código.

As UDTs podem ser especificadas para que a declaração de variáveis, inicialização, expressões e instruções funcionem nelas de maneira diferente do que ocorre nos tipos padrão. Para encontrar problemas, é útil que o mantenedor tenha alguma pista de que alguma seção do código pode fazer coisas estranhas (por exemplo, a implementação de um tipo integral definido pelo usuário, usado em alguma função, pode ter uma falha na maneira como faz isso).

Existem muitas maneiras de fornecer essas dicas (comentários, especificações de design etc.). A vantagem das convenções de nomenclatura é que elas estão presentes no código, enquanto os comentários podem ser omitidos, desatualizados etc.

Roubar
fonte
2

Uma razão pela qual uso palavras em maiúsculas para tipos é distinguir variáveis ​​de tipos. Isso permite declarar uma variável com, além da capitalização, o mesmo nome:

Foo foo;
Graph graph;

Isso pode ser útil para classes nas quais apenas uma instância é usada em cada contexto, por exemplo, definições de configuração.

Sjoerd
fonte
IMHO isso não responde à pergunta no cabeçalho. Talvez adicione "a esse respeito, nomear os tipos padrão com letras minúsculas foi apenas para compatibilidade com o cstdlib".
Vorac 7/08