Який сенс робити синтаксичне розмежування стандартних та визначених користувачем типів?


13

Хоча тут я торкнуся конкретно конвенцій про іменування C ++ та Bjarne Stroustrup , я в принципі бачив, що люди використовують дещо подібні правила для інших мов тут і там.

Отже, основна ідея полягає в тому, що під час читання коду слід вміти відрізняти стандартні типи від визначених користувачем типів . Наприклад, Bjarne Stroustrup пропонує використовувати його

початкова велика літера для типів (наприклад, квадрат і графік)

який, беручи до уваги те

Мова C ++ та стандартна бібліотека не використовують великих літер

дозволяє досягти зазначеної вище мети.

Але навіщо нам це робити? Що може бути метою розмежування стандартних та визначених користувачем типів?

Я не міг знайти жодних міркувань Б'ярне Струструпа з цього приводу, і до того ж я сам думаю діаметрально протилежно. : DI знаю, я знаю: "Хто я, щоб суперечити Струструпа?" Але, слухайте, купа мовних функцій C ++, наприклад, перевантаження оператора, служать для того, щоб дозволити визначеним користувачем типам подібний рівень синтаксичної підтримки, як стандартний тип. І тоді все це заплутано різною дисципліною називання ...

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


6
Зрештою, ви можете назвати це також формою угорської нотації (тобто вбудовування інформації про тип / використання в ім'я), на яку зазвичай нахмуряються. Звідси: гарне запитання.
stijn

2
@stijn: Так, але чи знаєте ви, чому це нахмурене? Ще в той час, коли всі використовували текстовий редактор для написання своїх програм, було корисно дізнатися тип, дивлячись на ідентифікатор. Але сьогодні ви можете просто навести курсор на ідентифікатор у будь-якому сучасному IDE, і він підкаже вам тип.
Роберт Харві

4
@RobertHarvey За винятком того, що угорські позначення також утримуються у громадах, які не мають потужних IDE, а точніше, в основному використовують редактори простих текстів.

1
@RobertHarvey Ні, я знаю і те, і інше ("угорські програми" та "угорські системи"), і в моєму досвіді жодне не часто зустрічається, наприклад, в Python та Rust.

3
@RobertHarvey Ви хочете сказати, що угорська нотація існувала лише в C, C ++ та VB? Незважаючи на те, мій погляд полягав у тому, щоб поставити під сумнів причину, на яку ви нахмурилися (що це зайве лише з тих пір, як у нас є IDE, які розповідають вам про тип), оскільки ця причина не стосується мов, які не мають таких посвідчень і, за вашими міркуваннями, виграш має угорська мова. Цей Python динамічно набраний не має ніякої різниці, адже він повинен покращити міркування, оскільки, як правило, програміст знає типи при написанні коду, але їх не можна зробити автоматично.

Відповіді:


5

В цьому немає абсолютно ніякої мети чи користі. Однією з цілей C ++ було поводження з УДТ та примітивами безперервно, і хоча вони не досягли успіху, це одна з областей, де вам не доведеться розрізняти.

Що стосується найменування, то Stroustrup є горіхами, і це науково доведений факт.


2
Я побачу твій РАЙ і піднесу тебе СФІНАЙ.
Роберт Харві

5
Я міг бачити, як може бути корисно відрізнити стандартні типи від UDT. Ви не повинні змінювати код в стандартній бібліотеці , якщо у вас є дійсно хороша причина, тому бачити нижній регістр вказує на те, що ви не повинні йти дивитися на код , тому що, ну, це в стандартній бібліотеці.
Роберт Харві

4
@delnan: Так. Це не що інше, як звернення до авторитету з боку "Багато людей". Якщо "Багато людей" хочуть потрапити сюди і обговорити свої міркування, вони вільні зробити це, і до цього часу їм нічого додати. FTR, я також використовую великі регістри для УДТ-файлів ... але також і для примітивів, коли у мене є необхідність називати їх псевдонімом.
DeadMG

2
@RobertHarvey: Це передбачає, що ти не можеш розпізнати типи стандартів з поля зору. Або посміюючись над ними у вашому оточенні та побачивши "std ::". Або за допомогою переходу до визначення чи іншого. Отже, це не стосується.
DeadMG

1
Я завжди думав, що метою є відмежування від стандартних типів до появи просторів імен. Сьогодні це лише пережиток старого мислення ("найкраща практика", яка перестала бути найкращою деякий час тому). У своїх особистих проектах FWIW я використовую маленькі літери snake_caseдля своїх класів та просторів імен і не мав жодних проблем - чи плутанини - викликаних цим.
utnapistim

3

Конвенції про іменування стосуються підтримки людського (тобто програміста та обслуговуючого) розуміння коду.

УДТ можна вказати так, що декларування змінних, ініціалізація, вирази та оператори працюють на них інакше, ніж це стосується стандартних типів. Для пошуку проблеми корисному технічному обслуговувачеві мати деяку підказку, що деякий розділ коду може виконувати неприємні речі (наприклад, реалізація визначеного користувачем інтегрального типу, який використовується в якійсь функції, може мати недолік у тому, як він додає).

Існує багато способів надання таких підказів (коментарі, технічні характеристики тощо). Перевага назв конвенцій полягає в тому, що вони присутні в коді, тоді як коментарі можуть бути опущені, застарілими тощо.


2

Однією з причин, що я використовую великі слова для типів, є розрізнення змінних від типів. Це дозволяє оголосити змінну, крім великої літери, однойменною назвою:

Foo foo;
Graph graph;

Це може бути корисно для класів, у яких використовується лише один екземпляр у кожному контексті, наприклад, налаштування конфігурації.


IMHO це не відповідає на питання в заголовку. Можливо, додамо "в цьому відношенні, називання стандартних типів малими літерами було лише задньою сумісністю з cstdlib".
Vorac
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.