Вероятно, основная причина заключается в том, что TDD предпочитают те, у кого есть языки, более способствующие ему. Но, кроме того, сами игры все равно плохо подходят для парадигмы.
В целом (и да, я имею в виду, вообще говоря, поэтому, пожалуйста, не забрасывайте меня контрпримерами), управляемый тестами дизайн лучше всего работает для систем, управляемых событиями, и не очень хорошо для систем в стиле моделирования. Вы по-прежнему можете использовать тесты на ваших низкоуровневых компонентах в играх, будь то тестовое или простое модульное тестирование, но для задач более высокого уровня редко бывает какое-либо дискретное событие, которое вы можете смоделировать с детерминированными результатами.
Например, веб-приложение обычно имеет очень четкие входные данные (HTTP-запрос), изменяет очень небольшое количество состояний (например, записи в базе данных) и генерирует в значительной степени детерминированный вывод (например, HTML-страница) , Их можно легко проверить на достоверность, а поскольку создание входных данных просто, создание тестов тривиально.
Однако в играх может быть сложно смоделировать ввод (особенно если он должен произойти в определенный момент ... подумайте о прохождении экранов загрузки, экранов меню и т. Д.), Количество изменяемого состояния может быть большим (например, если у вас физическая система или сложный реактивный ИИ), и выходной сигнал редко бывает детерминированным (основным виновником здесь является использование случайных чисел, хотя такие вещи, как потеря точности с плавающей запятой, являются другими, как могут быть спецификации оборудования или доступны Процессорное время или производительность фонового потока и т. Д.).
Чтобы выполнить TDD, вам нужно точно знать, что вы ожидаете увидеть в определенном событии, и иметь точный способ его измерения, и обе эти проблемы являются сложными с симуляциями, которые избегают дискретных событий, преднамеренно включают случайные факторы, действуют по-разному на разных машинах, и имеют аналоговые выходы, такие как графика и аудио.
Кроме того, есть одна серьезная практическая проблема - время запуска процесса. Многие из вещей, которые вы захотите протестировать, требуют загрузки больших объемов данных, и если вы копируете данные, вы на самом деле не тестируете алгоритм. Имея это в виду, быстро становится непрактичным иметь какие-либо испытательные леса, которые просто выполняют отдельные задачи. Вы можете запускать тесты на веб-сервере без необходимости каждый раз отключать веб-сервер - это редко возможно для игр, если вы не проводите тестирование на встроенном языке сценариев (что разумно и действительно имеет место в отрасли).
Например, вы хотите добавить объемный рендеринг теней в свои игровые здания. Таким образом, вам нужно написать тест, который запускает все необходимые подсистемы (например, рендерер, игра, загрузчики ресурсов), загружает здания (включая сетку, материалы / текстуры), загружает камеру, устанавливает камеру в укажите на здание, включите тени, визуализируйте сцену, а затем каким-то образом решите, действительно ли тени появляются в буфере кадров. Это менее чем практично. В действительности у вас уже есть все эти строительные леса в виде вашей игры, и вы просто запускаете их для проведения визуального теста в дополнение к любым утверждениям в самом коде.
Попробуйте использовать % zu
строка формата
size_t val = get_the_value();
printf("%zu",val);
Часть z - это спецификатор длины, который говорит, что аргумент будет иметь длину size_t.
Источник - http://en.wikipedia.org/wiki/Printf#printf_format_placeholder
Я думаю, что ответ C ++ таков:
std::size_t n = 1;
std::cout << n;
Для ввода-вывода в стиле C это немного сложнее. В C99 они добавили модификатор длины z
для значений size_t
. Однако до TR1 это не поддерживается, поэтому вам остается приведение к определенному размеру, например:
std::size_t n = 1;
std::printf("%lu\n", static_cast<unsigned long>(n));
С другой стороны, unsigned long long
в любом случае не поддерживается C ++, так что приведенное выше будет работать нормально поскольку unsigned long
является наибольшим допустимым целым типом. После TR1 вы можете безопасно использовать % zu
для значений size_t
.
Здесь есть тег C ++, поэтому cout <<
- еще один возможный ответ.
Это на удивление сложно сделать правильно во всех версиях C. В C90 приведение к unsigned long
должен работать, но это может не работать в C99, и решения C99 не обязательно будут работать в C90. Возможность надежно различать C90 и C99 была введена в изменениях 1995 г. (с указанием допустимых значений для __ STDC __
). Я не думаю, что существует полностью переносимый способ, работающий для C90, C99 и C ++, хотя есть решения для любого из них.