Có rất nhiều lý do tại sao toàn cầu là xấu xa trong OOP.
Nếu số lượng hoặc kích thước của các đối tượng cần chia sẻ quá lớn để có thể được truyền một cách hiệu quả trong các tham số chức năng, thông thường mọi người đều khuyên dùng Dependency Injection thay vì đối tượng toàn cầu.
Tuy nhiên, trong trường hợp hầu hết mọi người cần biết về một cấu trúc dữ liệu nhất định, tại sao Dependency Injection lại tốt hơn một đối tượng toàn cầu?
Ví dụ (một cách đơn giản hóa, để hiển thị điểm chung, mà không đào sâu quá trong một ứng dụng cụ thể)
Có một số phương tiện ảo có số lượng tài sản và trạng thái khổng lồ, từ loại, tên, màu sắc, đến tốc độ, vị trí, v.v. Một số người dùng có thể điều khiển từ xa và một số lượng lớn sự kiện (cả người dùng- bắt đầu và tự động) có thể thay đổi rất nhiều trạng thái hoặc thuộc tính của họ.
Giải pháp ngây thơ sẽ là tạo ra một thùng chứa toàn cầu của họ, như
vector<Vehicle> vehicles;
có thể được truy cập từ bất cứ đâu.
Giải pháp thân thiện với OOP hơn sẽ là để container là thành viên của lớp xử lý vòng lặp sự kiện chính và được khởi tạo trong hàm tạo của nó. Mỗi lớp cần nó, và là thành viên của luồng chính, sẽ được cấp quyền truy cập vào vùng chứa thông qua một con trỏ trong hàm tạo của chúng. Ví dụ: nếu một tin nhắn bên ngoài đến thông qua kết nối mạng, một lớp (một cho mỗi kết nối) xử lý phân tích cú pháp sẽ đảm nhiệm và trình phân tích cú pháp sẽ có quyền truy cập vào vùng chứa thông qua một con trỏ hoặc tham chiếu. Bây giờ nếu thông báo được phân tích cú pháp dẫn đến thay đổi thành phần của bộ chứa hoặc yêu cầu một số dữ liệu trong đó để thực hiện hành động, nó có thể được xử lý mà không cần phải ném hàng ngàn biến qua tín hiệu và khe cắm (hoặc tệ hơn, lưu trữ chúng trong trình phân tích cú pháp để sau đó được lấy bởi người đã gọi trình phân tích cú pháp). Tất nhiên, tất cả các lớp nhận được quyền truy cập vào vùng chứa thông qua phép nội xạ phụ thuộc, là một phần của cùng một luồng. Các luồng khác nhau sẽ không truy cập trực tiếp vào nó, nhưng thực hiện công việc của chúng và sau đó gửi tín hiệu đến luồng chính và các khe trong luồng chính sẽ cập nhật vùng chứa.
Tuy nhiên, nếu phần lớn các lớp sẽ có quyền truy cập vào container, điều gì làm cho nó thực sự khác biệt với toàn cầu? Nếu rất nhiều lớp cần dữ liệu trong vùng chứa, thì đó không phải là "cách tiêm phụ thuộc" chỉ là một toàn cầu trá hình?
Một câu trả lời sẽ là an toàn luồng: mặc dù tôi chú ý không lạm dụng container toàn cầu, có thể một nhà phát triển khác trong tương lai, dưới áp lực của thời hạn gần, tuy nhiên sẽ sử dụng container toàn cầu trong một luồng khác, mà không cần quan tâm đến tất cả các trường hợp va chạm. Tuy nhiên, ngay cả trong trường hợp tiêm phụ thuộc, người ta có thể đưa ra một con trỏ cho ai đó đang chạy trong một luồng khác, dẫn đến các vấn đề tương tự.