Здравствуйте, bnk, Вы писали:
bnk>Отделение разметки от кода это была одна из отличных идей, которая, к сожалению, не работает на практике. Все, стюардессу пора закопать.
Ну а у меня работает. То же самое можно декларативно записать при помощи <template>, и не иметь при этом дикую смесь кода и разметки.
Разметку ты можешь локализовать, разделив по языкам. Смесь скриптокода делить по языкам неудобно.
Скрипты ты можешь санитизировать, ограничив безопасным набором символов (правда, придётся ещё правила для проверки наличия инлайновых скриптов написать). Со скриптокодом такого не получится.
И ещё множество вещей начинают работать только после разделения всего и вся по DSL'ям.
bnk>Сразу уточню — оделение кода, который работает с разметкой, от разметки. Отделение бизнес-логики ("сервисов") несомненно имеет смысл.
Ещё этого не хватало. Мы же не говорим про бедных Qt'ров, у которых один язык на всё, в том числе для БЛ и управления разметкой.
A>>Я помню, как в прошлый раз я буквально замучился тебе объяснять, что переменные, которые повторяют семантику содержимого, это нарушение DRY. bnk>Хм я вроде бы не говорил что код должен повторять разметку, или?
В прошлый раз я говорил, что кешировать запрос к DOM в переменной, чьё имя повторяет селектор, это денормализация. Чтобы её избежать, умные люди придумали чейнинг.
А в этот раз у тебя прямо разметка поименована. Хотя к ней это соображение относится так же, как и к селекторам. А шаблон может быть анонимным. Если он сам себя описывает, зачем его именовать? Чтобы забывать переименовывать при рефакторинге?
Здравствуйте, Alekzander, Вы писали:
A>Ещё этого не хватало. Мы же не говорим про бедных Qt'ров, у которых один язык на всё, в том числе для БЛ и управления разметкой.
Наверное тут у нас недопонимание. Я имел в виду сервисов во фронтенде (в браузере, то есть).
Т.е. есть два типа функциональности — та что видна пользователю, и та что не видна (сервисы).
Смешение кода и разметки подразумевается в той части функциональности, которая пользователю видна (view, визуальные компоненты, по-разному может называться)
Смешение в том смысле, что в разметке разрешено использовать функции и переменные. IMHO, это сильно упрощает код и позволяет избежать ненужных приседаний.
A>>>Я помню, как в прошлый раз я буквально замучился тебе объяснять, что переменные, которые повторяют семантику содержимого, это нарушение DRY. bnk>>Хм я вроде бы не говорил что код должен повторять разметку, или?
A>В прошлый раз я говорил, что кешировать запрос к DOM в переменной, чьё имя повторяет селектор, это денормализация. Чтобы её избежать, умные люди придумали чейнинг. A>А в этот раз у тебя прямо разметка поименована. Хотя к ней это соображение относится так же, как и к селекторам. А шаблон может быть анонимным. Если он сам себя описывает, зачем его именовать? Чтобы забывать переименовывать при рефакторинге?
Это не у меня, это просто компоненты. Оно сейчас в любом фреймворке подобным образом выглядит, даже в тех которые как-то пытаются отделять шаблоны явно (angular, vue)
Декомпозиция, чтобы можно было строить приложение из больших блоков. Переименовывается все давно автоматически само (вместе с разметкой понятно).
Здравствуйте, swame, Вы писали:
S>У вас тут вычисления 2 раза повторяются. S>Вычислить арифметические выражения в локальные переменные 3 строки. S>Вычислить Func1 и Func2 еще в 2 локальные переменные. еще 2 строки S>вызвать деление. 1 строка S>строк меньше, код понятней, на каждом шаге можно проверить результат, S>в отладчике видно в какой функции возникла проблема.
Ты придираешься, ясно же, что он из головы написал что пришло в голову, и в реальности там никаких повторений может не быть
Здравствуйте, swame, Вы писали:
S>У вас тут вычисления 2 раза повторяются.
Да это ж пример навскидку, а не из кода. Все, что повторяется в разных ветках, я обычно выношу наружу.
S>Вычислить Func1 и Func2 еще в 2 локальные переменные.
Э-э-э... Вы серьезно предлагаете вызывать обе функции, когда смысл был в альтернативном вызове?
S>в отладчике видно в какой функции возникла проблема.
По-первых, делать заведомо лишние вызовы только для удобства работы в отладчике — так себе идея. Во-вторых, у функций бывают побочные эффекты, из-за которых вызов функции, которая не должна вызываться в данном контексте, может иметь фатальные последствия.
Здравствуйте, Pzz, Вы писали:
Pzz>Завести вспомогательную переменную и превратить ?: в if-else?
Я б с удовольствием, но тогда переменная не будет const, а я хочу именно так, чтоб иметь возможность поймать случайную ошибку, связанную с модификацией.
А добавить const к существующей переменной, насколько я знаю, не позволяет ни один язык.
Здравствуйте, Alekzander, Вы писали:
bnk>>Ну вот это как раз элементарно. Для этого придумали компоненты и композицию. JSX? React? Angular? Vue? Web Components? Astro? Нет, не слышали. Это съедобно? Так-то jQuery наше все
A>Это называется "реакционное движение". Умные люди годами отделяли декларативную разметку от императивного кода, как говно от подошвы, для чего? Чтобы императивщики потом пришли нанести ответный удар?
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, swame, Вы писали:
S>>У вас тут вычисления 2 раза повторяются. S>>Вычислить арифметические выражения в локальные переменные 3 строки. S>>Вычислить Func1 и Func2 еще в 2 локальные переменные. еще 2 строки S>>вызвать деление. 1 строка S>>строк меньше, код понятней, на каждом шаге можно проверить результат, S>>в отладчике видно в какой функции возникла проблема.
M>Ты придираешься, ясно же, что он из головы написал что пришло в голову, и в реальности там никаких повторений может не быть
Я слишким много порефакторил и поревьювил чужого вычислительного кода, в которой именно таких повторений было полно.
Вычисление одного и того же в цикле меня тоже совсем не удивляет.
Здравствуйте, swame, Вы писали:
s> s>> S>Интересно, покажи свой читабельный код на 140 символов
s> R>Вот 128:
s> ну это данные write — only которые не читают и не отлаживают, не код.
Это тоже код.
На читабельность алгоритмического кода, в первую очередь, влияет именование идентификаторов и корректное форматирование (включая смысловую группировку), а не следование жестко установленной ширине.
s> А recod я бы перенес на след строку со сдвигом влево. Это символов 30
Вероятно, у нас разные задачи, и в мою экономия ширины не входит
Здравствуйте, bnk, Вы писали:
A>>Ещё этого не хватало. Мы же не говорим про бедных Qt'ров, у которых один язык на всё, в том числе для БЛ и управления разметкой.
bnk>Наверное тут у нас недопонимание. Я имел в виду сервисов во фронтенде (в браузере, то есть).
А в чём недопонимание? Для веб-приложения (с разделением на фронт и бэк) бизнес-логикой будет реализация на сервере какого-нибудь API.
А для десктопного приложения бизнес-логикой будет, скажем, операции над документами (например, copy-paste).
Если десктопное приложение писать на Qt, то у них вообще один язык на всё про всё. И для управления разметкой, и для реализации бизнес-логики. И ещё не всегда они разметку вообще пишут, вот где самый-то ужас.
Недопонимание может быть вызвано тем, что для меня разметка это не фронт, а UI. А уж какой он там, этот UI, фронтовой или десктопный, это отдельный вопрос. И бизнес-логика не перестаёт быть бизнес-логикой, хоть она документы обрабатывает, хоть на серверной базе висит.
bnk>Смешение кода и разметки подразумевается в той части функциональности, которая пользователю видна (view, визуальные компоненты, по-разному может называться) bnk>Смешение в том смысле, что в разметке разрешено использовать функции и переменные. IMHO, это сильно упрощает код и позволяет избежать ненужных приседаний.
A>>>>Я помню, как в прошлый раз я буквально замучился тебе объяснять, что переменные, которые повторяют семантику содержимого, это нарушение DRY. bnk>>>Хм я вроде бы не говорил что код должен повторять разметку, или?
A>>В прошлый раз я говорил, что кешировать запрос к DOM в переменной, чьё имя повторяет селектор, это денормализация. Чтобы её избежать, умные люди придумали чейнинг. A>>А в этот раз у тебя прямо разметка поименована. Хотя к ней это соображение относится так же, как и к селекторам. А шаблон может быть анонимным. Если он сам себя описывает, зачем его именовать? Чтобы забывать переименовывать при рефакторинге?
bnk>Это не у меня, это просто компоненты. Оно сейчас в любом фреймворке подобным образом выглядит, даже в тех которые как-то пытаются отделять шаблоны явно (angular, vue) bnk>Декомпозиция, чтобы можно было строить приложение из больших блоков. Переименовывается все давно автоматически само (вместе с разметкой понятно).
Я вот сейчас такую вещь напишу, только не обижайся, пожалуйста.
Вся культура современного фронта — это культура закомплексованного быдла.
Помнишь картинку с Карлсоном: "Ты чё, пёс, я YAML-девелопер!"?
Вот они так же комплексуют, как Карлсон. Если они не прихерачат к чему-нибудь Джаваскрипт и не напишут на нём императивный код, они чувствуют себя... кем? Верстальщиками, что ли? А как же высокая зарплата? За что её просить? И поэтому творят дикие вещи. Возьми автоматизацию деплоя, какой-нибудь gulp или pug. Это же как надо на всю голову стукнуться, чтобы оформить её как "таск-менеджер" с программируемыми императивно задачами? Кагбе, да, это гибкость, но она нужна в таких масштабах? Почему не сделать DSL? Да потому, что потом придётся кричать: "Ты чё, пёс, я YAML-девелопер!".
Другой пример. Для того, чтобы получить адаптивные пиксели (зависящие от размера строки в настройках юзера), я пользовался одно время LESS и такой записью: 20/@rem. Но оказалось, что она слишком конфликтует с современным CSS. Этот п..р (в смысле, препроцессор, а не то, что ты подумал) заменял grid-column: 1/7; на grid-column: 0.142857142857143;. А если поставить математике parens-режим, придётся писать (20/@rem), что портит всё изящество замысла. И что ты думаешь пришлось в итоге сделать? Конечно же, взять Джаваскрипт и нахерачить вот такое вот нечто:
registerPlugin
(
{
install: function (less, pluginManager, functions)
{
functions.add('rp', function (rpx)
{
return new tree.Dimension(rpx.value / 16, 'rem');
});
}
}
)
Иначе простейшее именованное (именованное — чтобы не конфликтовать с grid-column: 1/7;, в данном случае — rp, чтобы писать rp(20)) преобразование в виде деления там не организовать.
Я бы рученьки бы им всем поотрывал по самую жопоньку.
Что касается меня, я пишу на C++ разные ОС-зависимые куски, и иногда дописываю функционал браузера. Откуда у меня возьмутся комплексы? Мне, наоборот, хочется всё сделать попроще, и желательно без программирования. По возможности, голые декларации. У меня нет навязчивой идеи затащить Джаваскрпит в HTML, чтобы меня верстальщиком не заменили.
Здравствуйте, Евгений Музыченко, Вы писали:
Pzz>>Завести вспомогательную переменную и превратить ?: в if-else?
ЕМ>Я б с удовольствием, но тогда переменная не будет const, а я хочу именно так, чтоб иметь возможность поймать случайную ошибку, связанную с модификацией.
А если сначала сложить результат во временную неконстантную переменную, а потом проинициализировать от нее уже константу?
Или вообще, вынести все эти вычисления во вспомогательную функцию и проинициализировать константу возвращаемым ей значением?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, swame, Вы писали:
S>>У вас тут вычисления 2 раза повторяются.
ЕМ>Да это ж пример навскидку, а не из кода. Все, что повторяется в разных ветках, я обычно выношу наружу.
Как вы написали, так я поревьювил.
Первый аргумент, равен второй с минусом, третий различается. такое часто в вычислительных алгоритмах.
Откуда я знаю что вы выносите? Скорее в большинстве случаев того, что я ревьювил, не выносят.
Особенно те, кто вот так пишет, все в одно выражение .
S>>Вычислить Func1 и Func2 еще в 2 локальные переменные.
ЕМ>Э-э-э... Вы серьезно предлагаете вызывать обе функции, когда смысл был в альтернативном вызове?
нет не предлагаю лишних вычислений, с ходу не разобрался в вашем алгоритме.
НО если его не надо отлаживать, логировать и аргументы не повторяются, то у вас вполне нормальная запись. Узкая.
S>>в отладчике видно в какой функции возникла проблема.
ЕМ>По-первых, делать заведомо лишние вызовы только для удобства работы в отладчике — так себе идея. Во-вторых, у функций бывают побочные эффекты, из-за которых вызов функции, которая не должна вызываться в данном контексте, может иметь фатальные последствия.
Здравствуйте, Pzz, Вы писали:
Pzz>сначала сложить результат во временную неконстантную переменную, а потом проинициализировать от нее уже константу?
Как будто это меньшее извращение, чем такое форматирование кода. С форматированием хоть точно известно, что оно никак не повлияет на результат, а тут надо следить, чтоб компилятор не налажал.
Pzz>вынести все эти вычисления во вспомогательную функцию и проинициализировать константу возвращаемым ей значением?
Когда вычисления достаточно сложные/объемные — так и делаю. Но часто вычисления достаточно простые и очевидные, выносить их в функцию — только ухудшать читаемость.
Здравствуйте, bnk, Вы писали:
bnk>Здравствуйте, Евгений Музыченко, Вы писали:
bnk>>>Можно как минимум убрать дублирование кода
ЕМ>>А можно присмотреться, действительно ли он дублирован.
Это о "пользе" широких, подробных имен. Была бы буква + цифра — увидел бы с большей вероятностью.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>А добавить const к существующей переменной, насколько я знаю, не позволяет ни один язык.
Java умеет такое:
final int value;
if (...) {
value = 1;
} else {
value = 2;
}
value = 3; // ошибка компиляции из-за изменения final-переменной
И если блок else убрать, то попытка использования value приведёт к ошибке компиляции, как обращение к неинициализированной переменной.
C# вот уже не умеет так, т.к. readonly для локальных переменных почему-то не подвезли.