Làm thế nào để tránh các biến toàn cầu c ++

Các biến toàn cục có thể truy cập được từ mọi nơi khiến chúng thuận tiện và hữu ích nhưng cũng nguy hiểm vì chúng có thể bị lạm dụng

Người ta có thể lập luận rằng chúng cho phép bạn chuyển hoặc truy cập dữ liệu qua các phạm vi hoặc lớp một cách dễ dàng, có thể hữu ích trong các ứng dụng nhúng với…

Cấu trúc lớp học của bạn hơi khó hiểu. Đối với tôi, có vẻ như (các) giá trị int thực sự có thể thuộc về A và sau đó các phiên bản B và C đề cập đến một phiên bản của A (trong hàm tạo). [(Các) giá trị trong A sau đó phải ở chế độ riêng tư với trình truy cập 'get'. ]

Nếu đây không phải là trường hợp và bạn thực sự cần cấu trúc như được mô tả, thì hàm tạo C có lẽ nên chấp nhận một tham chiếu đến một thể hiện B và B nên có một bộ truy cập 'set' cho giá trị bên trong của nó. Cả giá trị bên trong của B và C phải có quyền truy cập riêng tư (hoặc có thể/được cho là được bảo vệ) và có bộ truy cập đặt/nhận. Bạn không nên cho phép truy cập công khai vào những thứ này và truy cập chúng trực tiếp từ A

Quyết định nơi một biến thuộc về không nên dựa trên "sự dễ dàng truy cập" mà dựa trên sự liên kết thực tế. Bạn đã không chỉ rõ những biến cục bộ này dùng để làm gì và chúng mô tả thuộc tính nào, nhưng cốt lõi của việc tránh các biến toàn cục là nhận ra rằng hầu hết mọi biến đều mô tả một số loại thuộc tính hoặc trạng thái của một số loại đối tượng, và do đó nên là . (và bạn nên tạo một lớp cho đối tượng đó nếu bạn chưa tạo)

Khả năng tiếp cận thực sự chỉ là một suy nghĩ sau. Ví dụ: nếu bạn có một biến mô tả thuộc tính của B và bạn cần truy cập thông tin này cho các hoạt động cụ thể trong A và C, thì hãy chuyển thuộc tính đó làm tham số hàm hoặc cung cấp phương thức để đọc giá trị của biến này

Chắc chắn có những ngoại lệ đối với 'quy tắc' đã đề cập ở trên. Nhưng nó thực sự hữu ích nếu bạn xem xét chính xác những gì một biến nhất định mô tả. OTOH, nếu mục đích của biến cục bộ đó không thể được mô tả dễ dàng, thì điều này có thể là do sử dụng lại biến; . Có một bài viết gần đây về lý do tại sao bạn không nên tái chế các biến cục bộ[^] và nó cũng áp dụng cho các biến toàn cục. Có lẽ còn hơn thế nữa

Tôi khuyên bạn nên tạo một lớp riêng để giữ các biến
Quyền truy cập vào các biến có thể được cung cấp bằng các phương thức thay vì trực tiếp

Bạn cũng có thể làm cho các biến và phương thức tĩnh để tránh phải tạo một đối tượng của lớp

Một cách khác là giữ biến cục bộ trong A và chuyển tham chiếu đến B và C trong hàm tạo của chúng. Sau đó, B và C lưu trữ tham chiếu và sử dụng cùng một biến. Điều này gần với một biến toàn cục hơn nhưng nó chỉ được biết giữa 3 lớp. Nó sẽ trông như thế.

class A
{
    B * b;
    C * c;
    int local
};

class B
{
    B(int & loc) : local(loc)
    {
    }
    int & local;
};

Và nó sẽ được khởi tạo theo cách đó trong A

b = new B(local);

Nếu bạn chỉ cần một phiên bản cục bộ, bạn có thể cân nhắc đặt nó ở trạng thái tĩnh. Trong trường hợp đó, bạn sẽ không cần chuyển nó vào hàm tạo

Thêm giải pháp của bạn ở đây

 B   I   U   S  small BIG code

class C;

class B
{
    C *c;
    int local1;
};

class C
{
    B *b;
    int local2;
};
0  <   >   &  link [^] encode untab case indent outdent

Xem trước 0

thành viên hiện có

hoặc tham gia với chúng tôi

Tải xuống, Bình chọn, Nhận xét, Xuất bản

Email của bạn

Email này đang được sử dụng. Bạn có cần mật khẩu của bạn?

Mật khẩu tùy chọn

Khi trả lời một câu hỏi xin vui lòng

  1. Đọc kỹ câu hỏi
  2. Hiểu rằng tiếng Anh không phải là ngôn ngữ đầu tiên của mọi người, vì vậy hãy khoan dung với lỗi chính tả và ngữ pháp
  3. Nếu một câu hỏi được diễn đạt kém thì hãy yêu cầu làm rõ, bỏ qua nó hoặc chỉnh sửa câu hỏi và khắc phục sự cố. Xúc phạm không được chào đón
  4. Đừng bảo ai đó đọc hướng dẫn. Rất có thể họ có và không nhận được. Đưa ra câu trả lời hoặc chuyển sang câu hỏi tiếp theo
Hãy làm việc để giúp các nhà phát triển, không làm họ cảm thấy ngu ngốc


Nội dung này, cùng với bất kỳ tệp và mã nguồn liên quan nào, được cấp phép theo Giấy phép Mở Dự án Code (CPOL)

Chúng tôi cố gắng tránh ban hành các quy tắc và nghị định khi đưa ra lời khuyên về lập trình. Mọi quyết định đều có sự đánh đổi, và đôi khi sự đánh đổi mà người ta cần đưa ra lời khuyên chung hoàn toàn vô hiệu. Tuy nhiên, chúng tôi không thể bỏ qua kinh nghiệm tập thể của toàn bộ ngành công nghiệp của chúng tôi trong nhiều thập kỷ. Điều gì làm cho chúng ta khôn ngoan hơn những người đến trước chúng ta?

Một ngọn đồi mà chúng ta sẽ tự hào đứng và chết trên đó là các biến toàn cầu nên tránh trừ khi thực sự cần thiết. Và việc sử dụng chúng hiếm khi thực sự cần thiết. Thay vào đó, chúng tôi thường thấy rằng các nhà phát triển đưa các biến toàn cục và trạng thái toàn cầu vào chương trình của chúng tôi vì lý do thuận tiện, áp lực thời gian hoặc không biết về các khả năng khác

Trong mục này, chúng ta sẽ thảo luận về các vấn đề với biến toàn cục, các phương pháp thay thế để chia sẻ dữ liệu, kỹ thuật tái cấu trúc và hướng dẫn khi nào phải sử dụng biến toàn cục

Mục lục

Các vấn đề với các biến toàn cầu

Các biến toàn cục có một số vấn đề

Vi phạm che giấu thông tin

Việc sử dụng các biến toàn cục cho thấy tính mô đun kém. Nó cũng vi phạm nguyên tắc Ẩn thông tin. Việc triển khai dữ liệu chung có sẵn cho phần còn lại của chương trình – không có cách nào dễ dàng để thay đổi cách dữ liệu được lưu trữ hoặc mã hóa mà không thay đổi từng tham chiếu đến biến đó trong suốt chương trình. Nếu thiết kế lại xảy ra trong tương lai, các thay đổi sẽ diễn ra trong suốt chương trình

Phủ nhận nguyên tắc Open-Closed

Việc sử dụng các biến toàn cục phủ nhận khả năng áp dụng Nguyên tắc Đóng Mở (OCP). Bất kỳ thành phần nào phụ thuộc vào một biến toàn cục đều không thể thực sự bị đóng đối với các sửa đổi – một thay đổi trong một thành phần khiến biến được sử dụng theo cách không mong muốn sẽ phá vỡ các thành phần khác sử dụng biến đó

Giới thiệu Khớp nối ngầm và Tác dụng phụ

Các chức năng và mô-đun chia sẻ dữ liệu toàn cầu được liên kết chặt chẽ với nhau. Tuy nhiên, loại khớp nối này rất dễ bị bỏ sót, vì nó không được phản ánh trong thiết kế phần mềm và nó không hiển thị trừ khi phân tích mã nguồn và tìm kiếm tên. Về cơ bản, bạn đang giới thiệu các phụ thuộc ẩn giữa các chức năng và mô-đun

Thông thường, các chức năng và mô-đun được kết hợp với dữ liệu chung không có lý do khái niệm nào – dữ liệu có thể dễ dàng được chia sẻ thông qua một cơ chế khác, chẳng hạn như tham số chức năng hoặc gọi lại

Khó theo dõi

Vì hệ thống của anh ta không phản ánh sự đóng gói tốt, nên có thể khó tìm ra chính xác điều gì đang xảy ra trong hệ thống. Ngoài ra, không có kiểm soát truy cập đối với các biến toàn cục, nghĩa là chúng có thể được sửa đổi ở bất cứ đâu – không rõ ai chịu trách nhiệm thay đổi biến

Kết quả cuối cùng của những yếu tố này là hậu quả của thay đổi không thể được xác định tại địa điểm thay đổi – thay vào đó, tất cả các cách sử dụng biến phải được phân tích để xác định tác động của thay đổi. Các tác dụng phụ cũng có thể phát sinh từ hai phần khác nhau của chương trình sửa đổi biến theo một trình tự không lường trước được, bởi vì bản chất phân tán của biến gây khó khăn cho việc suy luận chính xác về việc sử dụng nó. Bạn chắc chắn có thể thực hiện phân tích xem mỗi biến toàn cục được viết và đọc ở đâu, nhưng điều này thường tốn thời gian và dễ xảy ra lỗi. Ngoài ra, bí danh (được thảo luận bên dưới) có thể khiến các tìm kiếm đơn giản không chính xác. Mọi thay đổi đối với biến toàn cục sẽ làm mất hiệu lực phân tích này và yêu cầu thực hiện lại

Hiệu quả thực tế là các nhà phát triển thực hiện một thay đổi cục bộ trong một khu vực, điều này dẫn đến một lỗi trong một phần khác của mã. Sự phức tạp của hệ thống làm tăng khả năng xảy ra lỗi và khó khăn trong việc theo dõi chúng – biến có thể được đọc và ghi trên toàn hệ thống. Cuối cùng, các nhà phát triển ngừng thực hiện các thay đổi đối với phần mềm vì sợ làm hỏng phần mềm, làm tăng đáng kể hiệu ứng lão hóa.

đổ bóng

Có thể rơi vào trường hợp bạn bị “biến toàn cục che khuất”, điều này xảy ra khi bạn khai báo một biến cục bộ trùng tên với biến toàn cục. Điều này có thể gây ra hành vi không mong muốn, vì bạn có thể nghĩ rằng mình đang sửa đổi biến toàn cục trong khi thay vào đó, bạn đang làm việc với biến cục bộ. Rất may, trình biên dịch hiện đại có thể tạo cảnh báo cho điều này, nhưng chúng tôi đã làm việc trên các dự án mà cảnh báo này không được bật và bóng mờ xảy ra mà không ai nhận ra, dẫn đến hành vi sai

Răng cưa

Không có cách nào để ngăn ai đó tạo bí danh cho biến toàn cục, chẳng hạn như chuyển một con trỏ tới biến toàn cục làm đầu vào hàm. Nếu các biến toàn cục được coi là có hại, thì các con trỏ tới các biến toàn cục hoàn toàn là xấu xa. Điều này gây khó khăn cho việc theo dõi điều gì đang thực sự xảy ra với một biến – bạn có thể tìm kiếm tất cả các trường hợp mà biến toàn cục được ghi vào, hoàn toàn bỏ qua thực tế là có các hàm sửa đổi biến đó thông qua một con trỏ. Điều này khiến cho việc theo dõi các sửa đổi đối với một biến toàn cầu trong chương trình của chúng ta càng khó khăn hơn

Điều kiện cuộc đua

Trong các hệ thống đa luồng, các biến toàn cầu đưa ra các điều kiện chủng tộc. Các phương pháp đồng bộ hóa (chẳng hạn như khóa và các phần quan trọng) trở thành một yêu cầu, nhưng chúng thường bị bỏ qua. Khi quyền truy cập biến toàn cục được phân phối trên toàn hệ thống (chứ không phải được chứa trong một mô-đun duy nhất), có thể dễ dàng bảo vệ biến không đúng cách hoặc bỏ lỡ vị trí nơi biến được cập nhật – không có cách nào đảm bảo rằng đồng bộ hóa sẽ được sử dụng ở mọi

Sự hiện diện đơn thuần của các biến toàn cục đủ có thể hạn chế một cách hiệu quả chương trình ở dạng đơn luồng do công việc cần thiết để bảo vệ đúng cách đọc/ghi từ mỗi biến

Vấn đề đặt hàng khởi tạo toàn cầu

Trong C++, thứ tự khởi tạo của biến toàn cục và biến tĩnh tệp là nguồn gây ra sự cố phổ biến trong hệ thống. Tiêu chuẩn nêu rõ rằng các biến toàn cục trong một tệp nguồn duy nhất được tạo và khởi tạo theo thứ tự chúng xuất hiện trong tệp. Tuy nhiên, không có gì đảm bảo cho việc đặt hàng toàn cầu trên các tệp nguồn. Khi toàn cầu trong một tệp tham chiếu toàn cầu trong một tệp khác, thứ tự khởi tạo có thể không như mong đợi, dẫn đến sự cố. Các sự cố này có thể thay đổi tùy thuộc vào cách các tệp đối tượng được liên kết trong bản dựng, dẫn đến các sự cố giả xuất hiện và biến mất theo thời gian

Nhận xét Không giúp đỡ

Một số lập luận rằng những nhược điểm của các biến toàn cục có thể được giảm bớt thông qua nhận xét hợp lý giải thích mục đích và hoạt động của một biến. Tuy nhiên, các loại nhận xét này không giải quyết được sự cố với toàn cầu. Do bản chất của chúng, bạn thậm chí có thể nhận ra rằng những lời giải thích về ý nghĩa của một biến cũng như cách nó được sử dụng và truy cập là hoàn toàn sai. Điều này thường có thể phát sinh do sự phức tạp được đưa ra bằng cách đọc/ghi biến ở nhiều vị trí – ví dụ: các điều kiện cạnh tranh tế nhị có thể tồn tại trong quá trình thực thi do bản chất của mã được tạo, nhưng có thể không được bất kỳ nhà phát triển nào đọc mã chú ý. Nhận xét cũng không giải quyết được vấn đề vì luôn có khả năng thông tin bị lỗi thời do tính chất phân tán của biến

khó khăn kiểm tra

Dữ liệu toàn cầu khiến việc kiểm tra trở nên khó khăn. Trong nhiều trường hợp, điều đó có nghĩa là các thành phần riêng lẻ của hệ thống không thể được kiểm tra độc lập. Do khớp nối được giới thiệu bởi các biến toàn cục, toàn bộ hệ thống con hoặc hệ thống phải được kiểm tra

Các biến toàn cục cũng gây khó khăn cho việc khôi phục trạng thái của hệ thống đang kiểm thử giữa các trường hợp kiểm thử. Đôi khi, cách duy nhất để thiết lập lại trạng thái rõ ràng là thiết lập lại toàn bộ hệ thống, kéo dài quá trình kiểm tra và làm cho nó dễ hỏng hơn

Các lựa chọn thay thế cho các biến toàn cục

Những người đã quen với việc chia sẻ dữ liệu thông qua các biến toàn cục có thể không biết những công cụ nào khác mà họ có thể tùy ý sử dụng. Bất cứ khi nào bạn muốn tiếp cận dữ liệu toàn cầu, thay vào đó hãy xem xét một trong các tùy chọn sau

Giảm phạm vi

Cách hành động đơn giản nhất là giảm phạm vi của biến toàn cục càng nhiều càng tốt. Theo mặc định, bạn nên sử dụng phạm vi thực tế nhỏ nhất cho các biến và hàm

  • Thích làm việc với dữ liệu cục bộ hoặc dữ liệu được truyền theo tham số bất cứ khi nào có thể
  • Làm việc với các biến tĩnh cục bộ của hàm (không thể truy cập chúng bên ngoài hàm)
  • Thích làm việc với các biến tĩnh của tệp (không thể truy cập chúng bên ngoài tệp nguồn)

Phân tích theo hướng ngược lại, bạn có thể

  • Thay đổi biến toàn cục thành tệp biến tĩnh
  • Thay đổi biến tĩnh tệp thành biến tĩnh cục bộ

Mã có thể được cấu trúc lại để truyền dữ liệu thông qua các tham số chức năng thay vì chia sẻ dữ liệu thông qua các biến toàn cục. Nếu bạn cần sự kiên trì trong một hàm, bạn có thể sử dụng biến tĩnh cục bộ

““

Ghi chú

Phạm vi biến toàn cầu thường có thể được giảm bớt bằng cách xem xét lại cách bạn tổ chức mã nguồn của mình. Xem phần để biết thêm thông tin

Truy cập dữ liệu thông qua giao diện

Lý tưởng nhất là dữ liệu toàn cầu không nên được ghi hoặc đọc trực tiếp từ. Thay vào đó, bạn có thể di chuyển dữ liệu vào một mô-đun và chỉ cung cấp dữ liệu đó thông qua API. Ngoài việc giảm phạm vi, điều này đảm bảo rằng người dùng dữ liệu chỉ có thể thực hiện các hoạt động dự định trên biến. Điều này giúp loại bỏ khả năng đặt một giá trị tùy ý sai có tác động tiêu cực đến chương trình. Một lợi ích khác đối với kiểm soát cục bộ là việc đảm bảo rằng biến được bảo vệ đúng cách trong các tình huống đa luồng trở nên dễ dàng hơn nhiều

““

Ghi chú

Xem phần để biết thêm thông tin

Thông qua

Thông thường, phần mềm hệ thống nhúng sử dụng các biến toàn cục để chia sẻ thông tin giữa các ngữ cảnh, chẳng hạn như đọc dữ liệu trong ISR và cung cấp dữ liệu đó trong vòng lặp chính hoặc truyền dữ liệu giữa nhiều luồng. Thay vì sử dụng các biến toàn cục, có thể sử dụng một hàng đợi (e. g. , để truyền tin nhắn, sự kiện hoặc giá trị dữ liệu mới). Những hàng đợi như vậy thường được cung cấp nhiều RTOS, nhưng chúng cũng có thể được tạo từ bộ đệm vòng. Phạm vi của hàng đợi có thể được giảm xuống để nó chỉ khả dụng cho (những) người sản xuất và người tiêu dùng cần thiết, cho dù đó là thông qua một biến tĩnh của tệp hay được cung cấp bằng cách chuyển tay cầm hàng đợi vào một mô-đun dưới dạng tham số chức năng

““

đọc thêm

Để biết thêm về chủ đề này, hãy xem mục Truyền tin nhắn

gọi lại

Một cách khác để chia sẻ giá trị dữ liệu mới với các khách hàng quan tâm là thông qua việc sử dụng các lệnh gọi lại (hay nói chung hơn là mẫu Người quan sát). Bất cứ khi nào có dữ liệu mới, nhà sản xuất có thể chia sẻ dữ liệu đó bằng cách gọi tất cả các cuộc gọi lại đã đăng ký và chuyển dữ liệu mới theo tham số

Kỹ thuật tái cấu trúc

Nếu bạn đang cố gắng gỡ rối một thiết kế phụ thuộc nhiều vào dữ liệu toàn cầu, bạn có thể sử dụng các kỹ thuật sau

  • Tái cấu trúc Dữ liệu Toàn cầu để Hỗ trợ Nhiều Phiên bản mô tả một phương pháp tái cấu trúc có thể giải quyết một thách thức chung về dữ liệu toàn cầu, đó là nhu cầu chuyển từ hỗ trợ một phiên bản duy nhất sang hỗ trợ nhiều phiên bản. Kỹ thuật tương tự có thể được sử dụng để bản địa hóa dữ liệu toàn cầu – đầu tiên, đóng gói dữ liệu trong một cấu trúc, sau đó giảm phạm vi của cấu trúc đó (dù là trong một mô-đun hay truyền thông tin qua các tham số chức năng)
  • Hệ thống nhúng tốt hơn SW. Loại bỏ các biến toàn cục mô tả quy trình chuyển đổi một biến toàn cục và các hàm liên quan sử dụng biến đó thành một mô-đun duy nhất. Điều này thích hợp hơn vì một số lý do – nó bản địa hóa quyền truy cập (thực hiện các thay đổi và gỡ lỗi dễ dàng hơn), ẩn việc triển khai và chúng tôi thực sự có thể kích hoạt đa luồng bằng cách đảm bảo rằng chúng tôi đã khóa đúng cách
  • Tổ chức lại mã nguồn dựa trên truy cập dữ liệu
    • Dữ liệu toàn cầu được chia sẻ có thể được giảm phạm vi bằng cách xem xét lại cách tổ chức mã nguồn của bạn. sắp xếp các tệp nguồn của bạn dựa trên quyền truy cập vào dữ liệu. Các chức năng sửa đổi cùng một dữ liệu chung có thể được nhóm trong một mô-đun. Sau đó, biến toàn cục có thể được giảm phạm vi thành một biến tĩnh tệp phục vụ nhóm chức năng đó
    • Để sử dụng một ví dụ do Phil Koopman đưa ra, hãy xem xét biến thời gian trong ngày được ISR cập nhật. Bạn có thể tạo một tệp TimeOfDay.c chứa các nội dung sau
      • Một biến tĩnh tệp timeOfDay
      • Việc thực hiện chức năng ISR hẹn giờ
      • Một API để đọc thời gian trong ngày (trả về giá trị của timeOfDay)

Quy tắc khi Globals phải được sử dụng

Lý tưởng nhất là không có biến nào trong một hệ thống sẽ là toàn cầu (ngoại trừ các biến toàn cầu đặc biệt như hằng số toán học và thông tin cấu hình thời gian biên dịch). Tuy nhiên, nếu các biến toàn cục được sử dụng, chúng tôi đề xuất các quy tắc sau

  • Mỗi biến toàn cục hoặc danh mục các biến toàn cục phải được chứng minh là cần thiết để xây dựng phần mềm hiệu quả và lý do căn bản cho việc sử dụng chúng phải được ghi lại cho các nhà phát triển khác
    • Hiệu quả không phải là lý do để sử dụng các biến toàn cục (e. g. , “truy cập dữ liệu này thông qua một chức năng gây ra chi phí hoạt động” hiếm khi là một lời biện minh đầy đủ. Nếu đây thực sự là nguyên nhân gây tắc nghẽn hệ thống của bạn, hãy mua bộ xử lý nhanh hơn. )
  • Trong một hệ thống đa tác vụ, mỗi toàn cầu nên được khai báo volatile và được bảo vệ theo một cách nào đó (e. g. , bởi một mutex, trong một phần quan trọng)

Khi dữ liệu chung được sử dụng cho một giá trị cấu hình, hằng số toán học hoặc giá trị khác không thay đổi trong thời gian chạy, hãy đảm bảo

  • Biến được khai báo bằng từ khóa const để ngăn việc sửa đổi
  • Khả năng hiển thị được giới hạn ở mức cần biết, thay vì hiển thị cho toàn bộ hệ thống trong tệp loại globals.h chung

Người giới thiệu

  • Các biến toàn cầu được coi là có hại bởi Wulf và Shaw

    Chúng tôi cho rằng biến không cục bộ là một yếu tố đóng góp chính trong các chương trình khó hiểu. […] Tuy nhiên, đại khái chúng tôi muốn nói đến bất kỳ biến nào được truy cập và đặc biệt là sửa đổi, trong một khoảng thời gian tương đối lớn của văn bản chương trình

    Chúng ta phải thừa nhận những hạn chế nhất định đối với năng lực trí tuệ của mình - cụ thể là chúng ta có khả năng đối phó với các mối quan hệ tĩnh giữa các đối tượng tốt hơn so với các mối quan hệ phát triển động. Vì văn bản của một chương trình là tĩnh nhưng quá trình thực thi của nó là động, nên bất kỳ thứ gì phá hủy hoặc che khuất ánh xạ giữa quan hệ văn bản và quan hệ thực thi sẽ làm tăng thêm khó khăn trong việc thực hiện điều mà chúng ta được trang bị ở phương đông để làm.

  • Kỹ thuật. Tái cấu trúc dữ liệu toàn cầu để hỗ trợ nhiều phiên bản
  • Hệ thống nhúng tốt hơn SW. Chương mẫu biến toàn cầu là xấu xa của Phil Koopman

    Vấn đề với việc sử dụng toàn cầu là các phần khác nhau của phần mềm được kết hợp theo cách làm tăng độ phức tạp và có thể dẫn đến các lỗi tinh vi

    Con trỏ tới toàn cầu thậm chí còn xấu xa hơn

    Vấn đề chính khi sử dụng các biến toàn cục là chúng tạo ra các khớp nối ngầm giữa các phần khác nhau của chương trình (các thủ tục khác nhau có thể thiết lập hoặc sửa đổi một biến, trong khi một số thủ tục khác có thể đọc nó). Các khớp nối đó không được thể hiện tốt trong thiết kế phần mềm và không được thể hiện rõ ràng trong ngôn ngữ triển khai. Kiểu liên kết dữ liệu không rõ ràng này giữa các mô-đun dẫn đến các lỗi khó tìm và khó hiểu

  • Biến toàn cầu là ác. Slide bài giảng của Phil Koopman

    Việc sử dụng toàn cầu cho thấy tính mô đun kém

  • Hệ thống nhúng tốt hơn SW. Giảm thiểu việc sử dụng các biến toàn cục của Phil Koopman

    Phần mềm nhúng quan trọng nên sử dụng phạm vi biến tối thiểu có thể thực hiện được cho từng biến và nên giảm thiểu việc sử dụng các biến toàn cục

    Việc sử dụng quá nhiều toàn cầu có thể được dự đoán một cách hợp lý sẽ dẫn đến tỷ lệ lỗi tăng lên đáng kể và sự hiện diện của các lỗi phần mềm khó tìm có khả năng khiến hệ thống không an toàn

    Kết quả. Việc sử dụng quá nhiều biến toàn cục làm tăng độ phức tạp của phần mềm và có thể làm tăng số lượng lỗi cũng như khiến mã khó bảo trì đúng cách. Việc xác định các biến là toàn cầu thay vì có thể được định nghĩa là cục bộ có thể được kỳ vọng một cách hợp lý sẽ làm tăng đáng kể nguy cơ dữ liệu bị sử dụng không đúng cách trên toàn cầu, cũng như gây khó khăn hơn cho việc theo dõi và phân tích một vài biến lẽ ra là toàn cầu một cách hợp pháp. Nói tóm lại, việc sử dụng quá nhiều toàn cầu dẫn đến số lượng lỗi phần mềm tăng lên

    Một thiểu số đáng kể của các biến (hoặc ít hơn) phải là toàn cầu. Lý tưởng nhất là các biến không nên là toàn cầu. (Các toàn cầu đặc biệt như hằng số toán học và thông tin cấu hình có thể bị loại trừ khỏi số liệu này. ) Con số chính xác thay đổi theo hệ thống, nhưng phạm vi dự kiến ​​sẽ từ dưới 1% đến có thể là 10% của tất cả các biến được phân bổ tĩnh (thậm chí con số này có thể quá cao), với ưu tiên cực kỳ mạnh cho phía dưới của phạm vi đó

    Nhu cầu đối với từng toàn cầu hoặc danh mục toàn cầu phải được chứng minh cụ thể theo yêu cầu để xây dựng phần mềm hiệu quả. Tăng tốc độ nói chung là không đủ biện minh, cũng như không gian bộ nhớ hạn chế

    Trong bất kỳ hệ thống nào có nhiều hơn một tác vụ (bao gồm cả các hệ thống chỉ có một tác vụ chính cộng với các ngắt), mọi toàn cầu không cố định phải được khai báo là không ổn định và mọi truy cập vào một toàn cầu phải được bảo vệ bằng một hình thức quản lý tương tranh (e. g. , vô hiệu hóa các ngắt hoặc sử dụng một mutex). Không thực hiện được một trong hai điều này thường có thể dẫn đến lỗi đồng thời ở đâu đó trong mã của bạn

    Mỗi biến nên được khai báo cục bộ nếu có thể. Các biến được sử dụng bởi một tập hợp các hàm trong cùng một mô-đun ngôn ngữ lập trình C phải được khai báo là "tĩnh" cấp cao nhất trong phạm vi tương ứng. c để giới hạn khả năng hiển thị đối với các chức năng được khai báo trong đó. tập tin c. Các biến chỉ được sử dụng bởi một hàm phải được khai báo trong hàm đó và do đó không hiển thị đối với bất kỳ hàm nào khác

    Một lý do để tránh toàn cầu là việc sử dụng nhiều toàn cầu có thể được kỳ vọng một cách hợp lý sẽ dẫn đến sự kết hợp cao giữa nhiều phần khác nhau của chương trình. Bất kỳ biến nào hiển thị trên toàn cầu đều có thể được đọc hoặc ghi từ bất kỳ đâu trong mã, làm tăng độ phức tạp của chương trình và do đó có khả năng xảy ra lỗi phần mềm. Mặc dù phân tích có thể được thực hiện để xác định vị trí mà toàn cầu thực sự được đọc và viết, nhưng làm như vậy đối với một số lượng lớn toàn cầu sẽ tốn thời gian và phải được thực hiện lại bất cứ khi nào có bất kỳ thay đổi đáng kể nào đối với mã. (Ví dụ: phân tích như vậy sẽ phải được thực hiện lại cho mỗi lần phát hành phần mềm. )

    Một lý do khác để tránh toàn cầu là chúng gây ra các mối nguy hiểm đồng thời (xem phần thảo luận về đồng thời trong một bài đăng sắp tới). Bởi vì rất khó để theo dõi phần nào của chương trình đang đọc và viết toàn cầu, mã an toàn phải giả định rằng các tác vụ khác có thể truy cập toàn cầu và sử dụng bảo vệ đồng thời đầy đủ mỗi khi toàn cầu được tham chiếu. Điều này bao gồm cả việc khóa quyền truy cập vào toàn cầu khi thực hiện thay đổi và tuyên bố toàn cầu “không ổn định” để đảm bảo mọi thay đổi lan truyền trong toàn bộ phần mềm

    Ngay cả khi các mối nguy tương tranh thường tránh được, nếu có nhiều vị trí trong chương trình sửa đổi một toàn cầu thì rất dễ xảy ra hành vi phần mềm không mong muốn do hai phần của chương trình sửa đổi giá trị của toàn cầu theo một trình tự không lường trước được. Điều này có thể được dự đoán một cách hợp lý là sẽ dẫn đến các lỗi đồng thời không thường xuyên và tinh vi (nhưng có khả năng nghiêm trọng)

    Sử dụng quá nhiều hình cầu có thể được coi là phiên bản luồng dữ liệu của mã spaghetti. Với luồng “điều khiển” mã (các câu lệnh “nếu” có điều kiện và tương tự) bị rối, rất khó để theo dõi luồng điều khiển của phần mềm. Tương tự, với quá nhiều toàn cầu, rất khó để theo dõi luồng dữ liệu thông qua chương trình – bạn nhận được “dữ liệu spaghetti. ” Trong cả hai trường hợp (luồng dữ liệu rối và luồng điều khiển rối), các nhà thiết kế có thể kỳ vọng một cách hợp lý rằng phần mềm spaghetti sẽ có mức độ lỗi phần mềm cao hơn. Việc sử dụng quá nhiều các biến toàn cục làm cho việc kiểm tra đơn vị trở nên khó khăn, bởi vì nó yêu cầu xác định và thiết lập các giá trị cụ thể trong tất cả các biến toàn cầu được tham chiếu bởi một mô-đun đang được kiểm tra đơn vị

  • Hệ thống nhúng tốt hơn SW. Thoát khỏi các biến toàn cầu của Phil Koopman
  • “Nguyên tắc Mở-Đóng” của Robert Martin

    Không có biến toàn cục — Đã từng

    Đối số chống lại các biến toàn cục tương tự như đối số chống lại các biến thành viên pubic. Không có mô-đun nào phụ thuộc vào biến toàn cục có thể bị đóng đối với bất kỳ mô-đun nào khác có thể ghi vào biến đó. Bất kỳ mô-đun nào sử dụng biến theo cách mà các mô-đun khác không mong đợi, sẽ phá vỡ các mô-đun đó. Quá rủi ro khi có nhiều mô-đun phải tuân theo ý thích bất chợt của một mô-đun có hành vi xấu

    Mặt khác, trong trường hợp một biến toàn cục có rất ít biến phụ thuộc hoặc không thể được sử dụng theo cách không nhất quán, chúng sẽ gây hại rất ít. Nhà thiết kế phải đánh giá mức độ đóng cửa được hy sinh cho toàn cầu và xác định xem sự tiện lợi mà toàn cầu mang lại có xứng đáng với chi phí bỏ ra hay không

    Một lần nữa, có những vấn đề về phong cách xuất hiện. Các lựa chọn thay thế cho việc sử dụng toàn cầu thường rất rẻ. Trong những trường hợp đó, thật là tồi khi sử dụng một kỹ thuật có nguy cơ đóng cửa dù chỉ một lượng rất nhỏ đối với một kỹ thuật không có rủi ro như vậy. Tuy nhiên, có những trường hợp sự tiện lợi của toàn cầu là đáng kể. Các biến toàn cục cout và cin là những ví dụ phổ biến. Trong những trường hợp như vậy, nếu nguyên tắc mở-đóng không bị vi phạm, thì sự tiện lợi có thể đáng để vi phạm kiểu dáng

  • C++. Trường hợp chống lại các biến toàn cầu
  • Wiki C2. Biến toàn cầu là xấu
  • Code Complete của Steve McConnell, được trích dẫn bởi Koopman trong Minimize Use of Global Variables

    McConnell nói. “Dữ liệu toàn cầu giống như một bức thư tình giữa các công việc thường ngày – nó có thể đến nơi bạn muốn hoặc có thể bị thất lạc trong thư. ” (McConnell 1993, trang. 88). McConnell cũng nói. “Kết nối dữ liệu toàn cầu là điều không mong muốn vì kết nối giữa các thói quen không thân mật cũng như không thể nhìn thấy được. Mối liên hệ này rất dễ bị bỏ sót đến mức bạn có thể gọi nó là người anh em xấu xa của việc che giấu thông tin – ‘mất thông tin’. ’” (McConnell 1993, trang. 90)

    Làm thế nào để tránh các biến toàn cầu c ++

  • [Đã giải quyết] Khi nào các biến toàn cầu thực sự được coi là thông lệ tốt/được đề xuất?

    Các biến toàn cầu nói chung không tệ vì hiệu suất của chúng, chúng tệ vì trong các chương trình có kích thước lớn, chúng khiến việc gói gọn mọi thứ trở nên khó khăn – có thông tin “rò rỉ” thường có thể khiến bạn rất khó tìm ra điều gì đang xảy ra

    Bạn có nên tránh các biến toàn cầu trong C?

    Lập trình C và C nhúng thành thạo- Vừa học vừa làm . Sử dụng biến toàn cục làm giảm tính modul và tính mềm dẻo của chương trình. Không nên sử dụng biến toàn cục trong chương trình .

    Làm thế nào chúng ta có thể tránh toàn cầu?

    Cách đơn giản nhất để tránh tất cả các biến toàn cục cùng nhau là chỉ cần chuyển các biến của bạn bằng các đối số hàm . Như bạn có thể thấy, mảng $productData từ bộ điều khiển (thông qua yêu cầu HTTP) đi qua lớp khác. Bộ điều khiển nhận được yêu cầu HTTP. Các tham số được truyền vào mô hình.

    Việc sử dụng các biến toàn cục có phải là một thông lệ không tốt không?

    Các biến toàn cục thường không tệ vì hiệu suất của chúng, chúng tệ vì trong các chương trình có kích thước đáng kể, chúng khiến việc gói gọn mọi thứ trở nên khó khăn – có thông tin “rò rỉ” mà .

    Làm thế nào các tham số có thể được sử dụng để tránh việc sử dụng các biến toàn cục?

    Truyền tham số - cho phép truyền giá trị của biến cục bộ trong chương trình chính cho chương trình con mà không cần sử dụng biến toàn cục. Giá trị của các biến này (hoặc bản sao giá trị của các biến này) được truyền dưới dạng tham số đến và từ các chương trình con khi cần thiết.