Во-первых, это библиотека с кучей математики. Во-вторых, ещё и на чудовищно многословном С++. Ну ok, я уточню, математические библиотеки на С++ не пишут 99.9999% программистов
Зачем вы берёте такой махровый edge-кейс и пытаетесь его представить как нечто типовое - это загадка, конечно.
Суть в том, что написание математических библиотек - это очень узкий кейс. Называть его типовым крайне странно, т.к. 99.9% программистов такое не пишут вовсе.
А если вы хотели сказать, что бывают крайне редкие кейсы, когда длинные функции оправданы, то с этим никто собственно и не спорил.
В коммерческой разработке свои правила. Там не прокатит применять интерфейсы 30-летней давности. Разве что это заказная разработка для какой-то мелкой конторы, где вы демпингом контракт заполучили и им теперь сложно отказаться.
Да, серьёзно. Интерфейсы под Windows определяет Microsoft. Чтобы они выглядели нативно, будьте любезны следовать их рекомендациям.
А что вы чудовищного нашли в .NET программах непонятно. Речь идёт об обычных простеньких десктопных приложениях. Там .NET очевидно лучший выбор под Windows. Кажется, вы явно переоцениваете на порядок сложность ваших пет-проектов, раз считаете что C++ там жизненно необходим.
P.S. Почитайте книгу "Психбольница в руках пациентов". Там как раз подробно разбирается ситуация, когда программисты делают интерфейсы для себя, а не для пользователей.
Это безусловно так. Но случаев когда единый смысл занимает много строк - редки. Поэтому условный N используется в таком варианте: у тебя получилась функция из N+ строк, а точно ли она одно атомарное действие совершает или ты сам себя обманул?
Если действительно одно атомарное действие, то и ok. Но в 99.9% случаев это окажется не так при достаточно большом N (напр. 50).
так что ваши неуклюжие попытки затруднить мне ее развитие — идут прямо в корзину
Понятно, по существу сказать то и нечего xD
ей люди, знаете ли, пользуются;
Вот и поблагодарили бы хотя бы за то, что я вам баг подсветил. А то принимаете любой атом в качестве syntax, а пользователи ваши потом с дебагом маются из-за того, что кто-то не осилил валидацию параметров нормально сделать.
И да, МакКорд ничего про такой код в «Metaprogramming Elixir» не писал (да и не мог), потому что книжка вышла 10 лет назад
Вот уж наглядная демонстрация выражения "смотрю в книгу - вижу фигу". Перечитайте:
Avoid Injecting Large Amounts of Code
И дальше как раз идёт minimal viable example как из плохого кода по типу вашего сделать приличный код.
Самое интересное, что мне никогда не доводилось видеть работоспособный сложный код от пуристов подхода «все разбить на малюсенькие кусочки кода и разложить их по тремстам разным полочкам».
Жаль вас, ни разу в нормальной компании не довелось поработать. Структурирование кода - это важный навык для любого программиста.
Здесь уместно спросить: «Вам шашечки или ехать?». Я предпочитаю «ехать».
Это ложная дихотомия. Использовать современный UI-фреймворк ничуть не сложнее, чем UI-фреймворк старый как дерьмо мамонта. Наоборот, современные ещё и поудобнее будут.
Вот вам пример на 200+ строк (этим кодом пользуются самые разные люди, которые иногда просят что-то добавить, и если бы этот код был размазан по нескольким хелперам — я бы уже давно сдался и перестал бы что-то добавлять, а так каждое добавление — минут на 15 с тестами).
Да уж. Запихнуть прямо в quote столько строк - это полный ппц, даже для миддла. Вы бы книжку "Metaprogramming in Elixir" хоть бы прочитали. Там подробно описано, почему так не надо делать.
Держите рефакторинг, который сокращает ваш говнокод на 51 строку, и при этом читаемость возрастает существенно. Плюсом ещё и ошибку вам исправил при доставании syntax из options, и спеки для статического анализатора добавил. И тесты, разумеется, на отдельные небольшие функции писать гораздо проще, чем на одну огромную.
defmodule ASTHelpers do
@spec fetch_syntax(keyword() | map()) :: Finitomata.Mermaid | Finitomata.PlantUML
def fetch_syntax(options) do
case Keyword.fetch!(options, :syntax) do
:flowchart ->
Finitomata.Mermaid
:state_diagram ->
Finitomata.PlantUML
module when module in [Finitomata.Mermaid, Finitomata.PlantUML] ->
reporter().info([
[:yellow, "deprecated: ", :reset],
"using built-in modules as syntax names is deprecated, please use ",
[:blue, ":flowchart", :reset],
" and/or ",
[:blue, ":state_diagram", :reset],
" instead"
])
module
invalid_value ->
raise ArgumentError, "Invalid value of syntax opt: #{inspect(invalid_value)}"
end
end
@spec fetch_listener(keyword() | map(), atom()) :: Finitomata.Listener.t() | Mox.t()
def fetch_listener(options, module) do
mox_envs = options |> Keyword.fetch!(:mox_envs) |> List.wrap()
case Keyword.fetch!(options, :listener) do
:mox -> if Mix.env() in mox_envs, do: def_mock_for(module)
{:mox, listener} -> if Mix.env() in mox_envs, do: def_mock_for(module), else: listener
{listener, :mox} -> if Mix.env() in mox_envs, do: def_mock_for(module), else: listener
listener -> listener
end
end
defp def_mock_for(module) do
with {:error, error} <- Code.ensure_compiled(Mox) do
reporter().info([
[:yellow, "expectation: ", :reset],
"to be able to use ",
[:blue, ":mox", :reset],
" listener in tests with ",
[:blue, "`Finitomata.ExUnit`", :reset],
", please add ",
[:blue, "`{:mox, \"~> 1.0\", only: [:test]}`", :reset],
" as a dependency to your ",
[:blue, "`mix.exs`", :reset],
" project file (got: ",
[:yellow, inspect(error), :reset],
")"
])
end
[module, Mox] |> Module.concat() |> tap(&Mox.defmock(&1, for: Finitomata.Listener))
end
defp reporter do
if Code.ensure_loaded?(Mix), do: Mix.shell(), else: Logger
end
end
И это я только первые 73 строки прочитал и из них осталось только 22. Потому что, когда я опции разбираю, я хочу видеть логику разбора каждой конкретной опции инкапсулированной в отдельную функцию, а не общую спагетти-мешанину.
И в дальнейших раундах рефакторинга можно и весь последующий код сделать гораздо более удобоваримым.
Я его привел для тех, кто сможет экстраполировать. Это называется minimal viable example, если вы не способны — это ещё не значит, что вокруг все такие же.
Your hobby is extrapolating
Your hobby is extrapolating
Ну, видите, как интересно. Более реальный пример наглядно показал, что вы пока что просто плохо умеете программировать. Желаю вам в этом году повысить свой профессиональный уровень, а то подрываете мне тут имидж программистов на Elixir. Ая-яй-яй.
ТоталКоммандер вообще на Delphi, насколько я помню, также как и классический Skype
А идея оценивать удобство ЯП по скриншотам GUI звучит так, что вы знаете толк в извращениях. Тем более, что судя по вашим скриншотам, вы совсем какой-то древний UI-фреймворк используете. Даже 20 лет назад такой интерфейс выглядел устаревшим как какая-то программа времён Windows 95.
Оригинальное число, которое мы тут обсуждаем — 50. И только если это одно атомарное действие. (Это цитата из моего первого комментария, стартовавшего ветку.)
Вы не сможете придумать атомарное действие, нуждающееся в тысячах или десятках тысячах строк для реализации.
Так вы сами не смогли придумать атомарное действие, нуждающееся в 50 строках. И зачем то привели пример из 2 строк. Максимально неконструктивный троллинг.
Могли бы вы в двух словах рассказать, почему проект закрылся (кроме санкций)?
По факту, основная причина в том, что у нас не хватило мотивации грести против течения. К сожалению, грамматико-переводной способ изучения языков очень плотно засел на подкорку почти всем. И привлекать аудиторию на тренажер, где нет ни зубрёжки грамматических конструкций, ни заучивания списков слово-перевод оказалось довольно дорогим занятием.
Проект какое-то время существовал без рекламы, но органический рост был очень медленным, и когда возникли проблемы с оплатой хостинга и сервисов, уже не было мотивации всё переносить на другие сервера.
какие инструменты для самостоятельного изучения минилексики по английскому вы бы рекомендовали?
А там есть под спойлером "Методы запоминания новых слов" подборка инструментов. Но по факту инструмент не так важен, пользуйтесь любым, который интервальные повторения позволяет делать. Хоть физически на листочках карточки сделайте и по нескольким коробкам (на каждый интервал своя) их раскладывайте.
Тут есть фундаментальная проблема в том, что готовые наборы карточек почти всегда сделаны из рук вон плохо. Лучше делайте свои. Там не должно быть пары слово-перевод, а должен быть какой-то вариант использования в контексте и транскрипция по IPA. Контекст можно взять из ReversoContext или из Youglish. Если лень самому карточки делать, то можно Lingvist заюзать, там правда контекст из газет и журналов дан, что иногда выдаёт специфические предложения околополитического контекста, но в целом норм. В любом случае, заучивание перевода слов без контекста и подборок слов по тематикам - это самые вредные занятия, которые можно в сфере изучения языков вообразить. Первое перепутает вам ассоциативные связи, т.к. многозначность слов в разных языках отличается. А второе заставит вас запоминать слова, которыми вы даже в русском не пользуетесь, типа "плоскогорье". Всегда опирайтесь на свою личную частотность употребления. Если вы не можете вспомнить, когда в прошлый раз в русской речи использовали какое-то слово, то уж точно не нужно учить его перевод. На уровне C1+ этими излишествами займётесь, если заходите.
Ну а чего вы тогда на з/п жалуетесь? Нравится в веб-студиях работать - работайте. Просто примите, что у этой работы есть свой потолок по доходу. И что вы не программист, а веб-мастер. А если ещё перестать себя сравнивать с программистами, то жить станет проще и веселее.
Кому-то и дворником нравится работать, ну а что - работа на свежем воздухе, физическая активность и каждый день делаешь мир чище. Круто? Круто!
Это исключительно вопрос личного выбора и личной ответственности за этот выбор.
Заказчикам почему-то обычно не нужно что-то уникальное, что до них никто не делал.
Заказчики, которым нужно что-то типовое, большую з/п вам платить не будут. Это самый начальный уровень аля "веб-студия". Я бы не рекомендовал там задерживаться больше чем на 2-3 года.
Конечно, пару бумажных справочников иметь необходимо при этом
Зачем бумажных то? Сейчас почти все ЯП и фреймворки идут со встроенной документацией. Открывай локально её в браузере и пользуйся спокойно без интернета.
И как это противоречит тому, что я написал?
Во-первых, это библиотека с кучей математики. Во-вторых, ещё и на чудовищно многословном С++.
Ну ok, я уточню, математические библиотеки на С++ не пишут 99.9999% программистов
Зачем вы берёте такой махровый edge-кейс и пытаетесь его представить как нечто типовое - это загадка, конечно.
Суть в том, что написание математических библиотек - это очень узкий кейс. Называть его типовым крайне странно, т.к. 99.9% программистов такое не пишут вовсе.
А если вы хотели сказать, что бывают крайне редкие кейсы, когда длинные функции оправданы, то с этим никто собственно и не спорил.
Ну, у вас свой путь - хобби-программирование.
В коммерческой разработке свои правила. Там не прокатит применять интерфейсы 30-летней давности. Разве что это заказная разработка для какой-то мелкой конторы, где вы демпингом контракт заполучили и им теперь сложно отказаться.
Да, серьёзно. Интерфейсы под Windows определяет Microsoft. Чтобы они выглядели нативно, будьте любезны следовать их рекомендациям.
А что вы чудовищного нашли в .NET программах непонятно. Речь идёт об обычных простеньких десктопных приложениях. Там .NET очевидно лучший выбор под Windows. Кажется, вы явно переоцениваете на порядок сложность ваших пет-проектов, раз считаете что C++ там жизненно необходим.
P.S. Почитайте книгу "Психбольница в руках пациентов". Там как раз подробно разбирается ситуация, когда программисты делают интерфейсы для себя, а не для пользователей.
Это безусловно так. Но случаев когда единый смысл занимает много строк - редки. Поэтому условный N используется в таком варианте: у тебя получилась функция из N+ строк, а точно ли она одно атомарное действие совершает или ты сам себя обманул?
Если действительно одно атомарное действие, то и ok. Но в 99.9% случаев это окажется не так при достаточно большом N (напр. 50).
Понятно, по существу сказать то и нечего xD
Вот и поблагодарили бы хотя бы за то, что я вам баг подсветил. А то принимаете любой атом в качестве syntax, а пользователи ваши потом с дебагом маются из-за того, что кто-то не осилил валидацию параметров нормально сделать.
Вот уж наглядная демонстрация выражения "смотрю в книгу - вижу фигу". Перечитайте:
И дальше как раз идёт minimal viable example как из плохого кода по типу вашего сделать приличный код.
Жаль вас, ни разу в нормальной компании не довелось поработать. Структурирование кода - это важный навык для любого программиста.
Под «Форточки» вам .NET как эталон интерфейсов надо рассматривать, вот обзор UI-фреймворков под него: https://www.youtube.com/watch?v=ze8o-Qa3v7Y
Это ложная дихотомия. Использовать современный UI-фреймворк ничуть не сложнее, чем UI-фреймворк старый как дерьмо мамонта. Наоборот, современные ещё и поудобнее будут.
Да уж. Запихнуть прямо в quote столько строк - это полный ппц, даже для миддла. Вы бы книжку "Metaprogramming in Elixir" хоть бы прочитали. Там подробно описано, почему так не надо делать.
Держите рефакторинг, который сокращает ваш говнокод на 51 строку, и при этом читаемость возрастает существенно. Плюсом ещё и ошибку вам исправил при доставании syntax из options, и спеки для статического анализатора добавил. И тесты, разумеется, на отдельные небольшие функции писать гораздо проще, чем на одну огромную.
И это я только первые 73 строки прочитал и из них осталось только 22. Потому что, когда я опции разбираю, я хочу видеть логику разбора каждой конкретной опции инкапсулированной в отдельную функцию, а не общую спагетти-мешанину.
И в дальнейших раундах рефакторинга можно и весь последующий код сделать гораздо более удобоваримым.
Your hobby is extrapolating
Ну, видите, как интересно. Более реальный пример наглядно показал, что вы пока что просто плохо умеете программировать. Желаю вам в этом году повысить свой профессиональный уровень, а то подрываете мне тут имидж программистов на Elixir. Ая-яй-яй.
ТоталКоммандер вообще на Delphi, насколько я помню, также как и классический Skype
А идея оценивать удобство ЯП по скриншотам GUI звучит так, что вы знаете толк в извращениях. Тем более, что судя по вашим скриншотам, вы совсем какой-то древний UI-фреймворк используете. Даже 20 лет назад такой интерфейс выглядел устаревшим как какая-то программа времён Windows 95.
Комментарии не относятся к LOC, так же как и пустые строки.
Так вы сами не смогли придумать атомарное действие, нуждающееся в 50 строках. И зачем то привели пример из 2 строк. Максимально неконструктивный троллинг.
Это для кого это типовой пример? Для разработчиков Maple или Wolfram Mathematica?
Да и, судя по количеству переменных и параметров, придётся вам численные методы применять, а они отлично абстрагируются в отдельные функции.
С мультиков полнометражных можно начать. Они самые понятные)
Да не, всё норм с фразой "what is your evidence", это необязательно про физические улики.
По факту, основная причина в том, что у нас не хватило мотивации грести против течения. К сожалению, грамматико-переводной способ изучения языков очень плотно засел на подкорку почти всем. И привлекать аудиторию на тренажер, где нет ни зубрёжки грамматических конструкций, ни заучивания списков слово-перевод оказалось довольно дорогим занятием.
Проект какое-то время существовал без рекламы, но органический рост был очень медленным, и когда возникли проблемы с оплатой хостинга и сервисов, уже не было мотивации всё переносить на другие сервера.
А там есть под спойлером "Методы запоминания новых слов" подборка инструментов. Но по факту инструмент не так важен, пользуйтесь любым, который интервальные повторения позволяет делать. Хоть физически на листочках карточки сделайте и по нескольким коробкам (на каждый интервал своя) их раскладывайте.
Тут есть фундаментальная проблема в том, что готовые наборы карточек почти всегда сделаны из рук вон плохо. Лучше делайте свои. Там не должно быть пары слово-перевод, а должен быть какой-то вариант использования в контексте и транскрипция по IPA. Контекст можно взять из ReversoContext или из Youglish. Если лень самому карточки делать, то можно Lingvist заюзать, там правда контекст из газет и журналов дан, что иногда выдаёт специфические предложения околополитического контекста, но в целом норм. В любом случае, заучивание перевода слов без контекста и подборок слов по тематикам - это самые вредные занятия, которые можно в сфере изучения языков вообразить. Первое перепутает вам ассоциативные связи, т.к. многозначность слов в разных языках отличается. А второе заставит вас запоминать слова, которыми вы даже в русском не пользуетесь, типа "плоскогорье". Всегда опирайтесь на свою личную частотность употребления. Если вы не можете вспомнить, когда в прошлый раз в русской речи использовали какое-то слово, то уж точно не нужно учить его перевод. На уровне C1+ этими излишествами займётесь, если заходите.
Вот это, действительно, проблема. Без развитого навыка самообучения научиться чему бы то ни было - крайне проблематично.
Я когда-то давно писал статью на эту тему: https://habr.com/ru/articles/415749/
Впрочем, возможно, автор текущей статьи с ней не согласится. Но он своё видение поленился сформулировать. Одни жалобы.
Ну а чего вы тогда на з/п жалуетесь? Нравится в веб-студиях работать - работайте. Просто примите, что у этой работы есть свой потолок по доходу. И что вы не программист, а веб-мастер. А если ещё перестать себя сравнивать с программистами, то жить станет проще и веселее.
Кому-то и дворником нравится работать, ну а что - работа на свежем воздухе, физическая активность и каждый день делаешь мир чище. Круто? Круто!
Это исключительно вопрос личного выбора и личной ответственности за этот выбор.
Заказчики, которым нужно что-то типовое, большую з/п вам платить не будут. Это самый начальный уровень аля "веб-студия". Я бы не рекомендовал там задерживаться больше чем на 2-3 года.
Зачем бумажных то? Сейчас почти все ЯП и фреймворки идут со встроенной документацией. Открывай локально её в браузере и пользуйся спокойно без интернета.