Автор вовсе не говорил, что возможность застрелиться большим количеством способов — непревзойдённое преимущество. Автор говорил именно о свободе действий — да, в том числе и свободе стреляться.
Дабы не быть голословным, покажу код.
Есть у меня библиотека для рисования на канвасе DeltaJS (ранее известная как Graphics2D.js, я даже писал о ней на Хабре). Сейчас она в фазе активного переписывания и дописывания, и её можно найти вот тут: https://github.com/keyten/Graphics2D
В ней можно создать квадрат на канвасе:
ctx.rect(10, 10, 200, 200, 'red');
Каждая из координат прогоняется через функцию `Delta.distance`.
Вдруг в какой-то момент разработчик вспомнил, что существует Ретина, и захотел рисовать квадраты с шириной не в px (пикселях), а в pt. Что ж, он делает так:
var oldDistance = Delta.distance;
Delta.distance = function (dist) {
if (isPtDist(dist)) {
return convertPtToPx(dist);
}
return oldDistance.apply(this, arguments);
}
Вообще-то все css-единицы итак поддерживаются в Delta, однако distance всё ещё может быть переопределение, чтобы добавить, например, полярные координаты или какие-нибудь специальные координаты в условиях специального Layout. По факту, distance специально вынесена как публичная функция, чтобы её можно было переопределить, тем самым вмешавшись в логику всей библиотеки, меняя лишь маленький кусочек. Требование при переопределении одно: возвращаться должно число. В пикселях.
Если мне понадобится что-то более существенное, например, изменить порядок аргументов функции или добавить новые, я могу переопределить Delta.Context.prototype.rect.
И подобных точек вмешательства несколько. Можно вмешаться в логику attr (Delta.Drawable.prototype.attr), добавив или изменив своё в attrHooks. Вмешаться в логику событий через eventsHooks. Через тот же attrHooks вмешаться в логику animate.
Обсуждая это с людьми, пишущими на плюсах, я спросил, как с этим справляются они. Что, если захочется добавить дополнительный параметр в std:sort или научить новому методу std:string?
Никак — ответили мне. Так ты можешь только выстрелить в ногу.
Но… — попытался возразить я.
Никаких но. Нога.
Между тем, jQuery таким образом существует уже фиг знает сколько лет. Со своими плагинами и многим другим. Ты можешь добавить на страницу сто плагинов, которые вмешиваются во внутреннюю логику jQuery и меняют разные куски, и — внезапно окажется, что у кода на js настолько большой запас прочности, что это всё будет отлично работать и синхронизироваться друг с другом, делая ровно то, что ты от них ожидаешь. Даже если меняют ровно одно и то же (при этом сохраняя предыдущее переопределение функции и передавая ему управление, если нужно).
Да, иногда плагины бывают несовместимы. Но это не отменяет того, что концепция крутая и работает.
Например, мне может захотеться сделать в плюсах #define true false, и писать исходя из этого. Или я могу захотеть сортировать массив пузырьком, чтобы найти максимум.
Так что читать мануалы и книги действительно нужно. В любом языке.
А я так понял, что речь про ускорение с помощью const. Ну типа, в компилируемых языках const имеет только одно отличие от других переменных — компилятор на момент компиляции проверяет, не хочет ли кто его переопределить. Т е. по скорости никаких отличий.
(или даже — где-то встречал, что const — это аналог #define, который считается в момент компиляции и подставляется препроцессором)
В js же const ставит специальный флаг у переменной, и интерпретатор наоборот должен тратить доп. ресурсы и следить, чтобы эту переменную никто не изменил.
Похожая история, только пробовал переводиться в МФТИ на 1 курсе. Пытался объяснить, что угорел по программированию, но, видимо, тройки по инжграфу в зачётке — гарантия обратного.
В итоге пошёл в НМУ, ни о чём особо не жалею. Частенько вспоминаю, когда встречаю физтехов, понимающих в математике или проге (а то в физике — физтехов с пмф!) меньше меня.
Можно читать научно-популярную литературу, например. Написана она обычна вполне как художественная, а цели чтения могут быть самыми разными.
Я так 1 том физики Фейнмана читал (он тоже вполне себе художественный).
Так-так, а что мешает взять формулу Стирлинга за определение факториала нецелого числа?
Кроме, конечно, требования о непрерывности, которого у нас, впрочем, и нет.
Дабы не быть голословным, покажу код.
Есть у меня библиотека для рисования на канвасе DeltaJS (ранее известная как Graphics2D.js, я даже писал о ней на Хабре). Сейчас она в фазе активного переписывания и дописывания, и её можно найти вот тут: https://github.com/keyten/Graphics2D
В ней можно создать квадрат на канвасе:
Каждая из координат прогоняется через функцию `Delta.distance`.
Вдруг в какой-то момент разработчик вспомнил, что существует Ретина, и захотел рисовать квадраты с шириной не в px (пикселях), а в pt. Что ж, он делает так:
И всё, благополучно можно писать
Вообще-то все css-единицы итак поддерживаются в Delta, однако distance всё ещё может быть переопределение, чтобы добавить, например, полярные координаты или какие-нибудь специальные координаты в условиях специального Layout. По факту, distance специально вынесена как публичная функция, чтобы её можно было переопределить, тем самым вмешавшись в логику всей библиотеки, меняя лишь маленький кусочек. Требование при переопределении одно: возвращаться должно число. В пикселях.
Если мне понадобится что-то более существенное, например, изменить порядок аргументов функции или добавить новые, я могу переопределить Delta.Context.prototype.rect.
И подобных точек вмешательства несколько. Можно вмешаться в логику attr (Delta.Drawable.prototype.attr), добавив или изменив своё в attrHooks. Вмешаться в логику событий через eventsHooks. Через тот же attrHooks вмешаться в логику animate.
Обсуждая это с людьми, пишущими на плюсах, я спросил, как с этим справляются они. Что, если захочется добавить дополнительный параметр в std:sort или научить новому методу std:string?
Никак — ответили мне. Так ты можешь только выстрелить в ногу.
Но… — попытался возразить я.
Никаких но. Нога.
Между тем, jQuery таким образом существует уже фиг знает сколько лет. Со своими плагинами и многим другим. Ты можешь добавить на страницу сто плагинов, которые вмешиваются во внутреннюю логику jQuery и меняют разные куски, и — внезапно окажется, что у кода на js настолько большой запас прочности, что это всё будет отлично работать и синхронизироваться друг с другом, делая ровно то, что ты от них ожидаешь. Даже если меняют ровно одно и то же (при этом сохраняя предыдущее переопределение функции и передавая ему управление, если нужно).
Да, иногда плагины бывают несовместимы. Но это не отменяет того, что концепция крутая и работает.
Считать, что знание языка определяется тем, помнит ли человек, что возвращается при делении на 0… Ну не знаю.
На любом языке можно написать фигню.
Например, мне может захотеться сделать в плюсах #define true false, и писать исходя из этого. Или я могу захотеть сортировать массив пузырьком, чтобы найти максимум.
Так что читать мануалы и книги действительно нужно. В любом языке.
А я так понял, что речь про ускорение с помощью const. Ну типа, в компилируемых языках const имеет только одно отличие от других переменных — компилятор на момент компиляции проверяет, не хочет ли кто его переопределить. Т е. по скорости никаких отличий.
(или даже — где-то встречал, что const — это аналог #define, который считается в момент компиляции и подставляется препроцессором)
В js же const ставит специальный флаг у переменной, и интерпретатор наоборот должен тратить доп. ресурсы и следить, чтобы эту переменную никто не изменил.
В итоге пошёл в НМУ, ни о чём особо не жалею. Частенько вспоминаю, когда встречаю физтехов, понимающих в математике или проге (а то в физике — физтехов с пмф!) меньше меня.
Если вы уйдёте, остальные 99 покупателей (у которых ничего не случится) из 100 продолжат ходить, и ваш голос рублём просто останется неуслышанным.
Срочно запретить, заблокировать и посадить.
Правда, доп. переменная всё равно создаётся в памяти. Но не в языке.
У старых абонентов остался, а вот новым… увы.
Я так 1 том физики Фейнмана читал (он тоже вполне себе художественный).
Кроме, конечно, требования о непрерывности, которого у нас, впрочем, и нет.
Пока что ещё пришла немного сумасшедшая мысль нарисовать обычный прямоугольник, а линию рисовать во фрагментном шейдере.
firststat.ru
https://habrahabr.ru/post/301894/
https://github.com/AlexeyManikin/domain_statistic