@WMix потому что это данные, к которым нужен доступ извне, а не только изнутри объекта.
И структурированный доступ к данным это первоначальная и основная задача этого объекта.
Вторая задача согласованно мутировать объект, чтобы он оставался валидным.
И самая минимальная задача - вычисляемые свойства, совсем не много.
В плане использования извне чтение свойств это >99% всех операций. И только совсем немного мутирования.
Данные объединены с поведением - классическое ООП. И пока никто здесь не доказал обратного.
Насчет полной иммутабельности - единственная проблема в данном конкретном случае - размер этих объектов и необходимость работать со связными списками (не сильно большими, но все же)
Это ни плохая архитектура, ни что-то другое. Это осознанный компромисс для таких здоровых датаориентированных объектов.
И изначально разговор был не о больших объектах, не о плюсах и минусах мутабельности и иммутабельности, а о writeonce rfc (которое вообще-то идиотское).
Всего-то хотелось полезную фичу сишарпа (и некоторых других языков), чтобы запрещать модификации извне, но оставлять возможность чтения на уровне конструкций языка, не с помощью костылей. И это была просто хотелка, как защита от дурака. С костылями и сейчас все можно сделать и даже без черной магии типа ffi (паблик свойство которое в конструкторе делается unset и дальше вся работа с ридонли полями через приватный массив данных через __get и запрет на __set)