Как Вам такой вариант без дополнительных переменных и магических чисел? Дополнительная переменная в данном случае уместна только в том случае, когда она используется более одного раза, или, например, попадает в скоуп извне. Ну или всё равно на используемую память приложением. Иначе переменная должна своим именем говорить, что в ней.
наличие переменной лучше
Что Вы можете сказать о переменной down_width, не зная контекста? И лучше ли в данном случае? Лично мне данное имя в контексте последующего кода говорит о том, что ресайз на увеличение не должен происходить, и задумка именно на уменьшение размера картинки (и стоило бы добавить проверку, так ли это на самом деле, если я, к примеру, хочу транслировать видео 320х240).
Сразу скажу, что это лично мое мнение, и оно не должно совпадать с мнением других людей. Например, как я понял из статьи, оно точно не совпадает с мнением разработчика работодателя, который делал Вам замечания.
Комментировать очевидный код не нужно. Комментарии нужны только в том случае, когда из кода не совсем может быть понятно (по мнению автора кода) что происходит, или, например, используются какие-то хитрые конструкции/оптимизации/паттерны. В Вашем случае:
# Закроем все окна и все сокеты
Зачем? Разве из следующих двух строк это не очевидно? Такой комментарий только захламляет код, его "чуточку сложнее" воспринимать.
Комментарий, дублирующий документацию сторонних библиотек (как работа логгера): зачем? В крайнем случае - ссылка на документацию, и то навряд ли нужно, ибо обычный программист работающий со сторонними библиотеками в курсе, что почти в 99.99% случаев у библиотек адекватная документация и если что-то не понятно - то нужно искать объяснения использования именно там, а не у Вас в коде.
# Настройки для отображения видео
А вот это - случай поинтереснее. Если бы так случилось, что программисту дают впервые смотреть этот код и он не знает что он должен делать - тут комментарий оправдан, потому что именование переменных немного странное. Что значит down_points ? Что это за нижние точки? Зачем две переменные down_width и down_height, если они используются только единожды? Задел на будущее? Почему они используются в cv2.resize, ресайз не предусматривает увеличение, только уменьшение? Но, опять же, тут лучше не комментировать, а просто переназвать переменные, которые будут отражать суть для чего они были инициализированы.
Вам нравится программировать на языке, созданном в 1970-е, он наполняет вас чувством глубокого удовлетворения, когда можно сделать буквально что угодно – и оно заработает?
Справедливости ради стоит заметить, что можно использовать язык, созданный в 2006-ом:
А Visual Studio из коробки? Извините за сарказм. Просто amarao, скорее всего, имел ввиду, что в linux ничего предварительно-дополнительно ставить не нужно и вся забота ложиться на пакетный менеджер.
Крошка сын к отцу пришел, и спросила кроха: - Что такое хорошо и что такое плохо?
Каким должен быть хороший язык? Возможно ли, что везение зависит не только от стратегических ошибок, а, например, еще и от парадигмы, ниши, екосистемы?
@des1roer именно. И добавить статический фабричный метод, который будет приводить типы перед вызовом конструктора. Никаких геттеров не нужно, у нас публичные ридонли поля.
@mvs если хочется еще по заморачиваться и челленджей для такой задачи, то подумайте о том, что будет, когда обновлять курсы надо не через HTTP. Допустим, из файла. Тогда RatesUpdater станет HttpRatesUpdater унаследованным от RatesUpdaterInterface. По факту же главное передать валидный ДТО в сервис. А откуда это ДТО пришло - всё равно.
yield - это ключевое слово в php, которое работает почти как return, но в отличии от return может приостановить выполнение функции, а не полностью остановить её. И говорит нам о том, что мы имеем дело с генератором (\Generator). Пример:
function getValues(): \Generator
{
yield 1;
yield 2;
yield 3;
}
function getValuesArray(): array
{
return [1, 2, 3];
}
foreach(getValues() as $int) {}
foreach(getValuesArray() as $int) {}
оба foreach практически идентичны в действиях, но yield в генераторе позволяет получить значение и приостановить генератор, в то время как массив будет передан сразу полностью.
P.S. В этом видео то же, что и в цикле статей. Но формат может будет понятней =)
Несколько человек, недавно покинувших компанию, заявили, что заняли аналогичную должность в другой студии с зарплатой примерно на 10 тысяч фунтов стерлингов больше.
у меня немного не складывается с
некоторые сотрудники пропускают обед на работе, чтобы сэкономить, и не могут себе позволить включить дома отопление.
Я правильно понимаю, что речь примерно об одинаковых среднестатистических зарплатах среднестатистических сотрудников компании? Это получается, что в Team17 практически ничего не платят, или отопление в Великобритании - только для избранных?
$class = new class implements SomeInterface {
public function hello(string $name): string
{
return sprintf('Hello, %s!', $name);
}
};
echo (new $class())->hello('World');
Смотря кто недооценивает =) Я очень даже ценю. Уже года три как сижу на suse и горя не знаю. Ну если честно, то проблемы иногда бывают (типа звук в гугл митс не работает через блютуз гарнитуру), но это такой пустяк на фоне того, что я имею rolling release =) И DE в suse - свободный выбор, можно KDE, Gnome, Xfce и другие (практически все). Как по мне - KDE работает отлично.
Почему странно? Например, любой компилятор/интерпретатор - вполне себе довольно требовательный читатель, который потом правильно сообщит процессору что надо делать. Гораздо удобней, если код понимает не только компилятор/интерпретатор, а и программист (не обязательно автор), который с этим кодом в данный момент работает.
наследование необходимо для чисто технического момента, как чтение полей, и ничего более.
если надо чтение полей - сделайте, например, класс со статической функцией, которая будет читать поля объекта и не зависеть ни от чего. Не нужно наследовать "контроллер" и "модель" ради реализации пары функций да еще и с надежой на протектед поля. Создайте интерфейс контроллера и модели что бы быть уверенным, что это тот объект, что ожидается, а не надежда на путь к папке и строгое имя для "моделей" и "контроллеров". Почему в кавычках? - Да потому что в Вашем случае это не модели и не контроллеры.
А зачем?
А затем, что я, например, сам предпочитаю выбирать, где и как размещать классы (я буду следовать PSR-4, этого должно быть достаточно). Вы же диктуете правила, которые можно обойти интерфейсами. А зачем мне тогда такой пакет, а не симфони темплейтинг например? (который уже deprecated, кстати) Хотя это риторический вопрос, мне не нужно шаблонизировать темы под вп =)
У вас есть конкретные предложения по этому поводу?
Посоветую посмотреть на https://github.com/symfony/templating и так же прогнать проект с помощью https://github.com/squizlabs/PHP_CodeSniffer (Вы уж извините, но нейминг и форматирование ужасны и сложно читаемы). Так же почитайте PSR-12, BlockA_C - не очень валидное название класса. Ну и MVC - это не про наследование модели и контроллера от одного класса. Так же попробуйте учесть варианты, что блоки не обязательно должны быть в одном каталоге (их теоретически может быть много и они могут быть связаны). В целом - идея может и взлетит, но сейчас это не похоже на пакет, которым можно пользоваться.
Вообще-то там есть про всё.
Повторю еще раз: я не утверждаю, что qmake куда-то делся и qmake нельзя. Можно, пользуйтесь на здоровье.
Ну и про замечания о «не нужно»: если бы было не нужно — то не было бы указано, что «There is no immediate need to port your project to CMake.». Т.е. перевожу дословно: нет необходимости портироватся незамедлительно. Но сама необходимость есть, но необязательная. По этому и есть qmake. Пока что. Вот через года 3-4 встретимся тут снова и посмотрим. А сейчас я не вижу смысла спорить.
Ну и еще один линк. Пусть полежит
Команда признаёт, что эволюция qmake зашла в тупик и замена его было лишь вопросом времени.
По моему, Вы просто путаете понятия версий и системы сборки. А так же просто не открывали те два линка что я постил выше (оба с официального сайта Qt, попрошу заметить). Где английским по белому написано, что дефолтная система сборки — cmake. Даже написано, что в шестой версии что бы собрать проект с qmake — надо указать аргумент --qmake, иначе будет использована дефолтная (угадаете какая?).
Вы же мне предлагаете заняться полной дичью и удалить компонент фреймворка (который, по факту мной не используется): у меня всё прекрасно собирается и с cmake
Скрытый текст
19:41:33: Running steps for project SomeQtProject...
19:41:33: Starting: "/usr/bin/cmake" --build . --target all
[0/2 ?/sec] Re-checking globbed directories...
[1/6 2.5/sec] Automatic MOC and UIC for target SomeQtProject
[2/6 5.0/sec] Generating ~/projects/tmp/SomeQtProject/SomeQtProject_en_US.ts
Scanning directory '~/projects/tmp/SomeQtProject'...
Updating '../../SomeQtProject/SomeQtProject_en_US.ts'...
Found 3 source text(s) (0 new and 3 already existing)
[3/6 0.8/sec] Building CXX object CMakeFiles/SomeQtProject.dir/SomeQtProject_autogen/mocs_compilation.cpp.o
[4/6 1.0/sec] Building CXX object CMakeFiles/SomeQtProject.dir/main.cpp.o
[5/6 1.1/sec] Building CXX object CMakeFiles/SomeQtProject.dir/include/Window/mainwindow.cpp.o
[6/6 1.1/sec] Linking CXX executable SomeQtProject
19:41:38: The process "/usr/bin/cmake" exited normally.
19:41:38: Elapsed time: 00:06.
Возможно где-то в недрах QtCreator и используется qmake (в cmake передается QT_QMAKE_EXECUTABLE, я не знаю зачем, я в основном использую CLion, там это не указывается и тоже собирается отлично), но так или иначе — я использую cmake, и документация Qt тоже говорит о том, что надо использовать cmake вместо qmake.
И между прочим в Kits у меня везде cmake а версии вынесены отдельно. Есть даже вкладка для настройки cmake, но нет для qmake.
Скрытый текст
И вообще, мне не комфортно вести с Вами диалог. За сим откланяюсь и отвечать больше не буду. Все претензии по поводу cmake и просьбой «удалить qmake» — обращайтесь к парням из qt.io.
frameSize = (400, 400)
Как Вам такой вариант без дополнительных переменных и магических чисел? Дополнительная переменная в данном случае уместна только в том случае, когда она используется более одного раза, или, например, попадает в скоуп извне. Ну или всё равно на используемую память приложением. Иначе переменная должна своим именем говорить, что в ней.
Что Вы можете сказать о переменной
down_width
, не зная контекста? И лучше ли в данном случае? Лично мне данное имя в контексте последующего кода говорит о том, что ресайз на увеличение не должен происходить, и задумка именно на уменьшение размера картинки (и стоило бы добавить проверку, так ли это на самом деле, если я, к примеру, хочу транслировать видео 320х240).Сразу скажу, что это лично мое мнение, и оно не должно совпадать с мнением других людей. Например, как я понял из статьи, оно точно не совпадает с мнением разработчика работодателя, который делал Вам замечания.
Комментировать очевидный код не нужно. Комментарии нужны только в том случае, когда из кода не совсем может быть понятно (по мнению автора кода) что происходит, или, например, используются какие-то хитрые конструкции/оптимизации/паттерны. В Вашем случае:
Зачем? Разве из следующих двух строк это не очевидно? Такой комментарий только захламляет код, его "чуточку сложнее" воспринимать.
Комментарий, дублирующий документацию сторонних библиотек (как работа логгера): зачем? В крайнем случае - ссылка на документацию, и то навряд ли нужно, ибо обычный программист работающий со сторонними библиотеками в курсе, что почти в 99.99% случаев у библиотек адекватная документация и если что-то не понятно - то нужно искать объяснения использования именно там, а не у Вас в коде.
А вот это - случай поинтереснее. Если бы так случилось, что программисту дают впервые смотреть этот код и он не знает что он должен делать - тут комментарий оправдан, потому что именование переменных немного странное. Что значит
down_points
? Что это за нижние точки? Зачем две переменныеdown_width
иdown_height
, если они используются только единожды? Задел на будущее? Почему они используются вcv2.resize
, ресайз не предусматривает увеличение, только уменьшение? Но, опять же, тут лучше не комментировать, а просто переназвать переменные, которые будут отражать суть для чего они были инициализированы.Справедливости ради стоит заметить, что можно использовать язык, созданный в 2006-ом:
https://github.com/Rust-for-Linux/linux
https://github.com/fishinabarrel/linux-kernel-module-rust
А Visual Studio из коробки? Извините за сарказм. Просто amarao, скорее всего, имел ввиду, что в linux ничего предварительно-дополнительно ставить не нужно и вся забота ложиться на пакетный менеджер.
Каким должен быть хороший язык? Возможно ли, что везение зависит не только от стратегических ошибок, а, например, еще и от парадигмы, ниши, екосистемы?
@des1roer именно. И добавить статический фабричный метод, который будет приводить типы перед вызовом конструктора. Никаких геттеров не нужно, у нас публичные ридонли поля.
@mvs если хочется еще по заморачиваться и челленджей для такой задачи, то подумайте о том, что будет, когда обновлять курсы надо не через HTTP. Допустим, из файла. Тогда RatesUpdater станет HttpRatesUpdater унаследованным от RatesUpdaterInterface. По факту же главное передать валидный ДТО в сервис. А откуда это ДТО пришло - всё равно.
yield - это ключевое слово в php, которое работает почти как return, но в отличии от return может приостановить выполнение функции, а не полностью остановить её. И говорит нам о том, что мы имеем дело с генератором (\Generator). Пример:
оба foreach практически идентичны в действиях, но yield в генераторе позволяет получить значение и приостановить генератор, в то время как массив будет передан сразу полностью.
P.S. В этом видео то же, что и в цикле статей. Но формат может будет понятней =)
Скорее всего что знал, но так исторически сложилось, что именно первый "псевдокод" (для еще не созданной машины) написала Ада Лавлейс.
у меня немного не складывается с
Я правильно понимаю, что речь примерно об одинаковых среднестатистических зарплатах среднестатистических сотрудников компании? Это получается, что в Team17 практически ничего не платят, или отопление в Великобритании - только для избранных?
Если будет возможность, поделитесь потом мнением, очень интересно.
Непонятно, но очень интересно =)
https://stackoverflow.com/questions/62928396/what-is-a-niebloid
просто сообщения не видно =)
Можно не сохранять в файл:
Смотря кто недооценивает =) Я очень даже ценю. Уже года три как сижу на suse и горя не знаю. Ну если честно, то проблемы иногда бывают (типа звук в гугл митс не работает через блютуз гарнитуру), но это такой пустяк на фоне того, что я имею rolling release =) И DE в suse - свободный выбор, можно KDE, Gnome, Xfce и другие (практически все). Как по мне - KDE работает отлично.
84MiB за полторы сутки. openSUSE Tumbleweed, KDE Plasma 5.23, KDE 5.89
Почему странно? Например, любой компилятор/интерпретатор - вполне себе довольно требовательный читатель, который потом правильно сообщит процессору что надо делать. Гораздо удобней, если код понимает не только компилятор/интерпретатор, а и программист (не обязательно автор), который с этим кодом в данный момент работает.
если надо чтение полей - сделайте, например, класс со статической функцией, которая будет читать поля объекта и не зависеть ни от чего. Не нужно наследовать "контроллер" и "модель" ради реализации пары функций да еще и с надежой на протектед поля. Создайте интерфейс контроллера и модели что бы быть уверенным, что это тот объект, что ожидается, а не надежда на путь к папке и строгое имя для "моделей" и "контроллеров". Почему в кавычках? - Да потому что в Вашем случае это не модели и не контроллеры.
А затем, что я, например, сам предпочитаю выбирать, где и как размещать классы (я буду следовать PSR-4, этого должно быть достаточно). Вы же диктуете правила, которые можно обойти интерфейсами. А зачем мне тогда такой пакет, а не симфони темплейтинг например? (который уже deprecated, кстати) Хотя это риторический вопрос, мне не нужно шаблонизировать темы под вп =)
нет.
Посоветую посмотреть на https://github.com/symfony/templating и так же прогнать проект с помощью https://github.com/squizlabs/PHP_CodeSniffer (Вы уж извините, но нейминг и форматирование ужасны и сложно читаемы). Так же почитайте PSR-12,
BlockA_C
- не очень валидное название класса. Ну и MVC - это не про наследование модели и контроллера от одного класса. Так же попробуйте учесть варианты, что блоки не обязательно должны быть в одном каталоге (их теоретически может быть много и они могут быть связаны). В целом - идея может и взлетит, но сейчас это не похоже на пакет, которым можно пользоваться.Вообще-то там есть про всё.
Повторю еще раз: я не утверждаю, что qmake куда-то делся и qmake нельзя. Можно, пользуйтесь на здоровье.
Ну и про замечания о «не нужно»: если бы было не нужно — то не было бы указано, что «There is no immediate need to port your project to CMake.». Т.е. перевожу дословно: нет необходимости портироватся незамедлительно. Но сама необходимость есть, но необязательная. По этому и есть qmake. Пока что. Вот через года 3-4 встретимся тут снова и посмотрим. А сейчас я не вижу смысла спорить.
Ну и еще один линк. Пусть полежит
Но Вы то знаете лучше, видимо.
Вы же мне предлагаете заняться полной дичью и удалить компонент фреймворка (который, по факту мной не используется): у меня всё прекрасно собирается и с cmake
19:41:33: Running steps for project SomeQtProject...
19:41:33: Starting: "/usr/bin/cmake" --build . --target all
[0/2 ?/sec] Re-checking globbed directories...
[1/6 2.5/sec] Automatic MOC and UIC for target SomeQtProject
[2/6 5.0/sec] Generating ~/projects/tmp/SomeQtProject/SomeQtProject_en_US.ts
Scanning directory '~/projects/tmp/SomeQtProject'...
Updating '../../SomeQtProject/SomeQtProject_en_US.ts'...
Found 3 source text(s) (0 new and 3 already existing)
[3/6 0.8/sec] Building CXX object CMakeFiles/SomeQtProject.dir/SomeQtProject_autogen/mocs_compilation.cpp.o
[4/6 1.0/sec] Building CXX object CMakeFiles/SomeQtProject.dir/main.cpp.o
[5/6 1.1/sec] Building CXX object CMakeFiles/SomeQtProject.dir/include/Window/mainwindow.cpp.o
[6/6 1.1/sec] Linking CXX executable SomeQtProject
19:41:38: The process "/usr/bin/cmake" exited normally.
19:41:38: Elapsed time: 00:06.
Возможно где-то в недрах QtCreator и используется qmake (в cmake передается QT_QMAKE_EXECUTABLE, я не знаю зачем, я в основном использую CLion, там это не указывается и тоже собирается отлично), но так или иначе — я использую cmake, и документация Qt тоже говорит о том, что надо использовать cmake вместо qmake.
И между прочим в Kits у меня везде cmake а версии вынесены отдельно. Есть даже вкладка для настройки cmake, но нет для qmake.
И вообще, мне не комфортно вести с Вами диалог. За сим откланяюсь и отвечать больше не буду. Все претензии по поводу cmake и просьбой «удалить qmake» — обращайтесь к парням из qt.io.