Какова цель чувствительности к регистру на языках? [дубликат]

17
задан Community 23 May 2017 в 10:24
поделиться

8 ответов

Не обязательно иметь два члена, которые различаются только регистром на языках, которые его поддерживают. Например, вот довольно распространенная часть C #:

private readonly string name;
public string Name { get { return name; } }

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

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

17
ответ дан 30 November 2019 в 10:58
поделиться

Представьте, что у вас есть объект с именем dog , у которого есть метод Bark () . Также вы определили класс Dog, который имеет статический метод Bark () . Вы пишете dog.Bark () . Так что он будет делать? Вызвать метод объекта или статический метод из класса? (на языке, где :: не существует)

3
ответ дан 30 November 2019 в 10:58
поделиться

Сравнение с учетом регистра (с наивной точки зрения, игнорирующей каноническую эквивалентность) тривиально (просто сравнивайте кодовые точки), но сравнение без учета регистра не является четко определенным и чрезвычайно сложным во всех случаях, а правила невозможно изменить помнить. Реализация этого возможна, но непреднамеренно приведет к неожиданному и неожиданному поведению. Кстати, некоторые языки, такие как Fortran и Basic, всегда не учитывали регистр.

1
ответ дан 30 November 2019 в 10:58
поделиться

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

Я нашел следующий интересный пример М. Сандина в соответствующем обсуждении:

Раньше я полагаю, что чувствительность к регистру была ошибка, пока я не сделал это в случае нечувствительный язык PL / SQL (синтаксис теперь полностью забыто):

 функция IsValidUserLogin (пользователь: строка, пароль: строка): bool begin
результат = выберите * из ПОЛЬЗОВАТЕЛЕЙ
где USER_NAME = пользователь и PASSWORD = пароль;
return not is_empty (результат);
конец

Это прошло незамеченным для нескольких месяцев на мелкосерийном производстве системе, и никакого вреда от этого не произошло. Но это это неприятная ошибка, возникшая из-за дела нечувствительность, правила кодирования и как люди читают код. Урок для меня было это: вещи, которые то же должно выглядеть одинаково.

Вы сразу видите проблему? Я не мог ...

8
ответ дан 30 November 2019 в 10:58
поделиться

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

И теперь, конечно, языки любят быть совместимыми друг с другом (например, VB не может различать классы или функции C #, которые различаются только регистром), люди привыкли называть вещи одним и тем же текстом, но с разными регистрами. (См. Ответ Джона Скита - я часто этим занимаюсь), и ценности языков без регистра не было достаточно, чтобы перевесить эти два.

2
ответ дан 30 November 2019 в 10:58
поделиться

Мне нравится чувствительность к регистру, чтобы различать класс и экземпляр.

Form form = new Form();

Если этого не сделать, то в итоге получаются переменные с именами myForm или form1 или f, которые не так чисты и описательны, как простое старое form.

Чувствительность к регистру также означает, что у вас нет ссылок на form, FORM и Form, которые означают одно и то же. Мне трудно читать такой код. Мне гораздо проще сканировать код, в котором все ссылки на одну и ту же переменную выглядят одинаково.

9
ответ дан 30 November 2019 в 10:58
поделиться

Причина, по которой вы не можете понять, почему учет регистра - хорошая идея, в том, что это не так. Это всего лишь одна из странных причуд C (например, массивы на основе 0), которые теперь кажутся «нормальными», потому что многие языки скопировали то, что делал C.

C использует чувствительность к регистру в идентификаторах, но с точки зрения дизайна языка это был странный выбор. Большинство языков, которые были разработаны с нуля (без учета того, что они «похожи на C» в любом случае) были сделаны без учета регистра. Сюда входят Fortran, Cobol, Lisp и почти все семейство языков Algol (Pascal, Modula-2, Oberon, Ada и т. Д.)

Языки сценариев - это смешанный мешок. Многие из них были сделаны с учетом регистра, потому что файловая система Unix была чувствительна к регистру, и они должны были разумно взаимодействовать с ней. C как бы органично вырос в среде Unix и, вероятно, перенял оттуда философию чувствительности к регистру.

2
ответ дан 30 November 2019 в 10:58
поделиться

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

В конечном счете, это потому, что легче правильно реализовать сравнение с учетом регистра; вы просто сравниваете байты/символы без каких-либо преобразований. Вы также можете делать другие вещи, такие как хеширование, очень легко.

Почему это проблема? Ну, нечувствительность к регистру довольно трудно добавить, если вы не находитесь в крошечной области поддерживаемых символов (в частности, US-ASCII). Правила преобразования случаев варьируются в зависимости от языкового региона (турецкие правила не такие же, как в остальном мире), и нет никакой гарантии, что перелистывание одного бита будет правильным или что это всегда один и тот же бит и при одних и тех же предварительных условиях. (IIRC, в некоторых языках есть некоторые действительно сложные правила для отбрасывания диакритических знаков при преобразовании гласных в верхний регистр и повторного введения их при преобразовании в нижний регистр. Я точно забыл, каковы детали.)

Если вы чувствительны к регистру, вы просто игнорируете все это; это просто проще. (Имейте в виду, что вы все равно должны обратить внимание на формы нормализации UNICODE, но это другая история, и она применяет любые правила случая, которые вы используете.)

4
ответ дан 30 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: