Какой смысл проводить синтаксическое различие между стандартными и пользовательскими типами?

13

Хотя здесь я буду ссылаться конкретно на соглашения об именах в C ++ и Бьярне Страуструпе , в принципе я видел, что люди используют несколько схожие правила для других языков здесь и там.

Итак, основная идея заключается в том, что при чтении кода нужно различать стандартные типы от пользовательских типов . Например, Бьярн Страуструп предлагает

начальная заглавная буква для типов (например, квадрат и график)

который, учитывая, что

Язык C ++ и стандартная библиотека не используют заглавные буквы

позволяет достичь цели, указанной выше.

Но зачем нам это делать? Какова может быть цель различения стандартных и пользовательских типов?

Я не мог найти никаких рассуждений Бьярна Страуструпа по этому вопросу, и, кроме того, я сам думаю диаметрально противоположным образом. Я знаю, я знаю, "Кто я такой, чтобы оспаривать Страуструпа?" Но, слушайте, куча возможностей языка C ++, например, перегрузка операторов, служит для того, чтобы пользовательские типы имели такой же уровень синтаксической поддержки, что и стандартные типы. И тогда все это озадачено другой дисциплиной именования ...

PS Не говоря уже о том, что часто одного слова недостаточно, чтобы назвать класс, а слово, разделенное подчеркиванием, начинающееся с заглавной буквы, выглядит настолько иностранным.

Дикая кошка
источник
6
В конце концов, вы также можете назвать это формой венгерской нотации (т. Е. Встраивания информации о типе / использовании в имени), которая обычно осуждается. Отсюда: хороший вопрос.
Стийн
2
@stijn: Да, но знаете ли вы, почему это осуждается? В свое время, когда каждый использовал текстовый редактор для написания своих программ, было полезно узнать тип, посмотрев на идентификатор. Но сегодня вы можете просто навести курсор на идентификатор в любой современной IDE, и он сообщит вам тип.
Роберт Харви
4
@RobertHarvey За исключением того, что венгерская нотация также игнорируется в сообществах, которые не имеют мощных IDE, или, скорее, в основном используют текстовые редакторы.
1
@RobertHarvey Нет, я знаю и то, и другое («приложения венгерские» и «системы венгерские»), и, по моему опыту, ни одно из них не распространено, например, в Python и Rust.
3
@RobertHarvey Вы говорите, что венгерская нотация существовала только в C, C ++ и VB? Независимо от этого, я хотел спросить причину, по которой вы его называете (что это избыточно только потому, что у нас есть IDE, которые сообщают вам тип), поскольку эта причина не относится к языкам, которые не имеют таких ID, и, по вашим рассуждениям, польза от венгерского должна быть. Тот факт, что Python динамически типизирован, не имеет значения, на самом деле он должен усиливать рассуждения, поскольку обычно программист знает типы при написании кода, но они не могут быть выведены автоматически.

Ответы:

5

В этом нет абсолютно никакой цели или пользы. Одной из целей C ++ было взаимозаменяемое обращение с UDT и примитивами, и хотя они не достигли полного успеха, это одна из областей, где вам не нужно проводить различия.

Когда дело доходит до именования, Страуструп сходит с ума, и это научно доказанный факт.

DeadMG
источник
2
Я увижу твой RAII, и подниму тебе СФИНА.
Роберт Харви
5
Я мог видеть, как было бы полезно отличать стандартные типы от UDT. Вы не должны изменять код в стандартной библиотеке, если у вас нет действительно веской причины, поэтому, когда вы видите нижний регистр, вам не нужно смотреть код, потому что он находится в стандартной библиотеке.
Роберт Харви
4
@Делнан: Да. Это не что иное, как обращение к авторитету со стороны «Многих людей». Если «Многие люди» хотят приехать сюда и обсудить свои рассуждения, они могут это сделать, и до этого им нечего добавить. FTR, я использую прописные буквы и для UDT ... но также и для примитивов всякий раз, когда у меня возникает необходимость их псевдонимов.
DeadMG
2
@RobertHarvey: это предполагает, что вы не можете распознать стандартные типы в поле зрения. Или наведя на них курсор мыши в вашей среде и увидев "std ::". Или с помощью Go To Definition или чего-то еще. Так что в принципе это не относится.
DeadMG
1
Я всегда думал, что цель состоит в том, чтобы отличить стандартные типы до появления пространств имен. В настоящее время это просто пережиток старого мышления («лучшая практика», которая перестала быть лучшей когда-то). FWIW, в моих личных проектах я использую маленькие буквы snake_caseдля своих классов и пространств имен, и у меня еще не было проблем - или путаницы - вызванных этим.
utnapistim
3

Соглашения об именах касаются поддержки понимания кода человеком (т.е. программистом и сопровождающим).

UDT могут быть определены так, чтобы объявление переменных, инициализация, выражения и операторы работали с ними иначе, чем в случае стандартных типов. Для поиска проблем полезно, чтобы сопровождающий имел некоторый признак того, что в некотором разделе кода могут быть какие-то странные вещи (например, реализация пользовательского интегрального типа, используемого в некоторой функции, может иметь недостаток в том, как она выполняет сложение).

Существует много способов предоставления таких подсказок (комментарии, спецификации проекта и т. Д.). Преимущество соглашений об именах заключается в том, что они присутствуют в коде, тогда как комментарии могут быть опущены, устарели и т. Д.

обкрадывать
источник
2

Одна из причин, по которым я использую слова с прописными буквами для типов, - это различать переменные от типов. Это позволяет объявить переменную с заглавными буквами, с тем же именем:

Foo foo;
Graph graph;

Это может быть полезно для классов, для которых в каждом контексте используется только один экземпляр, например, параметры конфигурации.

Сьерд
источник
ИМХО, это не отвечает на вопрос в заголовке. Может быть, добавить «в этом отношении, именование стандартных типов строчными буквами было сделано только для обратной совместимости с cstdlib».
Vorac