March 16, 2023

О стандартах замолвите слово

Пришлось мне тут глубоко погрузиться в стандарт языка JavaScript. Если кто не в курсе, кратко скажу, что стандарт языка — это более или менее формализованное описание языка, определяющее смысл и поведение различных конструкций языка и их реализации. Этот документ нужен для согласования разработки компилятора и другого инструментария.

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

С другой стороны, стандарты, как и законы, могут отстать от фактического положения вещей. Больше того, иногда в стандартах, как и в законах, могут быть ошибки, от этого никто не застрахован. Это не значит, что реальность нужно подминать под закон, иногда необходимо менять стандарты.

Первый стандарт языка JavaScript появился в 1997 году.

В нем появился тип Date, предназначенный для использования дат и времени в скриптах. Идея, разумеется, прекрасная, ни одна сколь-нибудь серьезная программа не обходится без обработки дат и времён.

Но на дворе уже 2023 год, стандарт пережил 12 ревизий, а никто не обратил на вопиющие проблемы с именами:

  • метод getDate()возвращает не дату, не копию объекта или что-то еще, он возвращает день месяца!
  • метод getDay() возвращает день недели, хотя из имени это совершенно не следует.

Неужели не нашлось никого, кто бы спросил, почему такие странные имена в стандарте? Давайте их переименуем во что-то более вменяемое. Например, getDate()в getMonthDay(), а getDay() в getWeekDay().

Хорошо, пусть обратная совместимость превыше всего и мы не собираемся ломать работающий код. Но ведь у нас уже, как минимум, есть strict mode, который ломал обратную совместимость.

Но даже не обязательно переименовывать. Можно пройти через режим deprecated, как это произошло с парой getYear() и getFullYear().

Складывается ощущение, что над этими именами просто никто не задумывался.

UPD1: Интересные рассуждения, почему не стоит засорять язык версионированием.

UPD2: Открыл обсуждение изменений в стандарте JS

UPD3: Оказывается, есть предложение о доработке языка, прошедшее уже до стадии 3 (всего их 4). Проверил, в FireFox и V8 уже создан код для поддержки этого предложения. Вера в человечество возвращена )