Я бы перефразировал так: все мобильные и браузерные игры скучны и однообразны. Подавляющие большинство игр на консолях/ПК скучны и однообразны. Хорошая игра сейчас выходит раз в полтора-два года и это очень печально, т.к. старые игры тоже приедаются.
QtCreator — слишком слабый автокомплит. В последней версии что смотрел месяца 3 назад он даже от одного typedef переставал работать, про более сильные конструкции, например, с smart_ptr я даже не заикаюсь.
Netbeans — по сути аналог eclipse, но в последнее время сильно сдал.
CodeBlocks — это практически аналог VC6, очень сильно отстал от жизни. Кому хочется понастальгировать по 2000 годам — отличное средство.
Eclipse — наиболее современная и универсальная кросс-платформенная среда, которая позволяет легко интегрировать практически любую систему сборки (например, у меня нажатием 1-ой кнопки происходит сборка нужного бинарника, закачка его и других нужных файлов на удаленную машину, его выполнение по ssh и вывод результата в консоль eclipse — все это с помощью небольшого скрипта на python, который я подсунул eclipse вместо make — при этом не для всего проекта, а только для тех целей сборки которые этого требуют), версионирования (svn, hg, git, perforce), дает неплохие возможности для управления проектами и имеет достаточно хороший редактор с семантической подсветкой кода.
Так же хочу отметить KDevelop, когда с ним работал остался им очень доволен, но было это уже года 3 назад, как с ним сейчас обстоят дела — не знаю.
Ну и для простых проектов я за sublime text, удобно и просто, ничего лишнего, кроме мощнейшего редактора.
Каким образом мультиметод узнает иерархию классов? Предположим, есть базовый класс Base, от него наследуется Foo, а от Foo наследуется Bar. Каким образом мультиметод определяет правильный порядок?
И еще второй вопрос, у мультиметода в данном примере нету ничего кроме game_object и зарегистрированных функций. Т.е. единственное откуда можно взять список возможных параметров это тот список функций, которые мы передаем в качестве параметров при создании мультиметода, так? Но как?
Еще есть один нюанс cmake, то что после добавление нового файла в каталог с исходниками нужно ЗАНОВО перегненирировать все файлы для всех build modes (при использовании масок типа *.cpp). Хотя конечно это отражено в описании cmake, т.к. cmake это не система сборки, это всего лишь генератор файлов для сборки и в этом его и плюс и минус. Минус я считаю достаточно большой, т.к. подобные системы не могут живо реагировать на изменение рабочего окружения, и чем больше и сложнее проект, тем больше вероятность что-то упустить из виду.
На мой взгляд в статье показан интересный trick, с включением одного и того же хедера с разными параметрами через определения макросов. Этот же способ используется, например, в boost::function для определения классов-функций с количеством параметров 0 до 10 (а зарезервировано аж до 50).
Мне кажется метод Маркус очень похож на создания прототипа, что в данном конкретном случае конечно лучше чем подход Бориса. Потом главное этот прототип отрефакторить знаю уже большенство требований заказчика, которые были скрыты в начале разработки.
Чтобы проверить код Маркуса для начала необходим будет сам Маркус, причем достаточно свежий. Который сможет по номерам сказать какой тип булочки под номером 4, и какой тип печи под номером
Я не думаю, что у Маркуса все так запущено, даже студент догадается сделать тут enum.
Тут на хабре недавно был перевод интервью(или статьи, не суть важно) Джона Кармака, одна из фраз меня там очень сильна зацепила и изменила мой подход к подобным вопросам. Вот этот кусок:
Тут можно, например, начать говорить о функциональном программировании, лямбда-счислении, монадах — это всё красиво и очень наукообразно. Но всё это не влияет на то, что конкретно и как конкретно вы разрабатываете. Да, эти «методики» и полезные штуки позволяют ликвидировать определённые классы ошибок, допускаемых абстрактными разработчиками. Но, знаете, всё то, что я могу сделать с использованием чистого функционального языка (а это, как известно, самый академичный, научный и строго формализованный способ решения задач) — всё это будет преобразовано точно в такой же ассемблерный код, в который будет преобразовано аналогичное решение, реализованное на каком-нибудь BASIC или на чём-нибудь другом на ваш выбор.
Здесь я появился не для того что бы пропиариться, а узнать, существуют ли аналоги(хотелось бы спереть пару идей посмотреть как у людей), нужно ли это кому либо(имеет смысл выходить на рынок) и узнать, чего бы вам не хватало в подобной системе.
Ну, в качестве аналога могу попробовать предложить — cpp netlib, там типа модерн техникс. Так же к ACE можно добавить еще pocoproject. Ну, и asio из boost, который настолько не юзер френдли, что я уже его раз 10 пытался хоть как-то применить, но от вида кода который получается меня просто тошнит.
Еще вот советую почитать этот пост.
Ура! Visual Studio сама обратилась к Linux, который скомпилировал проект, и мы получили в окне IDE все что напечатал gcc; в итоге мы запустили нашу программу test с которой так же можно работать из Windows.
Я что-то не очень понял, почему Ура? На скриншоте во-первых вижу ошибку компиляции, а во-вторых у студии видно что автокомплит не работает, т.е. по сути бесполезная какая-та интеграция получается (особенно учитывая что и отладчик не будет работать).
Ну, а в саму вижу достаточно просто любую команду сборки прописать. В свойствах проекта указываем makefile и жмем применить:
Затем идем на вкладочку nmake и пишем в build command line, clean, rebuild нужные нам команды которые могут вызывать все что угодно, ну а в output путь до нашего бинарника, который собирается и который можно будет запустить под отладчиком (если отладочная сборка).
В моем примере как видно на скриншоте я просто задал свой mingw компилятор в качестве команды сборки.
Но толку особого от этого не будет если компилятор не студийный используется при сборке, т.к. даже на ошибку в консоли нельзя перейти, т.к. MSVC умеет парсить только аутпут от своего компилятора. В Eclipse, например, это реализовано с помощью плагинов и там нормально парсится любой компилятор, достаточно в конфигурации установить галочку напротив нужного.
Не первый раз это слышу и кажется не понимаю о чем идет речь. Ведь такой код:
int foo = 0;
int bar = 1;
int & ref = foo;
ref = bar;
работает без каких-либо проблем, ссылка на объект как видно переназначается.
По остальным пунктам выше уже все отписали, все возможно если захотеть, просто ссылки предоставляют более устойчивый способ написания кода.
Ну, и вообще какие-то однотипные ошибки описаны и показаны как недостаток, хотя видно явное противоречие логики и здравого смысла.
Использование ссылок для передачи выходных аргументов функции, делает факт «выходности» крайне не очевидным при чтении вызова функции:
color.getHsv(&h, &s, &v); // очевидно что мы даем методу getHsv() право менять переменные h,s,v
color.getHsv(h, s, v); // об использовании h,s,v ничего сказать нельзя
Почему это нельзя? Мне IDE подскажет параметры:
void func(const Foo const * param1, Bar * param2);
void func(const Foo & param1, Bar & param2);
Второй вариант проще читается.
По мотивам недавно пойманного бага:...
Ну так сами себе злобные буратины, ваша функция возвращает значение, а не ссылку. Разницы не было бы если она возвращала указатель, точно так же бы был бум.
return foo(x)
Правильнее надо было бы писать:
return foo<T>(x)
Вообще не понятно как этот код у вас скомпилировался. Вижуальный и g++ компиляторы выдают идентичную ошибку здесь, которая, кстати, полностью описывает проблему. Да и вообще уже вроде бы давно все компиляторы выдают ворнинг при попытке вернуть по ссылке локальную переменную.
А размер указателя судя по логике программиста видимо тоже равен размеру объекта? Странная логика. Я конечно прекрасно понимаю, что это все не очевидно, однако если программист пишет подобные вещи (в частности использование ссылок как шаблонных параметров), то он должен понимать подобные нюансы и быть что называется в теме.
Идея похожа на то что есть в этом докладе (самое начало пример с Point). Там докладчик назвал это SFINAE, только здесь очень сильно упрощенная.
Это конечно круто выглядит (передаем практически любой объект, а функция такая умная что сама определит как с ним правильно работать), но в реальности из-за подобных механизмов очень сильно страдает код, он становится сильно раздутым, непонятным, если описать одним слово — не продакшен (это приминительно к тому что в том докладе, в топике код очень простой).
А второе, я пока не видел ни одного реального примера где бы подобные механизмы реально были бы нужны — это применительно и к топику и докладу (были бы нужны — повышали производительность, читаемость, сопровождаемость кода, вообщем делали бы код лучше). В С++ подобные вещи (указанные в топике) вынесены в алгоритмы, где мы оперируем итераторами и подобный код обычно пишется так:
template <typename Container>
void fn(Container & c)
{
for (auto & i : c)
{
doSomething(i);
}
}
::std::vector<int> sv;
QList<int> qv;
OtherSuperVector<int> ov;
fn(sv);
fn(qv);
fn(ov);
Как дела с поддержкой С++11? Наиболее важное конечно с точки зрения редактора новое ключевое слово auto вместо явного определения типов.
Как насчет семантической подсветки кода — поля класса, локальные, глобальные, статические переменные, параметры функции можно ли отдельным цветом раскрасить? А неактивные участки кода закрасить (#if 0, #ifndef SOME_DEFINE, etc), в зависимости от установленных значений макросов где-нибудь в конфигурации?
Еще вот сейчас очень модно стало использовать статические аналазиторы, что насчет их интеграции?
Что-то я не понял связи между вопросами с люками и 3-х месячных программистов. Кто-нибудь может объяснить?
На мой взгляд есть другие вопросы по которым можно выяснить уровень квалификации. Например, спросить какие книги прочитал, какой самый полезный совет для себя усвоил (из какой-нибудь из прочитанных книг, заодно узнаем читал ли он их вообще или просто так заучил как стих в школе), попросить отрефакторить кусок не очень хорошего кода (заодно узнаем coding-style что очень много говорит о скиле разработчика). Расспросить о самых популярных фреймворках, которые используется в основном языке разработке. Как-то это более правильно на мой взгляд нежели про люки спрашивать.
В lua практически ничего нету кроме базового функционала ЯП — в этом его главный плюс и минус. Развернуть приложение с кучей сторонних библиотек для lua не тривиальная задача, особенно для linux.
Visual Studio раньше без VAX была не очень — а это значит нужна про версия (поддержка extensions) + еще бабло на сам VAX. Сейчас вот новая версия уже на подходе, будем посмотреть что да как там исправили.
А так вообще eclipse + sublime text. Eclipse радует вменяемым парсером, возможностью интеграции любой системы сборки и контроля версий и дебаггером(особенно актуально для linux). На huge проектах он конечно работать не будет (у меня при попытке индексирования минут через 20 вываливается с out of memory например :), но там есть возможность импортирования отдельных каталогов с нужными хедерами и сырцами вместо импортирования все древа проекта — данная фича этот недостаток исправляет. Sublime радует почти всем, как редактор просто супер и ушел далеко вперед от различных kate/notepad++ и прочих old-school редакторов.
Netbeans — по сути аналог eclipse, но в последнее время сильно сдал.
CodeBlocks — это практически аналог VC6, очень сильно отстал от жизни. Кому хочется понастальгировать по 2000 годам — отличное средство.
Eclipse — наиболее современная и универсальная кросс-платформенная среда, которая позволяет легко интегрировать практически любую систему сборки (например, у меня нажатием 1-ой кнопки происходит сборка нужного бинарника, закачка его и других нужных файлов на удаленную машину, его выполнение по ssh и вывод результата в консоль eclipse — все это с помощью небольшого скрипта на python, который я подсунул eclipse вместо make — при этом не для всего проекта, а только для тех целей сборки которые этого требуют), версионирования (svn, hg, git, perforce), дает неплохие возможности для управления проектами и имеет достаточно хороший редактор с семантической подсветкой кода.
Так же хочу отметить KDevelop, когда с ним работал остался им очень доволен, но было это уже года 3 назад, как с ним сейчас обстоят дела — не знаю.
Ну и для простых проектов я за sublime text, удобно и просто, ничего лишнего, кроме мощнейшего редактора.
Первонахи добрались и сюда? А я то думал этот тренд уже устарел.
Каким образом мультиметод узнает иерархию классов? Предположим, есть базовый класс Base, от него наследуется Foo, а от Foo наследуется Bar. Каким образом мультиметод определяет правильный порядок?
И еще второй вопрос, у мультиметода в данном примере нету ничего кроме game_object и зарегистрированных функций. Т.е. единственное откуда можно взять список возможных параметров это тот список функций, которые мы передаем в качестве параметров при создании мультиметода, так? Но как?
Я не думаю, что у Маркуса все так запущено, даже студент догадается сделать тут enum.
Ну, в качестве аналога могу попробовать предложить — cpp netlib, там типа модерн техникс. Так же к ACE можно добавить еще pocoproject. Ну, и asio из boost, который настолько не юзер френдли, что я уже его раз 10 пытался хоть как-то применить, но от вида кода который получается меня просто тошнит.
Еще вот советую почитать этот пост.
А если на каждую проблему задавать вопрос и отвечать на него, то тоже далеко не уедешь и увязнешь. Так ведь?
Мне свой подход удалось сформулировать 2 словами — просто и очевидно. Если не просто и/или не очевидно — значит нужно переделать.
Я что-то не очень понял, почему Ура? На скриншоте во-первых вижу ошибку компиляции, а во-вторых у студии видно что автокомплит не работает, т.е. по сути бесполезная какая-та интеграция получается (особенно учитывая что и отладчик не будет работать).
Ну, а в саму вижу достаточно просто любую команду сборки прописать. В свойствах проекта указываем makefile и жмем применить:
Затем идем на вкладочку nmake и пишем в build command line, clean, rebuild нужные нам команды которые могут вызывать все что угодно, ну а в output путь до нашего бинарника, который собирается и который можно будет запустить под отладчиком (если отладочная сборка).
В моем примере как видно на скриншоте я просто задал свой mingw компилятор в качестве команды сборки.
Но толку особого от этого не будет если компилятор не студийный используется при сборке, т.к. даже на ошибку в консоли нельзя перейти, т.к. MSVC умеет парсить только аутпут от своего компилятора. В Eclipse, например, это реализовано с помощью плагинов и там нормально парсится любой компилятор, достаточно в конфигурации установить галочку напротив нужного.
Не первый раз это слышу и кажется не понимаю о чем идет речь. Ведь такой код:
работает без каких-либо проблем, ссылка на объект как видно переназначается.
По остальным пунктам выше уже все отписали, все возможно если захотеть, просто ссылки предоставляют более устойчивый способ написания кода.
Ну, и вообще какие-то однотипные ошибки описаны и показаны как недостаток, хотя видно явное противоречие логики и здравого смысла.
Почему это нельзя? Мне IDE подскажет параметры:
Второй вариант проще читается.
Ну так сами себе злобные буратины, ваша функция возвращает значение, а не ссылку. Разницы не было бы если она возвращала указатель, точно так же бы был бум. Правильнее надо было бы писать: Вообще не понятно как этот код у вас скомпилировался. Вижуальный и g++ компиляторы выдают идентичную ошибку здесь, которая, кстати, полностью описывает проблему. Да и вообще уже вроде бы давно все компиляторы выдают ворнинг при попытке вернуть по ссылке локальную переменную.
А размер указателя судя по логике программиста видимо тоже равен размеру объекта? Странная логика. Я конечно прекрасно понимаю, что это все не очевидно, однако если программист пишет подобные вещи (в частности использование ссылок как шаблонных параметров), то он должен понимать подобные нюансы и быть что называется в теме.
Предложенный синтаксис мне не понравился.
Я подобные вещи называю ugly.
Вот с этим полностью согласен, а с остальным — нет.
Это конечно круто выглядит (передаем практически любой объект, а функция такая умная что сама определит как с ним правильно работать), но в реальности из-за подобных механизмов очень сильно страдает код, он становится сильно раздутым, непонятным, если описать одним слово — не продакшен (это приминительно к тому что в том докладе, в топике код очень простой).
А второе, я пока не видел ни одного реального примера где бы подобные механизмы реально были бы нужны — это применительно и к топику и докладу (были бы нужны — повышали производительность, читаемость, сопровождаемость кода, вообщем делали бы код лучше). В С++ подобные вещи (указанные в топике) вынесены в алгоритмы, где мы оперируем итераторами и подобный код обычно пишется так:
Как дела с поддержкой С++11? Наиболее важное конечно с точки зрения редактора новое ключевое слово auto вместо явного определения типов.
Как насчет семантической подсветки кода — поля класса, локальные, глобальные, статические переменные, параметры функции можно ли отдельным цветом раскрасить? А неактивные участки кода закрасить (#if 0, #ifndef SOME_DEFINE, etc), в зависимости от установленных значений макросов где-нибудь в конфигурации?
Еще вот сейчас очень модно стало использовать статические аналазиторы, что насчет их интеграции?
На мой взгляд есть другие вопросы по которым можно выяснить уровень квалификации. Например, спросить какие книги прочитал, какой самый полезный совет для себя усвоил (из какой-нибудь из прочитанных книг, заодно узнаем читал ли он их вообще или просто так заучил как стих в школе), попросить отрефакторить кусок не очень хорошего кода (заодно узнаем coding-style что очень много говорит о скиле разработчика). Расспросить о самых популярных фреймворках, которые используется в основном языке разработке. Как-то это более правильно на мой взгляд нежели про люки спрашивать.
А так вообще eclipse + sublime text. Eclipse радует вменяемым парсером, возможностью интеграции любой системы сборки и контроля версий и дебаггером(особенно актуально для linux). На huge проектах он конечно работать не будет (у меня при попытке индексирования минут через 20 вываливается с out of memory например :), но там есть возможность импортирования отдельных каталогов с нужными хедерами и сырцами вместо импортирования все древа проекта — данная фича этот недостаток исправляет. Sublime радует почти всем, как редактор просто супер и ушел далеко вперед от различных kate/notepad++ и прочих old-school редакторов.