Ok, vì vậy đây là một chút của một câu hỏi ủng hộ quỷ thực sự.
Khi các biến toàn cầu ổn, và nếu không bao giờ, bạn sẽ sử dụng cái gì thay thế?
Một trường hợp phụ thú vị cho câu hỏi này, trường lớp tĩnh công khai khác với toàn cầu như thế nào?
Ok, vì vậy đây là một chút của một câu hỏi ủng hộ quỷ thực sự.
Khi các biến toàn cầu ổn, và nếu không bao giờ, bạn sẽ sử dụng cái gì thay thế?
Một trường hợp phụ thú vị cho câu hỏi này, trường lớp tĩnh công khai khác với toàn cầu như thế nào?
Câu trả lời:
Theo như tôi biết, một trường tĩnh công khai về cơ bản là toàn cầu do nó có thể được gọi từ bất cứ đâu ngoại trừ việc nó không làm tắc nghẽn không gian tên.
Lần duy nhất cá nhân tôi sử dụng các biến 'toàn cầu' trong mã của mình là ở dạng trường tĩnh công khai không thay đổi. Trong trường hợp này, không cần phải lo lắng về giá trị bị vặn vẹo bởi các phần khác của chương trình và tất nhiên nó đẹp hơn rất nhiều so với việc có hàng tá biến có cùng giá trị vĩnh viễn trong mỗi lớp.
Cá nhân, tôi sử dụng toàn cầu cho cấu hình thời gian chạy - nếu một thuộc tính cấu hình được tải khi khởi động ứng dụng và chỉ thay đổi không thường xuyên (và chỉ sau đó từ một nơi), sẽ rất tệ và dễ bị lỗi khi chuyển nó sang mọi phương thức có thể cần sử dụng nó tại một số điểm Tốt hơn hết là sử dụng thứ gì đó có thể được đưa vào phạm vi từ bất cứ nơi nào cần sử dụng, vì điều đó không làm lộn xộn và che khuất chữ ký phương thức của bạn và gọi các trang web.
CONFIG_
hoặc CFG_
tiền tố.
Không bao gồm thời gian thực / hệ thống nhúng, bạn chỉ nên sử dụng toàn cầu cho các giá trị không đổi, thực sự. Nếu bạn cảm thấy rằng bạn không thể giải quyết vấn đề của mình mà không có họ, có lẽ bạn đang làm sai điều gì đó.
Ngoài ra, nhìn vào mô hình Singleton , nó cung cấp một giải pháp tốt hơn cho toàn cầu trong những tình huống khi bạn cần một cái gì đó để có điểm truy cập toàn cầu.
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
chỉ có liên quan trong một tệp / lớp / phần nơi 'vòng lặp cụ thể này' xuất hiện.
Vấn đề với các biến toàn cục là bạn cần nhận thức được chúng ở mọi nơi trong mã của bạn. Tuy nhiên, một khi bạn đã quyết định rằng bạn cần biết về một toàn cầu cụ thể, sẽ không có nhiều mất mát khi sử dụng nó. Do đó, ý kiến của tôi là bạn nên có rất ít biến toàn cục, nhưng số ít bạn có, bạn sẽ nhận được số dặm tối đa.
Đối với một ví dụ khác về điều gì đó tôi cảm thấy như vậy, hãy xem việc sử dụng mixins trong Ruby.
Đó là tất cả về không gian tên.
Hãy tưởng tượng trong một khoảnh khắc mà tất cả mọi người trên thế giới đều có cùng họ. Thật là một mớ hỗn độn.
(Ở Ấn Độ, người Sikh có cùng họ: Singh - Hãy nhìn)
Phiên bản ngắn: khi nó làm cho nó dễ dàng hơn để lý do về chương trình. Các trường hợp điển hình là một số loại trạng thái toàn cầu hoặc tài nguyên tĩnh được sử dụng rộng rãi.
Phiên bản dài: Tom Hawtin nói "với hành động ma quái ở khoảng cách xa" ... đó chính xác là vấn đề với toàn cầu - bạn phải biết nó đang được sử dụng ở đâu và làm thế nào, hoặc bạn có thể nhận được một số thực sự kỳ lạ và khó theo dõi lỗi. Người dân địa phương không có gì hơn hoặc ít hơn một chiến lược để giảm phạm vi những gì lập trình viên cần hiểu để lý giải về chương trình.
Một khía cạnh khác của vấn đề khi biết chúng được sử dụng ở đâu là bạn có thể kết thúc với các quả cầu trùng lặp - trong trường hợp đó mọi thứ có thể trở nên thực sự kỳ lạ khi hầu hết các chương trình được đặt và đặt var1 trong khi ở một vài nơi var2 được sử dụng để giữ cùng thông tin. Đặc biệt khi nhiều người đang làm việc trên cùng một mã. IDE có thể hữu ích với việc tìm kiếm việc sử dụng giúp giảm chi phí toàn cầu, nhưng chúng không làm gì cho các bản sao.
Càng nhiều cầu thì bạn càng khó theo dõi những gì đang xảy ra với họ. Họ nên được ít và xa giữa.
Hai gotchas với toàn cầu và singletons là khả năng kiểm tra và triển khai.
Để thử nghiệm, tôi đã thấy quá nhiều khai thác thử nghiệm quá phức tạp chỉ để đối phó với tuổi thọ toàn cầu và đơn lẻ được lên kế hoạch kém. Hãy chắc chắn rằng bất kỳ đối tượng như vậy có quy tắc khởi động rõ ràng và đơn giản.
Về khả năng triển khai, có hai trường hợp cần xem xét. Thứ nhất, đối tượng toàn cầu của bạn sẽ sống như thế nào? Đó là trong một thư viện tĩnh hay động? Nếu đối tượng toàn cầu đó được sử dụng lại cho một plugin, bạn sẽ nhận được thêm bản sao chứ? Thứ hai, điều gì xảy ra khi đối tượng toàn cầu đó được đưa vào một ứng dụng song song? Nó có an toàn không?
Nhìn chung, tôi cho rằng những lý do đó có nghĩa là toàn cầu và singletons chỉ được sử dụng một cách đặc biệt.
Trong một cơ sở mã VB6 khủng khiếp lạm dụng toàn cầu như không có ngày mai, tôi có lỗi khi giới thiệu một cái mới:
Global CsExt As New TheAppBeingRewrittenInCSharpWhileVb6CodeIsStillBeingMaintained
Tôi nghĩ đó là một trong số ít các trường hợp sử dụng hợp lệ cho một đối tượng toàn cầu.