Давайте поговорим про джаваскрипт. А точнее, про омерзительную традицию, которая лезет во все библиотеки npm из тормозного насквозь jQuery: про передачу аргументов ассоциативным массивом
( Read more... )
1. Какая проверка на андефайнед не нужна? Там вообще x = typeof x === 'undefined' ? {} : x; правильно писать, например. false и null это вполне нормальные значения для опции.
Ну вот в DOM у нас пустое содержимое атрибута и отсутствие атрибута это разные вещи, например. В одном случае это "", в другом -- undefined, а вот в проверке они выглядят одинаково. Я не знаю, как можно от этого отказаться, если мы не готовы нашпиговать язык рукописными монадками и добавить тормозов.
По-отдельности в разные функции из консистентного, хорошего набора. У функций практически всегда аргументы должны быть только обязательными, даже без перегрузки.
Вот в таком духе:
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 и подсветкой ссылок?
Ребе, вы просите, чтобы вам вместо быстро сляпанной поделки дали хорошо проработанную библиотеку. Это дороже - по времени на продумывание и разработку.
Конкретнее: использование аргумента-словаря позволяет быстро добавить параметр, нужный ровно в одном месте, и не поломать код во всех остальных местах (в свете отсутствия compile time checks - очень актуально).
Ну а как же ответственность перед сообществом? Вот смотрите. Опенсорсер выкладывают дерьмовую либу. Ему бы на ковыряние либы потребовалось бы время X, а вот N юзерам на копание в его слабо документированных говнах потребовалось бы N * Y времени. Y обычно меньше X, но N * Y существенно больше. Более того, наличие опенсорсной хреновой библиотеки демотивирует людей писать что-то лучше. Зачастую лень заставляет программистов просто ослаблять условия задачи, и пользоваться тем, что есть.
Compile time checks решаются банальным переходом на TypeScript. В конце концов, no rocket science.
А по моему, опциональные параметры в хэшмапах - это хорошо. Собирать что-то из запчастей - это путь к тому, что к библиотеке сделают обертку с функциями вида "сделать_заебись(options)", чтобы не заниматься этой сборкой каждый раз.
Вы так говорите, будто это что-то плохое. Я бы такие штуки даже в библиотеку включал. Набор дефолтовых вариантов.
Я вам даже больше скажу, это Node.js-вей. Пример: вам нужно скачать файл. Вы используете http.get и обнаруживаете, что главную страницу Google вы скачать уже не можете, и вам нужно поблядовать с обработкой редиректов. Вы можете достать из широких штанин npm либу для обработки кодов http, а можете скачать сразу request, где это сделали за вас, и get работает именно так, как вы хотите. Не вижу здесь ничего плохого, пока в документации всё это прописано явно.
Они ж этого никогда не поймут. Тем более они уже такие умные, им Даннинг с Крюгером мешают.
Не забуду, как в Гугле инженера, которых я за месяц до того научил писать юниттесты для джаваскрипта, стали заворачивать мои ченджи, потому что я там фунцкии передавал, а им сказали, что функции просто так нельзя, а надо, чтобы bind был обязательно.
Comments 22
2. Так проще задавать значения по умолчанию ( + jQuery.extend)
3. Единообразие с пунктом 2
Reply
2. Зачем они нужны вообще? Можно пример?
3. ?!
Reply
Спасает от гигатонн тупого кода с проверками.
Reply
Reply
Reply
Вот в таком духе:
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
Reply
var text = textHypher(compose(
checked(cache(wordHypher(lang.ru)), isRussian),
checked(cache(wordHypher(lang.en)), isEnglish),
identity
));
(Хотя вариадик-аргумент бы тоже, по-хорошему, из compose убрать, а то в Function.length херня какая-то будет, карринг не заработает.)
Reply
Конкретнее: использование аргумента-словаря позволяет быстро добавить параметр, нужный ровно в одном месте, и не поломать код во всех остальных местах (в свете отсутствия compile time checks - очень актуально).
Reply
Compile time checks решаются банальным переходом на TypeScript. В конце концов, no rocket science.
Reply
Собирать что-то из запчастей - это путь к тому, что к библиотеке сделают обертку с функциями вида "сделать_заебись(options)", чтобы не заниматься этой сборкой каждый раз.
Reply
Я вам даже больше скажу, это Node.js-вей. Пример: вам нужно скачать файл. Вы используете http.get и обнаруживаете, что главную страницу Google вы скачать уже не можете, и вам нужно поблядовать с обработкой редиректов. Вы можете достать из широких штанин npm либу для обработки кодов http, а можете скачать сразу request, где это сделали за вас, и get работает именно так, как вы хотите. Не вижу здесь ничего плохого, пока в документации всё это прописано явно.
Reply
Reply
Не забуду, как в Гугле инженера, которых я за месяц до того научил писать юниттесты для джаваскрипта, стали заворачивать мои ченджи, потому что я там фунцкии передавал, а им сказали, что функции просто так нельзя, а надо, чтобы bind был обязательно.
Reply
Reply
Leave a comment