Globals không phải là xấu. Như đã nêu trong một số câu trả lời khác, vấn đề thực sự với họ là, ngày hôm nay, đường dẫn thư mục toàn cầu của bạn có thể, vào ngày mai, là một trong vài, hoặc thậm chí hàng trăm. Nếu bạn đang viết một chương trình nhanh, một lần, hãy sử dụng toàn cầu nếu dễ hơn. Nói chung, mặc dù, cho phép bội số ngay cả khi bạn chỉ nghĩ rằng bạn cần một là cách để đi. Thật không dễ chịu khi phải cấu trúc lại một chương trình phức tạp lớn đột nhiên cần nói chuyện với hai cơ sở dữ liệu.
Nhưng họ không làm tổn thương độ tin cậy. Bất kỳ dữ liệu nào được tham chiếu từ nhiều nơi trong chương trình của bạn đều có thể gây ra sự cố nếu nó thay đổi bất ngờ. Các điều tra viên nghẹt thở khi bộ sưu tập họ liệt kê được thay đổi trong bảng liệt kê. Sự kiện xếp hàng sự kiện có thể chơi các thủ thuật với nhau. Chủ đề luôn có thể tàn phá havok. Bất cứ điều gì không phải là một biến cục bộ hoặc trường không thể thay đổi là một vấn đề. Globals là loại vấn đề này, nhưng bạn sẽ không khắc phục điều đó bằng cách biến chúng thành phi toàn cầu.
Nếu bạn chuẩn bị ghi vào một tập tin và đường dẫn thư mục thay đổi, thay đổi và ghi cần phải được đồng bộ hóa. (Là một trong hàng ngàn điều có thể sai, giả sử bạn lấy đường dẫn, sau đó thư mục đó sẽ bị xóa, sau đó đường dẫn thư mục được thay đổi thành một thư mục tốt, sau đó bạn thử và ghi vào thư mục đã xóa.) đường dẫn thư mục là toàn cục hoặc là một trong một ngàn chương trình hiện đang sử dụng.
Có một vấn đề thực sự với các trường có thể được truy cập bởi các sự kiện khác nhau trên hàng đợi, mức đệ quy khác nhau hoặc các luồng khác nhau. Để làm cho nó đơn giản (và đơn giản): các biến cục bộ là tốt và các trường là xấu. Nhưng các cầu toàn cầu trước đây vẫn sẽ là các lĩnh vực, vì vậy vấn đề này (tuy rất quan trọng) không áp dụng cho trạng thái Tốt hoặc Ác của các trường Toàn cầu.
Ngoài ra: Các vấn đề đa luồng:
(Lưu ý rằng bạn có thể gặp vấn đề tương tự với hàng đợi sự kiện hoặc các cuộc gọi đệ quy, nhưng đa luồng là điều tồi tệ nhất.) Hãy xem xét đoạn mã sau:
if (filePath != null) text = filePath.getName();
Nếu filePath
là một biến cục bộ hoặc một loại hằng số, chương trình của bạn sẽ không bị lỗi khi chạy vì không filePath
có giá trị. Việc kiểm tra luôn hoạt động. Không có chủ đề khác có thể thay đổi giá trị của nó. Nếu không , không có đảm bảo. Khi tôi bắt đầu viết các chương trình đa luồng bằng Java, tôi đã nhận được NullPulumExceptions trên các dòng như thế này mọi lúc. Bất kìchủ đề khác có thể thay đổi giá trị bất cứ lúc nào và họ thường làm. Như một số câu trả lời khác chỉ ra, điều này tạo ra các vấn đề nghiêm trọng để thử nghiệm. Tuyên bố trên có thể hoạt động hàng tỷ lần, thông qua thử nghiệm toàn diện và toàn diện, sau đó nổ tung một lần trong sản xuất. Người dùng sẽ không thể tái tạo vấn đề và nó sẽ không xảy ra lần nữa cho đến khi họ tự thuyết phục rằng họ đã nhìn thấy mọi thứ và quên nó đi.
Globals chắc chắn có vấn đề này, và nếu bạn có thể loại bỏ chúng hoàn toàn hoặc thay thế chúng bằng hằng số hoặc biến cục bộ, đó là một điều rất tốt. Nếu bạn có mã không trạng thái chạy trên máy chủ web, có lẽ bạn có thể. Thông thường, tất cả các vấn đề đa luồng của bạn có thể được cơ sở dữ liệu xử lý.
Nhưng nếu chương trình của bạn phải ghi nhớ mọi thứ từ một hành động của người dùng sang hành động tiếp theo, bạn sẽ có các trường có thể truy cập được bởi bất kỳ luồng nào đang chạy. Chuyển đổi toàn cầu sang một lĩnh vực phi toàn cầu như vậy sẽ không giúp độ tin cậy.