Đúng
Bạn phải luôn luôn sử dụng dấu ngoặc đơn ... bạn không kiểm soát thứ tự ưu tiên ... nhà phát triển trình biên dịch nào. Đây là một câu chuyện xảy ra với tôi về việc không sử dụng dấu ngoặc đơn. Điều này ảnh hưởng đến hàng trăm người trong khoảng thời gian hai tuần.
Lý do thực tế
Tôi đã sử dụng một ứng dụng khung chính. Một ngày nọ, khi trời trong xanh, nó ngừng hoạt động. Đó là ... nó chỉ dừng lại.
Công việc của tôi là làm cho nó hoạt động nhanh nhất có thể. Mã nguồn đã không được sửa đổi trong hai năm, nhưng đột nhiên nó chỉ dừng lại. Tôi đã cố gắng biên dịch mã và nó đã bị hỏng trên dòng XX. Tôi nhìn vào dòng XX và tôi không thể biết điều gì sẽ khiến dòng XX bị phá vỡ. Tôi yêu cầu thông số kỹ thuật chi tiết cho ứng dụng này và không có thông tin nào. Dòng XX không phải là thủ phạm.
Tôi đã in mã ra và bắt đầu xem xét nó từ trên xuống. Tôi bắt đầu tạo ra một sơ đồ về những gì đang diễn ra. Mã này rất phức tạp, tôi thậm chí không thể hiểu được nó. Tôi đã từ bỏ cố gắng để lưu đồ nó. Tôi sợ thực hiện các thay đổi mà không biết sự thay đổi đó sẽ ảnh hưởng đến phần còn lại của quá trình như thế nào, đặc biệt là vì tôi không có thông tin chi tiết về những gì ứng dụng đã làm hoặc nơi nó nằm trong chuỗi phụ thuộc.
Vì vậy, tôi quyết định bắt đầu ở đầu mã nguồn và thêm whitespce và phanh dòng để làm cho mã dễ đọc hơn. Tôi nhận thấy, trong một số trường hợp, có những điều kiện kết hợp AND
và OR
không thể phân biệt rõ ràng giữa dữ liệu nào được chỉnh sửa AND
và dữ liệu nào được chỉnh sửa OR
. Vì vậy, tôi bắt đầu đặt dấu ngoặc đơn xung quanh AND
và các OR
điều kiện để làm cho chúng dễ đọc hơn.
Khi tôi từ từ dọn dẹp nó, tôi sẽ định kỳ lưu công việc của mình. Tại một thời điểm tôi đã cố gắng biên dịch mã và một điều kỳ lạ xảy ra. Lỗi đã nhảy qua dòng mã ban đầu và bây giờ đã xuống sâu hơn. Vì vậy, tôi tiếp tục, bỏ qua các điều kiện AND
và OR
điều kiện với parens. Khi tôi đã hoàn thành việc làm sạch nó, nó hoạt động. Đi hình.
Sau đó tôi quyết định ghé thăm cửa hàng hoạt động và hỏi họ xem gần đây họ có cài đặt bất kỳ thành phần mới nào trên khung chính không. Họ nói có, gần đây chúng tôi đã nâng cấp trình biên dịch. Hừm.
Nó chỉ ra rằng trình biên dịch cũ đánh giá biểu thức từ trái sang phải bất kể. Phiên bản mới của trình biên dịch cũng đánh giá các biểu thức từ trái sang phải nhưng mã mơ hồ, nghĩa là sự kết hợp không rõ ràng AND
và OR
không thể giải quyết được.
Bài học tôi học được từ điều này ... LUÔN LUÔN, LUÔN LUÔN, LUÔN LUÔN sử dụng parens cho các AND
điều kiện và điều kiện riêng biệt OR
khi chúng được sử dụng để kết hợp với nhau.
Ví dụ đơn giản hóa
IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...
(mã bị vấy bẩn với một vài trong số này)
Đây là phiên bản đơn giản hóa của những gì tôi gặp phải. Cũng có những điều kiện khác với các câu lệnh logic boolean ghép.
Tôi nhớ đã nhai nó để:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...
Tôi không thể viết lại vì không có thông số kỹ thuật. Các tác giả ban đầu đã qua lâu. Tôi nhớ áp lực dữ dội. Toàn bộ tàu chở hàng bị mắc kẹt tại cảng và không thể tải được vì chương trình nhỏ này không hoạt động. Không có cảnh báo. Không có thay đổi đối với mã nguồn. Tôi chỉ nhận ra rằng tôi yêu cầu các hoạt động mạng nếu họ sửa đổi bất cứ điều gì sau khi tôi nhận thấy rằng việc thêm parens đã làm thay đổi các lỗi.