Khi nào thì sử dụng biến toàn cầu


22

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?


5
Mã hoàn thành , phiên bản 2, §13.3.
Jerry Coffin

1
Các ứng dụng đa luồng khá nhiều yêu cầu các biến toàn cục.
aqua


4
@aqua Các ứng dụng đa luồng là nơi các biến toàn cục có thể gây hại nhất. Mọi người đều ghét logic khóa phức tạp.
luiscubal

1
@JerryCoffin Nếu đăng một liên kết dưới dạng câu trả lời mà không trích dẫn đoạn văn có liên quan là thông lệ xấu, thì việc trích dẫn một phần của cuốn sách mà không trích dẫn đoạn văn có liên quan. Đặc biệt là như vậy, vì sách không tự do và dễ dàng có được như các trang web.
Braden hay nhất

Câu trả lời:


18

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.


2
Tôi sẽ gọi một trường bất biến là một hằng số .
aioobe

14

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.


Bạn sẽ sử dụng toàn cầu thuần túy cho điều này hay công khai / Singleton?
ocodo

1
@Slomojo: Chắc chắn không phải là người độc thân. Tùy thuộc vào tình huống, số liệu thống kê trên một lớp cấu hình hoặc toàn cầu đơn giản với một CONFIG_hoặc CFG_tiền tố.
Anon.

+1 một thay đổi tôi muốn đề xuất là nói "... dễ bị lỗi khi truyền nó cho mọi phương thức khác trong mọi lớp khác". Mặt khác, nó có thể nằm trong lớp với bất cứ thứ gì phục vụ điều đó - tôi nghĩ là đơn lẻ.
Michael Durrant

8

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.


8
Có lẽ tôi khuyên bạn nên tránh Singletons.
ocodo

Tôi không cho rằng singletons là tuyệt vời, nhưng tôi vẫn nghĩ rằng họ đã đánh bại các biến số toàn cầu rất nhiều.
Thưởng thức Ždralo

Các giá trị không đổi chỉ cần có thể truy cập được trong khu vực / mô-đun mà chúng có liên quan. Một hằng số TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOPchỉ 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.
Cthulhu

1
Các trường của một singleton các biến toàn cục, vì vậy tôi không thấy có sự khác biệt nào.
sleske

1
@Cthulhu hãy để tôi tự trích dẫn: "trong những tình huống khi bạn cần thứ gì đó để có điểm truy cập toàn cầu".
Thưởng thức Ždralo

6

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.


Ví dụ trường hợp sử dụng nào bạn muốn đề xuất cho những sử dụng toàn cầu này?
ocodo

1
@Slomojo: Một ví dụ về toàn cầu tôi không bận tâm là việc sử dụng @ARGV và $ _ trong Perl. Một ví dụ tôi nhớ là việc sử dụng toàn cầu cho tham số giá rẻ chuyển đến chương trình con.
btilly

5

Đó 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)


6
từng là tất cả về không gian tên, nhưng bây giờ là về an toàn luồng.
dan04

6
@ dan04 Đó là về việc không có một thiết kế gớm ghiếc với hành động ma quái ở khoảng cách xa.
Tom Hawtin - tackline

2
@Tom: Có lẽ chúng ta có thể gọi điều đó, nói trực tiếp, "Lập trình lượng tử"
Christopher Mahan

4

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.


Cuối cùng có toàn cầu đột biến là một ý tưởng khá tồi. Ngoại lệ duy nhất là khi làm việc trong các dấu chân phần cứng cực kỳ chặt chẽ, chẳng hạn như với lập trình nhúng. Ít nhất, các ứng cử viên cho toàn cầu trong lập trình thông thường nên được đưa vào các thành viên tĩnh của các lớp hoặc mô-đun, bất cứ điều gì có thể thay đổi cũng nên được coi là một trường hợp đặc biệt, vì vậy, khi làm việc trong môi trường đa luồng. Sử dụng khóa / tương lai / lời hứa hoặc một số phương pháp khác về an toàn chủ đề / giao dịch. - Vì không ai nhắc đến nên nó thấy vấn đề triết gia ăn uống.
ocodo

1
Không có nghi ngờ chủ đề có thể làm cho toàn cầu có thể thay đổi khó làm việc hơn, nhưng bạn có thể gặp vấn đề cơ bản tương tự do các sự kiện. Tôi đồng ý với đề xuất đưa hem vào làm thành viên tĩnh, và sẽ đi xa hơn và nói rằng lý tưởng nhất là họ nên RIÊNG thành viên tĩnh.
jmoreno

3

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.


2

Phát triển các hệ thống nhúng quan trọng thường liên quan đến việc sử dụng các biến toàn cục.

Kích thước ngăn xếp rất nhỏ, mọi thứ đều được phân bổ tĩnh ( malloc()bị cấm), các biến toàn cục được ẩn từ bên ngoài thư viện mà chúng thuộc về.


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.