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