Не обязательно иметь два члена, которые различаются только регистром на языках, которые его поддерживают. Например, вот довольно распространенная часть C #:
private readonly string name;
public string Name { get { return name; } }
Лично я вполне доволен чувствительностью к регистру - особенно потому, что он позволяет код, подобный приведенному выше, где переменная-член и свойство в любом случае следуют соглашениям, избегая путаницы.
Обратите внимание, что чувствительность к регистру также имеет культурный аспект ... не во всех культурах одни и те же символы считаются эквивалентными ...
Представьте, что у вас есть объект с именем dog
, у которого есть метод Bark ()
. Также вы определили класс Dog, который имеет статический метод Bark ()
. Вы пишете dog.Bark ()
. Так что он будет делать? Вызвать метод объекта или статический метод из класса? (на языке, где ::
не существует)
Сравнение с учетом регистра (с наивной точки зрения, игнорирующей каноническую эквивалентность) тривиально (просто сравнивайте кодовые точки), но сравнение без учета регистра не является четко определенным и чрезвычайно сложным во всех случаях, а правила невозможно изменить помнить. Реализация этого возможна, но непреднамеренно приведет к неожиданному и неожиданному поведению. Кстати, некоторые языки, такие как Fortran и Basic, всегда не учитывали регистр.
Одной из главных причин чувствительности к регистру в языках программирования является удобочитаемость. Вещи, которые означают одно и то же, также должны выглядеть одинаково.
Я нашел следующий интересный пример М. Сандина в соответствующем обсуждении:
Раньше я полагаю, что чувствительность к регистру была ошибка, пока я не сделал это в случае нечувствительный язык PL / SQL (синтаксис теперь полностью забыто):
функция IsValidUserLogin (пользователь: строка, пароль: строка): bool begin результат = выберите * из ПОЛЬЗОВАТЕЛЕЙ где USER_NAME = пользователь и PASSWORD = пароль; return not is_empty (результат); конец
Это прошло незамеченным для нескольких месяцев на мелкосерийном производстве системе, и никакого вреда от этого не произошло. Но это это неприятная ошибка, возникшая из-за дела нечувствительность, правила кодирования и как люди читают код. Урок для меня было это: вещи, которые то же должно выглядеть одинаково.
Вы сразу видите проблему? Я не мог ...
Я уверен, что изначально это было связано с производительностью. Преобразование строки в верхний или нижний регистр для сравнения без регистра - это совсем не дорогая операция, но и не бесплатная, а в старых системах это могло добавить сложности, с которыми системы того времени были не готовы справиться.
И теперь, конечно, языки любят быть совместимыми друг с другом (например, VB не может различать классы или функции C #, которые различаются только регистром), люди привыкли называть вещи одним и тем же текстом, но с разными регистрами. (См. Ответ Джона Скита - я часто этим занимаюсь), и ценности языков без регистра не было достаточно, чтобы перевесить эти два.
Мне нравится чувствительность к регистру, чтобы различать класс и экземпляр.
Form form = new Form();
Если этого не сделать, то в итоге получаются переменные с именами myForm
или form1
или f
, которые не так чисты и описательны, как простое старое form
.
Чувствительность к регистру также означает, что у вас нет ссылок на form
, FORM
и Form
, которые означают одно и то же. Мне трудно читать такой код. Мне гораздо проще сканировать код, в котором все ссылки на одну и ту же переменную выглядят одинаково.
Причина, по которой вы не можете понять, почему учет регистра - хорошая идея, в том, что это не так. Это всего лишь одна из странных причуд C (например, массивы на основе 0), которые теперь кажутся «нормальными», потому что многие языки скопировали то, что делал C.
C использует чувствительность к регистру в идентификаторах, но с точки зрения дизайна языка это был странный выбор. Большинство языков, которые были разработаны с нуля (без учета того, что они «похожи на C» в любом случае) были сделаны без учета регистра. Сюда входят Fortran, Cobol, Lisp и почти все семейство языков Algol (Pascal, Modula-2, Oberon, Ada и т. Д.)
Языки сценариев - это смешанный мешок. Многие из них были сделаны с учетом регистра, потому что файловая система Unix была чувствительна к регистру, и они должны были разумно взаимодействовать с ней. C как бы органично вырос в среде Unix и, вероятно, перенял оттуда философию чувствительности к регистру.
Я всегда задавался вопросом, почему языки разработаны так, чтобы быть чувствительными к регистру?
В конечном счете, это потому, что легче правильно реализовать сравнение с учетом регистра; вы просто сравниваете байты/символы без каких-либо преобразований. Вы также можете делать другие вещи, такие как хеширование, очень легко.
Почему это проблема? Ну, нечувствительность к регистру довольно трудно добавить, если вы не находитесь в крошечной области поддерживаемых символов (в частности, US-ASCII). Правила преобразования случаев варьируются в зависимости от языкового региона (турецкие правила не такие же, как в остальном мире), и нет никакой гарантии, что перелистывание одного бита будет правильным или что это всегда один и тот же бит и при одних и тех же предварительных условиях. (IIRC, в некоторых языках есть некоторые действительно сложные правила для отбрасывания диакритических знаков при преобразовании гласных в верхний регистр и повторного введения их при преобразовании в нижний регистр. Я точно забыл, каковы детали.)
Если вы чувствительны к регистру, вы просто игнорируете все это; это просто проще. (Имейте в виду, что вы все равно должны обратить внимание на формы нормализации UNICODE, но это другая история, и она применяет любые правила случая, которые вы используете.)