«Та же машина?»

«Та же машина?» звучит как один вопрос. Когда я писал round-trip-тест для своего движка машин Тьюринга, оказалось — их три, и совпадают они только по случайности.

В turing-machine-js машину состояний можно сериализовать в Mermaid-диаграмму и собрать обратно. Захотелось регрессионный тест: прогнать машину через round-trip и проверить, что на выходе «та же». На этом слове всё и завертелось — «та же» распалось на три отдельные границы: • Объект — тот же ли это экземпляр? (=== / instanceof) • Граф — воспроизводится ли сериализованная структура? (toGraph / fromGraph) • Поведение — считают ли обе машины одно и то же? (equivalentOn) На плоской машине все три дают один ответ, поэтому легко думать, что «та же» — это что-то одно. Композиция — место, где они расходятся. Ловушка, в которую легко попасть: после пересборки === над двумя состояниями возвращает false (fromGraph всегда создаёт свежие инстансы), хотя поведение идентично. Ложная регрессия на ровном месте, если не знать про нужную проверку.

Что вынес: добавляя поле в движок, смотрю, в какую ипостась оно попадает — объект, граф или поведение. От этого зависит, в каком смысле оно делает две машины «теми же».

Полный текст: https://mellonis.ru/ru/articles/tri-ipostasi-mashini/ Код: https://github.com/mellonis/turing-machine-js Интерактивное демо: https://demo.machines.mellonis.ru

#разработка #JavaScript #TypeScript