Re[7]: Ширина кода - газетная vs книжная
От: Alekzander Россия  
Дата: 12.01.25 18:47
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Отделение разметки от кода это была одна из отличных идей, которая, к сожалению, не работает на практике. Все, стюардессу пора закопать.


Ну а у меня работает. То же самое можно декларативно записать при помощи <template>, и не иметь при этом дикую смесь кода и разметки.

Разметку ты можешь локализовать, разделив по языкам. Смесь скриптокода делить по языкам неудобно.

Скрипты ты можешь санитизировать, ограничив безопасным набором символов (правда, придётся ещё правила для проверки наличия инлайновых скриптов написать). Со скриптокодом такого не получится.

И ещё множество вещей начинают работать только после разделения всего и вся по DSL'ям.

bnk>Сразу уточню — оделение кода, который работает с разметкой, от разметки. Отделение бизнес-логики ("сервисов") несомненно имеет смысл.


Ещё этого не хватало. Мы же не говорим про бедных Qt'ров, у которых один язык на всё, в том числе для БЛ и управления разметкой.

A>>Я помню, как в прошлый раз я буквально замучился тебе объяснять, что переменные, которые повторяют семантику содержимого, это нарушение DRY.

bnk>Хм я вроде бы не говорил что код должен повторять разметку, или?

В прошлый раз я говорил, что кешировать запрос к DOM в переменной, чьё имя повторяет селектор, это денормализация. Чтобы её избежать, умные люди придумали чейнинг.

А в этот раз у тебя прямо разметка поименована. Хотя к ней это соображение относится так же, как и к селекторам. А шаблон может быть анонимным. Если он сам себя описывает, зачем его именовать? Чтобы забывать переименовывать при рефакторинге?
Отредактировано 12.01.2025 18:50 Alekzander . Предыдущая версия .
Re[3]: Ширина кода - газетная vs книжная
От: rudzuk  
Дата: 12.01.25 19:05
Оценка: +1
Здравствуйте, swame, Вы писали:

s> S>Интересно, покажи свой читабельный код на 140 символов


Вот 128:
const

  //
  // https://www.rfc-editor.org/rfc/rfc6229
  //
  RFC6229Tests : array [0 .. 13] of record
                                      Name    : string;
                                      KeyHex  : string;
                                      Vectors : array [0 .. 17] of record
                                                                     Offset : Integer;
                                                                     Vector : array [0 .. 15] of Byte;
                                                                   end;
                                   end =
    (
      (
        Name    : 'Test Vectors 1';
        KeyHex  : '0102030405';
        Vectors : (
                    (Offset :    0; Vector : ($b2, $39, $63, $05, $f0, $3d, $c0, $27, $cc, $c3, $52, $4a, $0a, $11, $18, $a8)),
                    (Offset :   16; Vector : ($69, $82, $94, $4f, $18, $fc, $82, $d5, $89, $c4, $03, $a4, $7a, $0d, $09, $19)),
                    (Offset :  240; Vector : ($28, $cb, $11, $32, $c9, $6c, $e2, $86, $42, $1d, $ca, $ad, $b8, $b6, $9e, $ae)),
                    (Offset :  256; Vector : ($1c, $fc, $f6, $2b, $03, $ed, $db, $64, $1d, $77, $df, $cf, $7f, $8d, $8c, $93)),
                    (Offset :  496; Vector : ($42, $b7, $d0, $cd, $d9, $18, $a8, $a3, $3d, $d5, $17, $81, $c8, $1f, $40, $41)),
                    (Offset :  512; Vector : ($64, $59, $84, $44, $32, $a7, $da, $92, $3c, $fb, $3e, $b4, $98, $06, $61, $f6)),
                    (Offset :  752; Vector : ($ec, $10, $32, $7b, $de, $2b, $ee, $fd, $18, $f9, $27, $76, $80, $45, $7e, $22)),
                    (Offset :  768; Vector : ($eb, $62, $63, $8d, $4f, $0b, $a1, $fe, $9f, $ca, $20, $e0, $5b, $f8, $ff, $2b)),
                    (Offset : 1008; Vector : ($45, $12, $90, $48, $e6, $a0, $ed, $0b, $56, $b4, $90, $33, $8f, $07, $8d, $a5)),
                    (Offset : 1024; Vector : ($30, $ab, $bc, $c7, $c2, $0b, $01, $60, $9f, $23, $ee, $2d, $5f, $6b, $b7, $df)),
                    (Offset : 1520; Vector : ($32, $94, $f7, $44, $d8, $f9, $79, $05, $07, $e7, $0f, $62, $e5, $bb, $ce, $ea)),
                    (Offset : 1536; Vector : ($d8, $72, $9d, $b4, $18, $82, $25, $9b, $ee, $4f, $82, $53, $25, $f5, $a1, $30)),
                    (Offset : 2032; Vector : ($1e, $b1, $4a, $0c, $13, $b3, $bf, $47, $fa, $2a, $0b, $a9, $3a, $d4, $5b, $8b)),
                    (Offset : 2048; Vector : ($cc, $58, $2f, $8b, $a9, $f2, $65, $e2, $b1, $be, $91, $12, $e9, $75, $d2, $d7)),
                    (Offset : 3056; Vector : ($f2, $e3, $0f, $9b, $d1, $02, $ec, $bf, $75, $aa, $ad, $e9, $bc, $35, $c4, $3c)),
                    (Offset : 3072; Vector : ($ec, $0e, $11, $c4, $79, $dc, $32, $9d, $c8, $da, $79, $68, $fe, $96, $56, $81)),
                    (Offset : 4080; Vector : ($06, $83, $26, $a2, $11, $84, $16, $d2, $1f, $9d, $04, $b2, $cd, $1c, $a0, $50)),
                    (Offset : 4096; Vector : ($ff, $25, $b5, $89, $95, $99, $67, $07, $e5, $1f, $bd, $f0, $8b, $34, $d8, $75))
                  )
      )
avalon/3.0.2
Re[4]: Ширина кода - газетная vs книжная
От: swame  
Дата: 12.01.25 19:11
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, swame, Вы писали:


s>> S>Интересно, покажи свой читабельный код на 140 символов


R>Вот 128:


ну это данные write — only которые не читают и не отлаживают, не код.
А recod я бы перенес на след строку со сдвигом влево. Это символов 30
Отредактировано 12.01.2025 19:13 swame . Предыдущая версия .
Re[8]: Ширина кода - газетная vs книжная
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.01.25 19:17
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Ещё этого не хватало. Мы же не говорим про бедных Qt'ров, у которых один язык на всё, в том числе для БЛ и управления разметкой.


Наверное тут у нас недопонимание. Я имел в виду сервисов во фронтенде (в браузере, то есть).
Т.е. есть два типа функциональности — та что видна пользователю, и та что не видна (сервисы).

Смешение кода и разметки подразумевается в той части функциональности, которая пользователю видна (view, визуальные компоненты, по-разному может называться)
Смешение в том смысле, что в разметке разрешено использовать функции и переменные. IMHO, это сильно упрощает код и позволяет избежать ненужных приседаний.

A>>>Я помню, как в прошлый раз я буквально замучился тебе объяснять, что переменные, которые повторяют семантику содержимого, это нарушение DRY.

bnk>>Хм я вроде бы не говорил что код должен повторять разметку, или?

A>В прошлый раз я говорил, что кешировать запрос к DOM в переменной, чьё имя повторяет селектор, это денормализация. Чтобы её избежать, умные люди придумали чейнинг.

A>А в этот раз у тебя прямо разметка поименована. Хотя к ней это соображение относится так же, как и к селекторам. А шаблон может быть анонимным. Если он сам себя описывает, зачем его именовать? Чтобы забывать переименовывать при рефакторинге?

Это не у меня, это просто компоненты. Оно сейчас в любом фреймворке подобным образом выглядит, даже в тех которые как-то пытаются отделять шаблоны явно (angular, vue)
Декомпозиция, чтобы можно было строить приложение из больших блоков. Переименовывается все давно автоматически само (вместе с разметкой понятно).
Отредактировано 12.01.2025 19:18 bnk . Предыдущая версия .
Re[4]: Ширина кода - газетная vs книжная
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.01.25 19:26
Оценка:
Здравствуйте, swame, Вы писали:

S>У вас тут вычисления 2 раза повторяются.

S>Вычислить арифметические выражения в локальные переменные 3 строки.
S>Вычислить Func1 и Func2 еще в 2 локальные переменные. еще 2 строки
S>вызвать деление. 1 строка
S>строк меньше, код понятней, на каждом шаге можно проверить результат,
S>в отладчике видно в какой функции возникла проблема.

Ты придираешься, ясно же, что он из головы написал что пришло в голову, и в реальности там никаких повторений может не быть
Маньяк Робокряк колесит по городу
Re[4]: Ширина кода - газетная vs книжная
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.25 19:26
Оценка:
Здравствуйте, swame, Вы писали:

S>У вас тут вычисления 2 раза повторяются.


Да это ж пример навскидку, а не из кода. Все, что повторяется в разных ветках, я обычно выношу наружу.

S>Вычислить Func1 и Func2 еще в 2 локальные переменные.


Э-э-э... Вы серьезно предлагаете вызывать обе функции, когда смысл был в альтернативном вызове?

S>в отладчике видно в какой функции возникла проблема.


По-первых, делать заведомо лишние вызовы только для удобства работы в отладчике — так себе идея. Во-вторых, у функций бывают побочные эффекты, из-за которых вызов функции, которая не должна вызываться в данном контексте, может иметь фатальные последствия.
Re[4]: Ширина кода - газетная vs книжная
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.25 19:28
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Завести вспомогательную переменную и превратить ?: в if-else?


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

А добавить const к существующей переменной, насколько я знаю, не позволяет ни один язык.
Re[6]: Ширина кода - газетная vs книжная
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.01.25 19:28
Оценка:
Здравствуйте, Alekzander, Вы писали:

bnk>>Ну вот это как раз элементарно. Для этого придумали компоненты и композицию. JSX? React? Angular? Vue? Web Components? Astro? Нет, не слышали. Это съедобно? Так-то jQuery наше все


A>Это называется "реакционное движение". Умные люди годами отделяли декларативную разметку от императивного кода, как говно от подошвы, для чего? Чтобы императивщики потом пришли нанести ответный удар?


Макросы вполне декларативны
Маньяк Робокряк колесит по городу
Re[5]: Ширина кода - газетная vs книжная
От: swame  
Дата: 12.01.25 19:44
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, swame, Вы писали:


S>>У вас тут вычисления 2 раза повторяются.

S>>Вычислить арифметические выражения в локальные переменные 3 строки.
S>>Вычислить Func1 и Func2 еще в 2 локальные переменные. еще 2 строки
S>>вызвать деление. 1 строка
S>>строк меньше, код понятней, на каждом шаге можно проверить результат,
S>>в отладчике видно в какой функции возникла проблема.

M>Ты придираешься, ясно же, что он из головы написал что пришло в голову, и в реальности там никаких повторений может не быть


Я слишким много порефакторил и поревьювил чужого вычислительного кода, в которой именно таких повторений было полно.
Вычисление одного и того же в цикле меня тоже совсем не удивляет.
Отредактировано 12.01.2025 19:53 swame . Предыдущая версия . Еще …
Отредактировано 12.01.2025 19:50 swame . Предыдущая версия .
Re[5]: Ширина кода - газетная vs книжная
От: rudzuk  
Дата: 12.01.25 19:57
Оценка: +1
Здравствуйте, swame, Вы писали:

s> s>> S>Интересно, покажи свой читабельный код на 140 символов


s> R>Вот 128:


s> ну это данные write — only которые не читают и не отлаживают, не код.


Это тоже код.

На читабельность алгоритмического кода, в первую очередь, влияет именование идентификаторов и корректное форматирование (включая смысловую группировку), а не следование жестко установленной ширине.

s> А recod я бы перенес на след строку со сдвигом влево. Это символов 30


Вероятно, у нас разные задачи, и в мою экономия ширины не входит
avalon/3.0.2
Re[9]: Ширина кода - газетная vs книжная
От: Alekzander Россия  
Дата: 12.01.25 20:00
Оценка: 1 (1) :)
Здравствуйте, 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, чтобы меня верстальщиком не заменили.
Re[3]: Ширина кода - газетная vs книжная
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.01.25 20:02
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>
ЕМ>TypeWithLongName const VarWithLongName =
ЕМ>  (Var1 !=0 && Func1 (Arg1, Arg2))? (
ЕМ>    Func1WithLongName (
ЕМ>      Arg1WithLongName + Arg2WithLongName,
ЕМ>      Arg3WithLongName - Arg4WithLongName,
ЕМ>      Arg5WithLongName * Arg6WithLongName
ЕМ>    )
ЕМ>  ) : (
ЕМ>    Func2WithLongName (
ЕМ>      Arg1WithLongName + Arg2WithLongName,
ЕМ>      Arg4WithLongName - Arg3WithLongName,
ЕМ>      Arg6WithLongName / Arg5WithLongName
ЕМ>    )
ЕМ>  );
ЕМ>


ЕМ>Такая форма мне кажется весьма извращенной, но как эту извращенность если не ликвидировать, то хотя бы просто уменьшить?


Можно как минимум убрать дублирование кода:

auto FuncToCall = (Var1 !=0 && Func1 (Arg1, Arg2))? Func1WithLongName : Func2WithLongName;
TypeWithLongName const VarWithLongName = FuncToCall(
  Arg1WithLongName + Arg2WithLongName,
  Arg3WithLongName - Arg4WithLongName,
  Arg5WithLongName * Arg6WithLongName
)
Re[5]: Ширина кода - газетная vs книжная
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.01.25 20:02
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

Pzz>>Завести вспомогательную переменную и превратить ?: в if-else?


ЕМ>Я б с удовольствием, но тогда переменная не будет const, а я хочу именно так, чтоб иметь возможность поймать случайную ошибку, связанную с модификацией.


А если сначала сложить результат во временную неконстантную переменную, а потом проинициализировать от нее уже константу?

Или вообще, вынести все эти вычисления во вспомогательную функцию и проинициализировать константу возвращаемым ей значением?
Re[5]: Ширина кода - газетная vs книжная
От: swame  
Дата: 12.01.25 20:10
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, swame, Вы писали:


S>>У вас тут вычисления 2 раза повторяются.


ЕМ>Да это ж пример навскидку, а не из кода. Все, что повторяется в разных ветках, я обычно выношу наружу.


Как вы написали, так я поревьювил.
Первый аргумент, равен второй с минусом, третий различается. такое часто в вычислительных алгоритмах.
Откуда я знаю что вы выносите? Скорее в большинстве случаев того, что я ревьювил, не выносят.
Особенно те, кто вот так пишет, все в одно выражение .

S>>Вычислить Func1 и Func2 еще в 2 локальные переменные.


ЕМ>Э-э-э... Вы серьезно предлагаете вызывать обе функции, когда смысл был в альтернативном вызове?


нет не предлагаю лишних вычислений, с ходу не разобрался в вашем алгоритме.
НО если его не надо отлаживать, логировать и аргументы не повторяются, то у вас вполне нормальная запись. Узкая.

S>>в отладчике видно в какой функции возникла проблема.


ЕМ>По-первых, делать заведомо лишние вызовы только для удобства работы в отладчике — так себе идея. Во-вторых, у функций бывают побочные эффекты, из-за которых вызов функции, которая не должна вызываться в данном контексте, может иметь фатальные последствия.
Отредактировано 12.01.2025 20:12 swame . Предыдущая версия .
Re[4]: Ширина кода - газетная vs книжная
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.25 20:43
Оценка: +1
Здравствуйте, bnk, Вы писали:

bnk>Можно как минимум убрать дублирование кода


А можно присмотреться, действительно ли он дублирован.
Re[6]: Ширина кода - газетная vs книжная
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.25 20:46
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>сначала сложить результат во временную неконстантную переменную, а потом проинициализировать от нее уже константу?


Как будто это меньшее извращение, чем такое форматирование кода. С форматированием хоть точно известно, что оно никак не повлияет на результат, а тут надо следить, чтоб компилятор не налажал.

Pzz>вынести все эти вычисления во вспомогательную функцию и проинициализировать константу возвращаемым ей значением?


Когда вычисления достаточно сложные/объемные — так и делаю. Но часто вычисления достаточно простые и очевидные, выносить их в функцию — только ухудшать читаемость.
Re[5]: Ширина кода - газетная vs книжная
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.01.25 20:57
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

bnk>>Можно как минимум убрать дублирование кода


ЕМ>А можно присмотреться, действительно ли он дублирован.


  Гы

Отредактировано 12.01.2025 21:08 bnk . Предыдущая версия .
Re[6]: Ширина кода - газетная vs книжная
От: swame  
Дата: 12.01.25 21:16
Оценка: +1
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, Евгений Музыченко, Вы писали:


bnk>>>Можно как минимум убрать дублирование кода


ЕМ>>А можно присмотреться, действительно ли он дублирован.


Это о "пользе" широких, подробных имен. Была бы буква + цифра — увидел бы с большей вероятностью.
Re[6]: Ширина кода - газетная vs книжная
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.01.25 21:33
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Гы


Ну да, можно было написать "FirstArgWithLongName, SecondArgWithLongName".
Re[5]: Ширина кода - газетная vs книжная
От: karbofos42 Россия  
Дата: 12.01.25 22:56
Оценка: -1 :))
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>А добавить const к существующей переменной, насколько я знаю, не позволяет ни один язык.


Java умеет такое:
final int value;
if (...) {
  value = 1;
} else {
  value = 2;
}
value = 3; // ошибка компиляции из-за изменения final-переменной

И если блок else убрать, то попытка использования value приведёт к ошибке компиляции, как обращение к неинициализированной переменной.
C# вот уже не умеет так, т.к. readonly для локальных переменных почему-то не подвезли.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.