Комментарии 3
Ответ прост - не используйте структуры данных с произвольными графами ссылок. Если ваша программа как-то использует, что изменение foo.x еще и изменяет foo.bar.y, то это отвратительная, негодная программа. Бить по рукам линейкой надо того программиста, кто это написал.
Даже если ваш язык программирования позволяет делать такие извращения, это еще не значит, что это надо делать.
Мне понравился неожиданный вывод в конце: если часто прибегать к компромиссам, то сам этот компромисс начинает восприниматься как определение решаемой задачи. На мой взгляд, здесь есть некоторый дисбаланс. «Слабый» контракт победил не просто потому, что забыли об изначальном выборе, а потому, что реализация «сильного» контракта обходится дорого. Сохранение идентичности объектов и циклических ссылок требует передачи всего графа (вместе с таблицей ссылок); к тому же, если задействованы разные языки программирования, само понятие «одного и того же объекта» во многих из них может попросту отсутствовать. Та же история и с каноничностью: как только вы требуете наличия ровно одного представления для каждого значения, у кодировщика сразу же оказываются связаны руки в вопросах порядка полей и кодирования чисел.

Когда decode(encode(x)) == x недостаточно