Почему многие языки чувствительны к регистру? - PullRequest
45 голосов
/ 02 февраля 2009

Почему многие языки чувствительны к регистру?

Это просто вопрос наследования? C ++ чувствителен к регистру, потому что C есть, Java чувствителен к регистру, потому что C ++ и т.д. Или за этим стоит более прагматичная причина?

Ответы [ 31 ]

1 голос
/ 02 февраля 2009

Потому что многие люди считают employeeSocailSecurityNumber таким же читаемым, как employee_social_security_number, и он короче.

1 голос
/ 28 апреля 2016

Учиться всегда проще на примере, так что вот так:

C # (чувствителен к регистру, но может использоваться в VB.NET, который не учитывает регистр):

CONSTANT_NAME
IInterfaceName // Uses I prefix in all case sensitive and insensitive languages
ClassName      // Readable in both case sensitive and insensitive languages
_classMember   // sometimes m_classMember or just classMember
DoSomething(someParam) // Method with action name, params can be _someParam
PropertyName   // Same style in case sensitive and insensitive languages
localVariable  // Never using prefix

Java и JS используют стиль, похожий на C #, но методы / функции / события объявляются как переменные doSomething, onEvent.

ObjectPascal (Delphi и Lazarus / FPC нечувствительны к регистру, как ADA и VB.NET)

CConstantName     // One can use Def or no prefix, not a standard
IInterfaceName
TClassName        // Non-atomic types/classes have T prefix e.g. TStructRecordName
PSomePointer      // Pointers have types, safer low level stuff
FClassFieldMember // F means Field member similar to m
DoSomething(Parameter) // Older code uses prefix A for parameters instead
PropertyName
LLocalVariable    // Older code uses prefix for parameters not local vars

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

Так что на самом деле не важно, чувствителен ли язык к регистру или нет. Новые языки были добавлены в регистрозависимые языки, которые были слишком запутанными, чтобы их можно было выразить одним регистром, и требовали использовать префикс.

Поскольку языки, чувствительные к регистру, начали использовать префиксы, разумно прекратить использовать регистр с тем же именем идентификатора someIdentifier SomeIdentifier SOME_IDENTIFIER, ISomeIdentifier и использовать префиксы там, где это имеет смысл.

Рассмотрим эту проблему: У вас есть член класса, называемый чем-то, параметр метода / функции, называемый чем-то, и локальная переменная, называемая чем-то. Какое условное обозначение можно использовать, чтобы легко отличить их? Разве не проще просто использовать наиболее распространенный ConsistentCaseStyle везде и добавить префикс?

Поклонники нечувствительных к регистру языков заботятся о качестве кода, им нужен только один стиль. Иногда они принимают тот факт, что одна библиотека написана плохо, и используют строгий стиль, в то время как библиотека может не иметь стиля или плохого кода.

Как регистрозависимые, так и нечувствительные языки требуют строгой дисциплины, более логично везде иметь только один стиль. Было бы лучше, если бы у нас был язык, который использовал бы только StrictCase, один стиль везде и префиксы.

Существует много плохого кода на C, чувствительность к регистру не делает его читабельным, и вы ничего не можете с этим поделать. В случае нечувствительного к регистру языка вы можете применить хороший стиль в своем коде, не переписывая библиотеку. На языке StrictCase, который еще не существует, весь код будет иметь достойное качество:)

1 голос
/ 02 марта 2014

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

1 голос
/ 09 декабря 2015

Я прочитал всю эту тему. Я должен верить, что те, которые сообщают, что нашли значение в чувствительности к регистру, никогда не программировали на действительно высоком уровне языка (который по определению нечувствителен к регистру). K & R признают, что C находится на среднем уровне. После программирования на Pascal, Delphi, Lazarus, ADA и т. Д., Вы узнаете, что легко читаемый код легко писать и быстро запускать, не зацикливаясь на кратких, чувствительных к регистру конструкциях. В конце концов, читаемость - это первое и последнее слово в теме. Код написан для человека, а не для компьютера. Нет проблем для отладки с кодом без учета регистра. Когда вы переходите к языку среднего уровня, вы обнаруживаете, что НЕТ преимуществ в чувствительности к регистру. Однако значительное количество часов, потраченных на отладку чувствительности к регистру, вызвало проблемы. Особенно при соединении модулей из разных кодеров. Также представляется, что большое количество респондентов не понимают, что подразумевается под нечувствительностью к регистру. Затрагиваются только символы a-z. Это последовательный набор символов ASCII. Три или четыре байта машинного кода делают компилятор безразличным к регистру в этом диапазоне символов. Он не изменяет нижнюю черту, цифры или что-либо еще. Пункты о других языках и наборах символов просто не относятся к этому обсуждению. Компилятор или прерыватель будут закодированы для временного преобразования или не преобразования символа для анализа во время компиляции на основе существующего ASCII или нет.

Я шокирован появлением новых языков, таких как Python, которые повторяют ошибку, допущенную K & R. Да, они сохранили полдюжины байт в среде, где общий объем ОЗУ для компилятора, исходного кода и объектного кода составлял 1000 байт. Что было тогда. Теперь память не проблема. Теперь, без какой-либо веской причины, даже запасные слова в Python чувствительны к регистру! Я не думаю, что мне нужно будет использовать «For» для «Print» в качестве имени переменной или функции. Но эта возможность была сохранена дорогим временем, потраченным на доведение до прерывателя точного случая каждого идентификатора. Думаю, плохая сделка.

Самая близкая вещь, которую я до сих пор читал в поддержку чувствительности к регистру, - это комментарии о хешировании. Но эти редкие события кодирования, которые можно обрабатывать с тщательным вниманием к деталям, похоже, не стоят того бессмысленного изучения, которое кодер должен использовать для написания чувствительного к регистру кода. Два взгляда на проблему. Каждый поощряет плохое кодирование, устанавливает ловушки в коде и требует дополнительного внимания, чтобы отвлечься от более крупных концепций. Другой не имеет недостатков, работал безупречно на языках высокого уровня и обеспечивает гибкость, не причиняя вреда. Мне кажется, что еще один случай, когда VHS выигрывает у BETA. Здесь стоят только мои два цента.

1 голос
/ 24 апреля 2009

И вы также можете (по глупости) просто использовать одинарные буквы («a», «b» и «c») для всех классов, переменных, функций и методов.

Но ПОЧЕМУ Вы бы хотели?

Используйте имена, которые имеют смысл , а не:

function a(a)
{
    int a = a.a;
    return a
}
0 голосов
/ 28 июля 2017

Разумным ответом может быть то, что разработчики языка думали, что это сделает язык более понятным, думая о будущем:)

0 голосов
/ 15 января 2017

Потому что люди всерьез задумываются.

Чувствительность к регистру работает лучше всего, когда она также сохраняет регистр и сочетается с разделением между пространствами имен типа и переменной. Это означает, что:

  • Если вы объявляете класс как 'TextureImage', а затем пытаетесь использовать его как 'textureImage', среда IDE может автоматически исправить вас. Это дает вам преимущество в том, что вам никогда не придется нажимать клавишу Shift, если вы не объявляете идентификатор или не используете подчеркивание.

  • Так же, как в Java и некоторых других языках; вполне допустимо набирать "MyClass myClass". В среде IDE и компиляторе не должно быть проблем с разграничением между использованием типа и использованием переменной.

Кроме того, нечувствительность к регистру гарантирует, что 'o' и 'O' никогда не будут ссылаться на разные объекты. Общие аргументы включают в себя:

  • "sOmEoNe wIlL tYpE cOdE lIkE tHiS"; => и что кто-то никогда не сможет присоединиться к команде программистов, так что это аргумент солидарности. даже если им это удалось, нечувствительность к регистру - это больше решение, чем проблема, потому что это означает, что вам не нужно запоминать какую бы сумасшедшую комбинацию прописных и строчных букв они использовали. «Вы не можете легко интернационализировать регистронезависимость!»; => более 95% языков программирования написаны на английском языке по очень веской причине. не существует конкурирующих кодировок символов, и подавляющее большинство клавиатур на земле основаны на английском (частично или полностью). поддержка идентификаторов Unicode - возможно, самая глупая идея, которую кто-либо придумал в 21-м веке; Поскольку значительная часть символов Юникода является невидимыми суррогатами frikkin, чтение кода достаточно сложно без использования Google Translate, а написание кода достаточно сложно без необходимости копировать-вставлять идентификаторы или использовать карту символов. 1034 * "но регистрозависимые языки имеют больше идентификаторов!"; => нет, у них есть грамматически перегруженные идентификаторы, что значительно хуже.

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

0 голосов
/ 15 октября 2015

Если разделение слов не важно, тогда почему мы ставим пробелы между словами? Поэтому я думаю, что подчеркивание между словами в имени повышает читабельность. Также строчные буквы с заглавными буквами соответствующих символов легче всего читать. И, наконец, гораздо проще, если все слова можно передать из уст в уста - «Корпоративный подчеркивающий клиент», а не «Заглавная буква C Строчная буква C или нижняя буква C Строчная буква U» - на первом можно говорить «в голове», на втором - нет - интересно, как люди, которые довольны чувствительностью к регистру, обрабатывают эти чувствительные к регистру имена в своих мозгах - я действительно борюсь. Поэтому я чувствую, что чувствительность к регистру совсем не полезна - на мой взгляд, шаг назад от COBOL.

0 голосов
/ 04 апреля 2014

В соответствии с типичными стандартами кодирования Person будет классом, person - именем переменной, а PERSON - константой. Часто полезно использовать одно и то же слово с разной заглавной буквой, чтобы обозначить нечто связанное, но немного отличающееся

Итак, если бы в вашем бизнесе было три сотрудника по имени Роберт, вы бы назвали их Робертом, Робертом и Робертом, не так ли? И полагаться на людей, чтобы точно знать, кого вы имели в виду?

Дайте им адреса электронной почты, такие как Robert@widgets.com, robert@widgets.com и ROBERT@widgets.com, если ваша система электронной почты чувствительна к регистру?

Потенциал для несанкционированного нарушения персональных данных был бы огромным. Не говоря уже о том, отправили ли вы пароль администратора базы данных недовольному сотруднику, которого собираются уволить.

Лучше называть их Бобом, Робби и Робертом. Еще лучше называть их «Роберт А», «Роберт Б» и «Роберт С.», если их фамилии были, например, Артур, Бэнкс и Кларк

Действительно - почему на земле существует соглашение об именах, которое допускает ошибки или путаницу, основанное на том, что люди очень бдительны? У вас так мало слов в вашем словаре?

А что касается человека, который упоминает якобы полезный трюк "MyClass myClass" - почему, почему, почему? Вы сознательно затрудняете сразу увидеть, является ли используемый метод методом класса или методом экземпляра.

Кроме того, вы упустили возможность рассказать следующему человеку, читающему ваш код, о конкретном экземпляре класса.

Например.

Клиент Предыдущий клиент

Клиент NewCustomer

Клиент Корпоративный Клиент

В идеале имя вашего экземпляра должно сообщать вашему коллеге больше, чем просто класс, на котором оно основано!

0 голосов
/ 02 февраля 2009

Похоже, что люди в основном согласны с тем, что важна чувствительность к регистру, и я согласен.

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

...