Можно только гадать почему не использовался такой вариант:
cls.last_label = 0 # reset intenal counter
Может из-за того, что в будущем (для сброса) потребуется больше 1 действия. Ответить сможет только автор кода, если вспомнит.
По поводу printHelloWorld(): вы сами ответили на свой вопрос.
Как минимум снизится шанс опечатки. За счет того, что действия находятся в 1 месте.
Отсюда следует другой плюс: чтобы изменить эти действия придется внести правку в 1 место, а не искать все места с копипастой по всей кодовой базе.
Насчет быстродействия: на абстрактном примере нельзя дать никакой другой рекомендации кроме "код надо писать для человека" (ибо может оказаться что узкое место вообще в другом месте и т.п.).
И самое главное (снова имхо): на подобные вопросы нет однозначного ответа. Все зависит от контекста.
gen_cat(consumers) в примере входит внутрь каждого контекста genfrom_queue
Как он может зайти внутрь каждого контекста, если genfrom_queue() никогда не выйдет из вечного цикла, т.к. StopIteration никогда не появится в очереди (см. блок "т.к." из моего предыдущего сообщения)?
P.S. Попробую с другой стороны:
Если приглядеться, то можно увидеть, что (в данном конкретном примере) consumers содержит результаты 3х вызовов genfrom_queue(in_q).
Чем эти 3 вызова genfrom_queue(in_q) отличаются друг от друга?
Вопрос касательно кода из примера "Маршрутизация данных на генераторах (мультиплексирование, броадкастинг)":
будет ли работать этот код с разными очередями?
Я так понимаю что нет.
для чего нужен gen_cat(consumers) в multiplex()?
Я так понимаю что не нужен, нас интересует только genfrom_queue(in_q).
Т.к. (при текущей реализации) gen_cat() никогда не дойдет до 2+ элемента sources,
т.к. sendto_queue() никогда не дойдет до StopIteration,
т.к. в follow() бесконечный цикл.
# Normal statement-based flow control
if <cond1>:
func1()
elif <cond2>:
func2()
else:
func3()
# Equivalent "short circuit" expression
(<cond1> and func1()) or (<cond2> and func2()) or (func3())
"Equivalent "short circuit" expression" НЕ является эквивалентом "Normal statement-based flow control". Пример:
>>> func1 = lambda: print('func1')
>>> func2 = lambda: print('func2')
>>> func3 = lambda: print('func3')
>>> x = 1
>>> (x == 1 and func1()) or (x == 2 and func2()) or (func3())
func1
func3
>>> if x == 1: func1()
... elif x == 2: func2()
... else: func3()
...
func1
И вот сидишь, как дебил, читаешь это сообщение и думаешь: ну и что же изменилось?
Никто не скажет вам что изменилось. Обратите внимание на то, что было сказано выше:
раньше у нас в аппсторе всегда было написано Bugs and improvement fixes, теперь появился человек, который тестирует различные формулировки в истории и их влияние на основные метрики
Я понимаю это так: "у нас есть метрики, мы будем на них воздействовать посредством changelog". Соответственно, там может вообще не быть ни слова про сделанные изменения, если это не влияет на метрики. Другими словами: содержимое changelog определяют метрики, а не изменения.
P.S. Имхо: подобные приложения стоит расценивать как интерфейсы, у которых есть только одна версия — актуальная.
Вот бы плагин для vscode чтобы редактировать настройки wt как настройки самого vscode…
Или хотя бы файл конфига со всеми доступными настройками как в sublime text 3.
Все никак не могу понять: если сломать ABI, то какой смысл оставаться на С++?
Буквально на днях (в рамках "олимпиады" посвященной переписыванию wc) в очередной раз стало понятно что компиляторы разных языков выдают примерно одинаково работающий бинарь.
P.S. Я не против плюсов и своей профессиональной деятельности использую 2 языка: С++17, Python27.
В хаскеле раздрядность Int тоже 64, так что все честно.
P.S. по крайней мере у меня такая разрядность...
GHCi, version 8.6.5: http://www.haskell.org/ghc/ :? for help
Prelude> maxBound :: Int 9223372036854775807
Prelude> import Data.Bits
Prelude Data.Bits> bitSizeMaybe (0 :: Int)
Just 64
А раньше, чем через полгода не было вопросов, а пошел ли работник туда, куда его послали.
Почему автор должен был следить за тем, куда пошел работник? Работнику был дан совет. Работник решил им не пользоваться.
сами этой статьей пожаловались аудитории хабра
Почему эта статья считается нытьем? Автор поделился неплохой идеей (банальной конечно, но не все о ней знают/задумывались) и для упрощения выразил это в форме «личной истории».
Нигде ведь нет фраз в духе: «как меня печалит Х… это невыносимо… какой я бедный и несчастный...» и т.п.
Была обозначена проблема и вариант решения. Будь это нытьем — никакого решения не было бы.
Коду вообще все без разницы, а программисту/человеку — нет.
Ниже вы правильно говорите:
Я просто пишу getConfig() и меня не волнует откуда он берётся, из базы или памяти или файла или ещё откуда. Это не моя зона ответственности.
Однако непонятно почему упустили информацию о гарантиях из комментария выше:
Смысл появляется тогда, когда у вас существуют функции, которые не живут в IO. Которые гарантированно (компилятором) не могут выдавать команды для работы с файловой системой. Или которые гарантированно (компилятором) не могут менять глобальные переменные. Или даже их читать. Или которые гарантированно (компилятором) не лезут в интернет или в БД...
Основная идея заключается в том, чтобы не только не заморачиваться чужой зоной ответственности, но и быть уверенным в том, что там не произойдет ничего неожиданного (и иметь возможность гарантировать/доказать это, а не только надеяться).
P.S. надеюсь тут не будет возражений в духе «читайте контракты».
Можно только гадать почему не использовался такой вариант:
Может из-за того, что в будущем (для сброса) потребуется больше 1 действия. Ответить сможет только автор кода, если вспомнит.
По поводу
printHelloWorld()
: вы сами ответили на свой вопрос.Как минимум снизится шанс опечатки. За счет того, что действия находятся в 1 месте.
Отсюда следует другой плюс: чтобы изменить эти действия придется внести правку в 1 место, а не искать все места с копипастой по всей кодовой базе.
Насчет быстродействия: на абстрактном примере нельзя дать никакой другой рекомендации кроме "код надо писать для человека" (ибо может оказаться что узкое место вообще в другом месте и т.п.).
И самое главное (снова имхо): на подобные вопросы нет однозначного ответа. Все зависит от контекста.
cls.last_label = 0
?Я — нет, но благодаря этой функции я смогу сбросить label.
Итого:
printHelloWorld()
нужна в том случае, если определенный набор действий (print("Hello, world!")
) повторяетсябольше 2х размногократно.P.S. Все вышесказанное = имхо.
Как он может зайти внутрь каждого контекста, если
genfrom_queue()
никогда не выйдет из вечного цикла, т.к. StopIteration никогда не появится в очереди (см. блок "т.к." из моего предыдущего сообщения)?P.S. Попробую с другой стороны:
Если приглядеться, то можно увидеть, что (в данном конкретном примере) consumers содержит результаты 3х вызовов
genfrom_queue(in_q)
.Чем эти 3 вызова
genfrom_queue(in_q)
отличаются друг от друга?Вопрос касательно кода из примера "Маршрутизация данных на генераторах (мультиплексирование, броадкастинг)":
Я так понимаю что нет.
gen_cat(consumers)
вmultiplex()
?Я так понимаю что не нужен, нас интересует только
genfrom_queue(in_q)
.Т.к. (при текущей реализации)
gen_cat()
никогда не дойдет до 2+ элементаsources
,т.к.
sendto_queue()
никогда не дойдет доStopIteration
,т.к. в
follow()
бесконечный цикл.Какая-то косвенная проверка. Может лучше явно проверять именно то, что было написано? Т.е.:
Именно так.
Я считаю что это ограничение должно быть явно указано в статье.
Собственно, следующий пример имеет аналогичную проблему:
Если запустить, то получим следующий вывод:
FP версия делает 1 лишнее действие (по сравнению с IMP).
"Equivalent "short circuit" expression" НЕ является эквивалентом "Normal statement-based flow control". Пример:
Разница в том, что с if'ом func3 не вызывается.
Никто не скажет вам что изменилось. Обратите внимание на то, что было сказано выше:
Я понимаю это так: "у нас есть метрики, мы будем на них воздействовать посредством changelog". Соответственно, там может вообще не быть ни слова про сделанные изменения, если это не влияет на метрики. Другими словами: содержимое changelog определяют метрики, а не изменения.
P.S. Имхо: подобные приложения стоит расценивать как интерфейсы, у которых есть только одна версия — актуальная.
Это совершенно точно не типичная статья в желтой прессе, ибо ценность информации в типичной статье желтой прессе стремится к 0.
Лично я не знал такие подробности, поэтому данная статья позволит будущему мне сэкономить время (если вдруг придется копать в эту сторону).
Будет проще разобраться если не экономить на переменных и не пихать промежуточные результаты в конечное выражение.
Особенно плохо заходят функции вида:
Вот бы плагин для vscode чтобы редактировать настройки wt как настройки самого vscode…
Или хотя бы файл конфига со всеми доступными настройками как в sublime text 3.
Ради новых концепций, которые в плюсах не заложены (при этом иногда реализованы, но через костыли).
Все никак не могу понять: если сломать ABI, то какой смысл оставаться на С++?
Буквально на днях (в рамках "олимпиады" посвященной переписыванию wc) в очередной раз стало понятно что компиляторы разных языков выдают примерно одинаково работающий бинарь.
P.S. Я не против плюсов и своей профессиональной деятельности использую 2 языка: С++17, Python27.
Не надо стрематься. С нетерпением ждем продолжения %)
Интересно, откуда пошла эта подмена ("экспертиза", а не "компетентность")?.. В последние пару месяцев это встречается очень часто.
В хаскеле раздрядность Int тоже 64, так что все честно.
P.S. по крайней мере у меня такая разрядность...
Почему автор должен был следить за тем, куда пошел работник? Работнику был дан совет. Работник решил им не пользоваться.
Почему эта статья считается нытьем? Автор поделился неплохой идеей (банальной конечно, но не все о ней знают/задумывались) и для упрощения выразил это в форме «личной истории».
Нигде ведь нет фраз в духе: «как меня печалит Х… это невыносимо… какой я бедный и несчастный...» и т.п.
Была обозначена проблема и вариант решения. Будь это нытьем — никакого решения не было бы.
Ниже вы правильно говорите:
Однако непонятно почему упустили информацию о гарантиях из комментария выше:
Основная идея заключается в том, чтобы не только не заморачиваться чужой зоной ответственности, но и быть уверенным в том, что там не произойдет ничего неожиданного (и иметь возможность гарантировать/доказать это, а не только надеяться).
P.S. надеюсь тут не будет возражений в духе «читайте контракты».