Войти
ПрограммированиеФорумОбщее

выбор ECS, нужно ли тестирование - вопросы по архитектуре

#0
(Правка: 22:37) 22:13, 14 окт. 2018

Заспорили как то два программиста (клиента игры на Unity3d).
первая причина спора : выбор ECS
вторая : необходимость написания тестов

- первый выступает за простой минималистичный фреймворк ECS лично портированный с java (отлично вписывается в юнит/интеграционные тесты)
- второй за навороченный с финтифюшками и кодогенерацией (но никто не знает как его завести под тесты)

первый грит - "Я быстренько сделаю дворника, дам ему метлу и он сразу будет мести - а я буду поглядывать в окно и смотреть что всё Ок, а если дворнику понадобиться что то еще кроме того что у него уже есть - я быстренько заменю ему метлу на лопату и опять буду присматривать за ним что бы исправно мёл"

второй отвечает - "Я сначала всё опишу и продумаю : какой у дворника будет общий функционал, какая погода может быть, какие времена года, учту сезонную миграцию бомжей (что бы знать когда больше гадят во дворе) и потом запилю крутого боса-дворника с метлами разных калибров, совочками и пакетами для мусора, что бы если вдруг что - расширить/заменить ему все причиндалы на зимний вариант или под третью мировую. И присматривать за ним я не буду - он супер дворник и я в нем стопудово уверен"

а что думаете вы? какие подходы и решения используете? должен ли программист обязательно следить за консистентностью кода при помощи юнит/интеграционных тестов или достаточно убежденности что выбранные подходы и архитектурные решения типа ECS и продуманности на этапе проектирования способны заменить тестирование?

p/s : если тема тянет больше на флейм - то просьба туда её и перенести :)


#1
(Правка: 22:56) 22:55, 14 окт. 2018

patsanchik3
> два программиста (клиента игры на Unity3d).
оригинал кто-нить попробовал или велосипедить интереснее? : )
https://github.com/Unity-Technologies/EntityComponentSystemSamples

> архитектурные решения типа ECS и продуманности на этапе проектирования способны
> заменить тестирование?
"продуманность" это чушь собачья, всё надо тестировать

у ECS фреймворков есть неприятная особенность, без дополнительного инструментария практически невозможно понять что там происходит внутри, даже банально почему не вызвалась система и что этот EntityId означает на самом деле

#2
8:35, 15 окт. 2018

Истина как всегда посередине. Думать наперед конечно надо, что бы на полпути не выяснилось что дворник из первой версии архитектурно не совместим с нужной версией метлы. Сразу переусложнять тоже не стоит, что бы не оказалось, что на полпути планы изменились и убер-босс-дворник больше не соответствует потребностям и опять надо все переписать. Впрочем в любительской разработке, где нет сроков-дедлайнов пойти можно любым путем т.к. опыт там зачастую получается ценее результата, а опыт пятикратного переписывания системы изза выбора неверного инструмента в самом начале или оптимистичного планирования/проектирования он бесценный

#3
(Правка: 10:29) 10:26, 15 окт. 2018

Нужно заранее подумать и составить план, чтобы собрать тупого как пробка дворника, дать ему простую как палку метлу, и в результате получить божество уборки, способное отмыть даже твой системный блок, твоё сердце и твои деньги.

#4
(Правка: 11:22) 11:22, 15 окт. 2018

Sh.Tac.
> оригинал кто-нить попробовал или велосипедить интереснее? : )
> https://github.com/Unity-Technologies/EntityComponentSystemSamples
там пока все не так радужно - ходят упорные слухи что в ближайший год реализация ECS от юнити будет многократно сменятся, поэтому несмотря на несомненные плюсы - "оригинал" пока точно не наш выбор :)

#5
0:18, 26 дек. 2018

patsanchik3, как говорится, shameless plug: https://github.com/Leopotam/ecs, есть интеграция в редактор юнити (https://github.com/Leopotam/ecs-unityintegration) и прочие вещи типа мультитреда (аналога jobs, но на чистых потоках), поддержки гуя и т.п. Кодоген отсутствует как класс, все на генериках, заточено под максимальную производительность и минимальное потребление памяти (zero memory allocation когда пулы компонентов накачаются). Достаточно просто ложится на юнит-тесты, если потребуется.

#6
(Правка: 1:09) 0:59, 26 дек. 2018

Phoenics уже выдвинул такую мысль возможно это будет тоже самое но с другой стороны. Это как сравнение двух программистов один из них поехавший на ООП, а другой либо процедурно, либо только начинает изучать. Ведь для того чтобы второму все описать, ему как минимум придется прокрутить в голове все то что сделал первый. И даже на готовую систему как то распределить, что и как будет определено.

То есть нужна организационная работа, ведь оба программиста со своими ни кому не понятными граблями. Так или иначе тестирование (как в рамках изучения так и разработки) будет либо явным либо не явным.

#7
11:15, 26 дек. 2018

Leopotam
> типа мультитреда
- для webgl сборок работает ?

Leopotam
> Кодоген отсутствует как класс, все на генериках
- это большой плюс в карму (у авторов Entitas это способ заработать :)

Leopotam
> Достаточно просто ложится на юнит-тесты, если потребуется.
- очень нужны примеры на тесты и связку с Zenject

+ Показать

#8
11:47, 26 дек. 2018

есть интересная задумка на Zenject + UniRx = ECS
https://github.com/EcsRx/ecsrx.unity

но версия еще не добралась до 1.0 и есть баги, примеры тест кейсов также отсутствуют (хотя есть пример реализации рогалика - но опять же без тестов)

#9
(Правка: 12:14) 12:09, 26 дек. 2018
- для webgl сборок работает ?

WebGL пока без мультитреда, юнитехи собираются подпилить мультитред на воркерах в 2019.х.
- это большой плюс в карму (у авторов Entitas это способ заработать :)

Это была одна из причин начать разработку своего поделия - отказ от кодогена и жирноты энтитаса.
- очень нужны примеры на тесты и связку с Zenject

Там есть штатный инжект типов, без использования сторонних модулей - можно инжектить любые инстансы в системы. Есть пример в README. Как вариант - можно отключить его через препроцессор (размер кода уменьшится) и подцепить любой свой.
Как пример, вот https://gist.github.com/Leopotam/f3c963d3dbfb495c7f134787c9775020 Тут нет юнит-теста, но структура та же (tear up, run, teardown).
#10
(Правка: 12:41) 12:37, 26 дек. 2018

Leopotam
> Тут нет юнит-теста, но структура та же
было бы здорово увидеть рабочие тест кейсы для примеров (в той же змейке или пакмане, а лучше в обоих), понятно что проект не коммерческий и автор молодец, но есть и svetlo и entitas и прочие, и такой подход имхо помог бы выделить реализацию Leopotam от прочих (так как остальные особо с этим не заморачиваются, а зря, хорошие тест кейсы позволяют быстрее вникнуть и начать использовать).

>WebGL пока без мультитреда
это да - но есть ли возможность отключить мультитред в ECS - что бы webgl собирался и работал (пусть и не в мультитреде) ? (в svetlo TPL вроде опционально идет)

#11
(Правка: 13:07) 12:59, 26 дек. 2018
есть ли возможность отключить мультитред в ECS

Его наоборот нужно подключать - вынесено в отдельный реп: https://github.com/Leopotam/ecs-threads, точно так же отрезана реактивность: https://github.com/Leopotam/ecs-reactive

В самом ядре есть только встроенный механизм инжекта и событий на создание / удаление как entity, так и компонентов (все так же опционально включается / выключается препроцессором). Кстати, в последнем релизе появилась поддержка подключения юнити-модулями прямо из проекта (нужна unity2018.3 и выше): https://leopotam.com/25/

есть и svetlo и entitas и прочие, и такой подход имхо помог бы выделить реализацию Leopotam от прочих

Сожалею, но не сторонник TDD - у меня не хватает толку и времени напилить даже документацию, но это не мешает людям пользоваться и пилить свои проекты (даже не на юнити). Я просто предложил еще один вариант "из многих", возможно он покажется более простым в освоении и интеграции.
#12
(Правка: 16:53) 16:52, 26 дек. 2018

Leopotam
своя иньекция, своя реактивка - зачем ? когда есть Zenject и UniRx, неужели не хватает что бы зоново своё пилить :)

#13
17:35, 26 дек. 2018

patsanchik3, все просто - у меня ядро занимает 20кб (включая DI), реактивка - еще 4-8кб (ибо просто по сути хелпер над ядром), треды - еще пара кб. Я очень сильно не люблю жирных монстров, поэтому мне не по пути с энтитасом и всеми прочими enterprise-like решениями.

ПрограммированиеФорумОбщее