Зачем писать такой код?

Может кто-то объяснить, как такое можно было написать? (кусок кода из реальной и популярной библиотеки):

if (t === 0) {
    return 0;
}
if ((t /= 1) === 1) {
    return 1;
}
if ((t /= 1 / 2) === 2) {
    return 1;
}

var p = 0;
if (!p) {
	p = 1 * 0.3;
}
👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А что это за библиотека, если не секрет?

Chart,js
ниже в комментах есть код функции, где он частично виден.

Это вы еще в коде стандартной библиотеки Си не копались... :)

Какой ещё «стандартной библиотеки Си»? Их много, вообще-то. Но ни в одной из них такого ужаса я не видел.

Вспомнить бы... это лет 7 назад было. Но с точки зрения читабельности кода отдельные куски точно не уступали примеру из топика.

glibc которая. В musl libc все опрятнее выглядит.

Помню, как один впаривал мне про глубокий смысл строки X = X на фортране ... вот факт сей запомнилССо, а глубокий смысл — нет... может его и не было, и тут нету :8)

А это не обфускация часом?

похоже что это какая то ревизия кода номер N после рефакторинга в которой старые куски кода были удаленны а новые куски кода добавлены побыстрому. р определенно как 1*0.3 что показывает что раньше оно могло браться из глобал варибл, могло вычисляться в коде по другой формуле и даже могло передаваться вместе с кодом как t. Во время рефакторинга кто то решил что теперь p = 1 * 0.3; навсегда и по быстрому дописал вначало локальную переменную var p = 0; оставив остальной код как есть.

меня вот это кусок заинтересовал
var p = 0;
if (!p) {
p = 1 * 0.3;
}
в чем сакральный смысл проверки, если переменная тупо объявлена, как 0, и один хрен приведеться к false, а потом еще этой переменной присваиваеться новое значение, еще и таким страннім образом, по-чему тупо не присвоить p нужное значение я хз

все 4 проверки такие же) — хз

ну как обычно происходит? надо добавить функционал, а то шо есть нихера не покрыто тестами, влез — добавил, работает, свое покрыл тестами — пошли дальше. Может при мёрже что-то было не так. А в JS же частенько и не узнаешь что что-то сломалось. Ну не показывает какой-то div-чик или где-то или warning сыпет и всё.

тут и тесты не нужны, чтобы не вникая уже заподозрить неладное:)

А в JS же частенько и не узнаешь что что-то сломалось
да ну прям- это реалии 10 годичной давности
Ну не показывает какой-то div-чик
и бегущий текст с часиками перестали работать :)
да ну прям- это реалии 10 годичной давности
А то что в зависимости от среды const’у можно пытаться присваивать и даже варнинг не словить — это так, мелочи.

Ну в ES5 констант вообще нет, да они как таковые там нафик не нужны. В ES6 пошли уже на поводу у зеленых разрабов, которые пришли с плюсов и джав и делают круглые глаза — классов нет, констант нет, ай-яй-яй!. Не присваивайте константам, делов то. Что то у меня таких проблем ни разу не было.
В реальных модулях ES5 константы в 99% случаев все ровно забиваются как свойства какого-либо объекта, если есть подозрение на криворукость- в сеттере свойства выкидываем throw и всё на этом.

покрывать надо и легаси тоже если оно есть иначе какой смысл от этих самых тестов

Пофантазирую насчет if’ов.

Первые два:
Если t — 0, возвращаем 0
Если t — 1 или true, возвращаем 1
Если t — false или null, делаем что-то еще

Третий:
Возможно, фикс бага какого-нибудь оптимизатора-минификатора, который считает, что делать что-то вроде t /=1 — глупо.

Что делает последний — загадка.

Обфускация, нинзя-кодинг. Другими словами, чтобы затруднить правку и тем более построение форка.

У вас как то каждый год обострение по поводу плохого кода. ) касаемо джиэс — это норм, и не такое бывает. Не факт что там число передается, народ как то полюбил нечитаемые но рабочие проверки делать. Помню был код, который проверял на а>2, а<2, а=2 и .... else приходилось ставить в конце, так как там при опрелеленной последовательности нажатий появлялись варианты)

1. Performance (в JS с этим сложно)
2. Readability (easy to maintain)

Performance у джс давно нормальный, браузеры медленные — это да

Если вы считаете этот код читабельным, то вы наверное не видели читабельного кода

Приятно слышать грубости от вас.
Всего вам хорошего, Антон.

		easeInOutElastic: function(t) {
			var s = 1.70158;
			var p = 0;
			var a = 1;
			if (t === 0) {
				return 0;
			}
			if ((t /= 1 / 2) === 2) {
				return 1;
			}
			if (!p) {
				p = 1 * (0.3 * 1.5);
			}
			if (a < Math.abs(1)) {
				a = 1;
				s = p / 4;
			} else {
				s = p / (2 * Math.PI) * Math.asin(1 / a);
			}
			if (t < 1) {
				return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
			}
			return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;
},

1 — не ноль, ок
2 — например :

 c /= 1 / 2  ; // если с = 10 то будет уже 20, -10 будет -20 . понятно, проехали. 
3 — похоже что да, ниочем.

вот жеж блин скандалы интриги расследования..а криминала то небыло

т.е. по-вашему c /= 1 / 2 быстрее, чем с *= 2 ?
и тогда почему t /= 1 ?

Не знаю, напишите бенчмарк. Кстати c *= 1 * 2 работает аналогично

не надо запускать бенчмарков, чтобы понять, что с *= 2 рабоает быстрее. И читается лучше. А за выражения 1*2 надо отбивать руки.

Похоже с самого начала тянется реализация, возразить конечно нечего. Ну ничего. Поди 24к+ пользователей не морочатся такими глупостями как мы тут, убогие. Я бы честно говоря ради и 10к и не такую высшую математику написала.. но увы, пока выше единицы прыгнуть не удавалось .. Пойду пры разгребать, фигней занимаемся, честное слово.


if ((t /= 1 / 2) === 2) {
return 1;
}
Хм, а это откуда и за какие времена? Что то я не пойму зачем третья проверка, какая то глубокая мысля...

Это будильник для девушек ,которые все время опаздывают)
Берется минимум и максимум, но звонит в половину времени — наверняка)

if ((t /= 1) === 1) {
return 1;
по -моему это страннее, хотя конечно JS с вашим плавающим нолем)

if ((t /= 1) === 1) {
return 1;
Ну это конечно тоже странно :) Я смысла этого не пойму. Можно ведь сразу t===1, тоже самое и с делением на половину. Опять та же 1 только подходит.

Но тут куда не глянь все странно:

if (a < Math.abs(1)) {
убирать знак у положительного числа
1 * (0.3 * 1.5);
можно подумать если перемножить два числа на выходе будет что то иное, чем число, или зачем опять 1.
хотя конечно JS с вашим плавающим нолем)
Тихо, у нас работает тайная полиция нравов JS, один звонок и... заставят 3 года по программе перевоспитания трудных асоциальных личностей учить JS начиная со времен IE5

А что это за библиотека ,если не секрет, откуда вырват код -интересно взглянуть весь контекст!)

о изучение лучших практик JS, это таки похвально :)

Было у меня подозрение, что подобная операция округляет «малые хвосты», но не подтвердилось.
Единственное, чем можно оправдать /=1 — это приведение типа переменной к Number, но тогда почему не перед
if (t === 0) {
return 0;
}
?

это приведение типа переменной к Number
Дак в функцию скорее всего и так передается уже Number, а если это почему то не так, то в hot функции каждый раз приводить параметр к числу тоже тупо.

Может это длина строки или какая-то подобная хрень..?

Зачем писать такой код?
Чтобы программистам было что пообсуждать по ночам :)

Если первые три еще кое-как понятны, то последний if заставил задуматься о смысле жизни...

С nan прикол конечно, а что такое третий if , хм .. как не переверни — проверка на половинку и все тут, в чем глубина мысли ?
ЗЫ — шедеврально !

Быдлокодер (aka погромист, горе-программист, индус; англ. Code Monkey) — это человек, который считает рекурсию мемом башорга и не знает основных алгоритмов и тонкостей языка, на котором пишет. Поэтому быдлокодер использует неочевидные и абсурдные решения. lurkmore.to/Быдлокодер

Подписаться на комментарии