With
это зло. Я не знаю, сколько раз мне нужно это повторять, но, видимо, мы еще не достигли цели.
With можно только «безопасно» использовать с объектами, которые никогда не изменятся. Если вы примените его к объектам, которые вы определяете в своем собственном проекте, все ставки отключены, и я осмелюсь предположить, что вам лучше просто использовать части «if Random (50)‹ 25 »для выполнения вашего кода, по крайней мере, это задокументировано для странного выполнения.
Проблема в том, что как только вы начинаете возиться с объектом, вводить новые методы или свойства или переименовывать старые, все существующие with
-операторы, использующие эти методы, могут изменить смысл. И не в изменении "Предупреждение: вызов неоднозначного метода". Код просто сделает что-то другое, чем это было раньше. Не говоря вам об этом.
Например, предположим, что у вас есть это:
with connection, file do
begin
Close;
end;
тогда чего вы ожидаете? Что ж, это естественно, чтобы закрыть файл, поэтому я ожидаю, что файл будет закрыт. Далее предположим, что эта файловая переменная содержит объект типа TSomeOddFile, который не определяет метод Close, а скорее метод CloseFile. Вышеупомянутый оператор With вместо этого закроет соединение.
Все хорошо, это задокументировано, никто не писал этот фрагмент кода, думая, что файл будет закрыт, в конце концов, метод называется CloseFile для этого объекта, это просто мое предположение, которое неверно, и я не работаю над проектом. Пока что.
А затем кто-то исправляет это, переименовывая CloseFile в Close. Приведенный выше код начнет незаметно закрывать файл вместо соединения. Без предупреждений, без ошибок, компилируется так же хорошо, как и до того, как вы изменили имя метода. Работает так же отлично ^ ч ^ ч ^ ч, нет, погоди, не пойдет.
Так что да, with
укусит тебя в задницу.
person
Lasse V. Karlsen
schedule
15.07.2009