With
là điều xấu. Tôi không biết bao nhiêu lần tôi cần phải nói điều này, nhưng dường như chúng tôi chưa có.
Chỉ có thể sử dụng "an toàn" với các đối tượng không bao giờ thay đổi. Nếu bạn áp dụng nó cho các đối tượng bạn xác định trong dự án của riêng bạn, tất cả các cược sẽ tắt và tôi muốn thay vì bạn chỉ sử dụng các phần "nếu Random (50) < 25" để thực thi mã của bạn, ít nhất là tài liệu được thực thi một cách kỳ lạ.
Vấn đề là khi bạn bắt đầu lộn xộn với một đối tượng, giới thiệu các phương pháp hoặc thuộc tính mới hoặc đổi tên cũ, tất cả các câu lệnh with
hiện có có thể thay đổi ý nghĩa. Và không phải trong "Cảnh báo: Gọi đến phương thức mơ hồ" thay đổi. Mã sẽ chỉ làm một cái gì đó khác với nó trước đây. Mà không nói với bạn về nó.
Ví dụ, chúng ta hãy giả sử bạn có điều này:
with connection, file do
begin
Close;
end;
sau đó những gì bạn mong đợi xảy ra? Vâng, nó là tự nhiên để đóng một tập tin, vì vậy tôi mong đợi tập tin sẽ được đóng lại. Giả sử rằng biến tệp này chứa một đối tượng kiểu TSomeOddFile không định nghĩa phương thức Close, mà là một phương thức CloseFile. Câu lệnh With ở trên sẽ đóng kết nối thay thế.
Tất cả tốt, được ghi lại, không ai viết đoạn mã này nghĩ rằng tệp sẽ bị đóng, sau khi tất cả, phương thức được đặt tên là CloseFile cho đối tượng đó, đó chỉ là giả định của tôi là sai và tôi không làm việc dự án. Chưa.
Và sau đó ai đó sửa lỗi đó, đổi tên CloseFile thành Đóng. Đoạn mã trên sẽ âm thầm bắt đầu đóng tập tin thay vì kết nối. Không có cảnh báo, không có lỗi, biên dịch cũng tốt như trước khi bạn thay đổi tên phương thức.Chạy tốt như thế^h^h^h, không đợi, nó sẽ không.
Vì vậy, yeah, with
sẽ cắn bạn trong **.
+1 Câu hỏi được tạo thủ công để gợi ra một số câu trả lời thực sự tuyệt vời! – Argalatyr