options = options || {}; или обращение к говнокодерам на JS

Sep 11, 2014 18:28

Давайте поговорим про джаваскрипт. А точнее, про омерзительную традицию, которая лезет во все библиотеки npm из тормозного насквозь jQuery: про передачу аргументов ассоциативным массивом ( Read more... )

Leave a comment

Comments 22

veremeenko_alex September 11 2014, 14:53:48 UTC
1. Не нужна проверка на udefined
2. Так проще задавать значения по умолчанию ( + jQuery.extend)
3. Единообразие с пунктом 2

Reply

udpn September 11 2014, 16:25:07 UTC
1. Какая проверка на андефайнед не нужна? Там вообще x = typeof x === 'undefined' ? {} : x; правильно писать, например. false и null это вполне нормальные значения для опции.

2. Зачем они нужны вообще? Можно пример?

3. ?!

Reply

metaclass September 11 2014, 16:33:33 UTC
false, null, undefined считать false и не париться, как это сделано в clojure.
Спасает от гигатонн тупого кода с проверками.

Reply

udpn September 11 2014, 16:50:04 UTC
Ну вот в DOM у нас пустое содержимое атрибута и отсутствие атрибута это разные вещи, например. В одном случае это "", в другом -- undefined, а вот в проверке они выглядят одинаково. Я не знаю, как можно от этого отказаться, если мы не готовы нашпиговать язык рукописными монадками и добавить тормозов.

Reply


dmytrish September 11 2014, 15:17:43 UTC
А как их правильно передавать?

Reply

udpn September 11 2014, 16:42:20 UTC
По-отдельности в разные функции из консистентного, хорошего набора. У функций практически всегда аргументы должны быть только обязательными, даже без перегрузки.

Вот в таком духе:

var word = new MultiLangHypher();
word.add(cache(wordHypher(lang.ru)), isRussian);
word.add(cache(wordHypher(lang.en)), isEnglish);
var text = textHypher(word);

И никогда так:

var result = $('p').hyphenate({language: 'en-us'});
// где многоязычность? кеш? настройки кеша? интеграция с markdown и подсветкой ссылок?

Reply

metaclass September 11 2014, 16:55:34 UTC
word.add мутабельность, мутабельность, не хотим :)

Reply

udpn September 11 2014, 17:17:38 UTC
Не, полностью иммутабельно тоже нельзя, снова тормоза будут. Ладно, давайте иммутабельно.

var text = textHypher(compose(
    checked(cache(wordHypher(lang.ru)), isRussian),
    checked(cache(wordHypher(lang.en)), isEnglish),
    identity
));

(Хотя вариадик-аргумент бы тоже, по-хорошему, из compose убрать, а то в Function.length херня какая-то будет, карринг не заработает.)

Reply


aamonster September 11 2014, 15:22:33 UTC
Ребе, вы просите, чтобы вам вместо быстро сляпанной поделки дали хорошо проработанную библиотеку. Это дороже - по времени на продумывание и разработку.

Конкретнее: использование аргумента-словаря позволяет быстро добавить параметр, нужный ровно в одном месте, и не поломать код во всех остальных местах (в свете отсутствия compile time checks - очень актуально).

Reply

udpn September 11 2014, 16:54:14 UTC
Ну а как же ответственность перед сообществом? Вот смотрите. Опенсорсер выкладывают дерьмовую либу. Ему бы на ковыряние либы потребовалось бы время X, а вот N юзерам на копание в его слабо документированных говнах потребовалось бы N * Y времени. Y обычно меньше X, но N * Y существенно больше. Более того, наличие опенсорсной хреновой библиотеки демотивирует людей писать что-то лучше. Зачастую лень заставляет программистов просто ослаблять условия задачи, и пользоваться тем, что есть.

Compile time checks решаются банальным переходом на TypeScript. В конце концов, no rocket science.

Reply


metaclass September 11 2014, 16:39:07 UTC
А по моему, опциональные параметры в хэшмапах - это хорошо.
Собирать что-то из запчастей - это путь к тому, что к библиотеке сделают обертку с функциями вида "сделать_заебись(options)", чтобы не заниматься этой сборкой каждый раз.

Reply

udpn September 11 2014, 16:45:52 UTC
Вы так говорите, будто это что-то плохое. Я бы такие штуки даже в библиотеку включал. Набор дефолтовых вариантов.

Я вам даже больше скажу, это Node.js-вей. Пример: вам нужно скачать файл. Вы используете http.get и обнаруживаете, что главную страницу Google вы скачать уже не можете, и вам нужно поблядовать с обработкой редиректов. Вы можете достать из широких штанин npm либу для обработки кодов http, а можете скачать сразу request, где это сделали за вас, и get работает именно так, как вы хотите. Не вижу здесь ничего плохого, пока в документации всё это прописано явно.

Reply

nponeccop September 11 2014, 18:26:07 UTC
Ну, реквест - это ходячий антипаттерн. Можно разбирать на цитаты! :)

Reply


ex_juan_gan September 11 2014, 18:16:23 UTC
Они ж этого никогда не поймут. Тем более они уже такие умные, им Даннинг с Крюгером мешают.

Не забуду, как в Гугле инженера, которых я за месяц до того научил писать юниттесты для джаваскрипта, стали заворачивать мои ченджи, потому что я там фунцкии передавал, а им сказали, что функции просто так нельзя, а надо, чтобы bind был обязательно.

Reply

udpn September 12 2014, 07:36:53 UTC
(Тот случай, когда добавить нечего, а не прокомментировать неприлично.)

Reply


Leave a comment

Up