Учтите, что метод эквивалентен бесплатной процедуре, принимающей Объект в качестве 1-го параметра с именем Self :
TMyClass.MyRoutine({args}) <=> MyRoutine(Self: TMyClass {; args})
Имея это в виду, вы видите, что вы можете локально изменять содержимое Self, не повреждая свой оригинальный Объект .
Но вы правы, это действительно вонючий и очень подвержен ошибкам.
Я бы не принял такой код без очень убедительного аргумента в комментарии ...