Hướng dẫn should you avoid using global variables in python? - bạn có nên tránh sử dụng các biến toàn cục trong python không?

Một ý kiến ​​cá nhân về chủ đề là việc có các biến toàn cầu đang được sử dụng trong logic hàm có nghĩa là một số mã khác có thể thay đổi logic và đầu ra dự kiến ​​của hàm đó sẽ khiến việc gỡ lỗi rất khó (đặc biệt là trong các dự án lớn) và sẽ làm cho thử nghiệm khó khăn hơn cũng.

Hơn nữa, nếu bạn xem xét người khác đọc mã của bạn (cộng đồng nguồn mở, đồng nghiệp, v.v.), họ sẽ gặp khó khăn khi cố gắng hiểu biến toàn cầu đang được thiết lập, nơi đã được thay đổi và những gì mong đợi từ biến toàn cầu này trái ngược đối với một hàm bị cô lập mà chức năng của nó có thể được xác định bằng cách đọc định nghĩa hàm.

(Có lẽ) vi phạm định nghĩa chức năng thuần túy

Tôi tin rằng một mã không có lỗi và (gần) sẽ có các chức năng tinh khiết nhất có thể (xem các chức năng thuần túy). Một hàm thuần túy là một hàm có các điều kiện sau:

  1. Hàm luôn đánh giá cùng một giá trị kết quả với cùng một giá trị đối số. Giá trị kết quả chức năng không thể phụ thuộc vào bất kỳ thông tin hoặc trạng thái ẩn nào có thể thay đổi trong khi tiến hành thực hiện chương trình hoặc giữa các lần thực hiện khác nhau của chương trình, cũng không thể phụ thuộc vào bất kỳ đầu vào bên ngoài nào từ các thiết bị I/O (thường là xem bên dưới).always evaluates the same result value given the same argument value(s). The function result value cannot depend on any hidden information or state that may change while program execution proceeds or between different executions of the program, nor can it depend on any external input from I/O devices (usually—see below).
  2. Đánh giá kết quả không gây ra bất kỳ tác dụng phụ hoặc đầu ra nào có thể quan sát được, chẳng hạn như đột biến của các đối tượng có thể thay đổi hoặc đầu ra cho các thiết bị I/O.does not cause any semantically observable side effect or output, such as mutation of mutable objects or output to I/O devices.

Có các biến toàn cầu đang vi phạm ít nhất một trong những điều ở trên nếu không phải là một mã bên ngoài có thể gây ra kết quả bất ngờ.

Một định nghĩa rõ ràng khác về các chức năng thuần túy: "Chức năng thuần túy là một hàm lấy tất cả các đầu vào của nó làm đối số rõ ràng và tạo ra tất cả các đầu ra của nó làm kết quả rõ ràng." [1]. Có các biến toàn cầu vi phạm ý tưởng về các hàm thuần túy vì đầu vào và có thể một trong các đầu ra (biến toàn cầu) không được cung cấp rõ ràng hoặc trả về.all of its inputs as explicit arguments and produces all of its outputs as explicit results." [1]. Having global variables violates the idea of pure functions since an input and maybe one of the outputs (the global variable) is not explicitly being given or returned.

(Có lẽ) Vi phạm kiểm tra đơn vị F.I.R.S.T Nguyên tắc

Hơn nữa, nếu bạn xem xét kiểm tra đơn vị và nguyên tắc F.I.R.S.T (kiểm tra nhanh, kiểm tra độc lập, lặp lại, tự đánh giá và kịp thời) có thể sẽ vi phạm nguyên tắc kiểm tra độc lập (có nghĩa là các bài kiểm tra không phụ thuộc vào nhau).Fast tests, Independent tests, Repeatable, Self-Validating and Timely) will probably violate the Independent tests principle (which means that tests don't depend on each other).

Có một biến toàn cầu (không phải luôn luôn) nhưng trong hầu hết các trường hợp (ít nhất là những gì tôi đã thấy cho đến nay) là chuẩn bị và chuyển kết quả cho các chức năng khác. Điều này vi phạm nguyên tắc này là tốt. Nếu biến toàn cầu đã được sử dụng theo cách đó (tức là biến toàn cầu được sử dụng trong hàm X phải được đặt trong hàm y trước tiên), điều đó có nghĩa là đối với chức năng kiểm tra đơn vị x, bạn phải chạy chức năng kiểm tra/chạy y trước.

Quả cầu là hằng số

Mặt khác và như những người khác đã đề cập, nếu biến toàn cầu được sử dụng làm biến "không đổi" có thể tốt hơn một chút vì ngôn ngữ không hỗ trợ hằng số. Tuy nhiên, tôi luôn thích làm việc với các lớp và có "hằng số" với tư cách là thành viên lớp và hoàn toàn không sử dụng biến toàn cầu. Nếu bạn có một mã mà hai lớp khác nhau yêu cầu để chia sẻ một biến toàn cầu thì có lẽ bạn cần phải tái cấu trúc giải pháp của mình và làm cho các lớp của bạn độc lập.

Tôi không tin rằng Globals không nên được sử dụng. Nhưng nếu chúng được sử dụng, các tác giả nên xem xét một số nguyên tắc (các nguyên tắc được đề cập ở trên và các nguyên tắc kỹ thuật phần mềm khác và thực tiễn tốt) cho một mã sạch hơn và gần như không có lỗi.

Novacrawler đã nói rất tốt, nhưng tôi muốn thêm công thức câu trả lời của mình vì đây là câu hỏi ai đó trong nhóm của tôi cho công ty tôi làm việc gần đây.

Bạn không nên sử dụng biến toàn cầu trong bất kỳ loại dự án nào mà bạn muốn duy trì, chia sẻ hoặc tạo hơn vài trăm dòng mã. Biến toàn cầu không liên tục (nghĩ rằng "một biến được cập nhật bởi hai hoặc nhiều chức năng") là xấu vì chúng giới thiệu khái niệm "tác dụng phụ". Tác dụng phụ được định nghĩa là bất cứ điều gì tương tác với "thế giới bên ngoài". Trong phạm vi của một hàm, một biến toàn cầu được sửa đổi được gọi là tác dụng phụ vì biến đó không được giới thiệu bên trong hàm cũng như một tham số, do đó, việc sửa đổi biến đó là "hiệu ứng phụ", bởi vì bạn là Tương tác với một cái gì đó bên ngoài phạm vi của chức năng hiện tại được thực thi. Điều này làm cho mã của bạn vô cùng khó khăn để lý luận về bạn và bởi người khác bởi vì khi bạn đang đọc định nghĩa hàm và thấy một biến ngẫu nhiên được sửa đổi, bản năng đầu tiên của bạn là "Đợi ... biến đó đến từ đâu! ??!" Và sau đó tìm kiếm xảy ra. Càng nhiều biến toàn cầu và mã của bạn càng lớn, càng có nhiều cụm khó hiểu, nó càng trở nên khó khăn hơn để duy trì vì các tác dụng phụ này.

Mặt khác, các biến toàn cầu tồn tại bởi vì, tốt, chúng chỉ là các biến được khai báo trong phạm vi cấp cao nhất của chương trình. Để không cho phép các biến toàn cầu sẽ không cho phép các biến cấp cao nhất hoàn toàn, nhưng đôi khi có những cách sử dụng tốt cho các biến cấp cao nhất: đôi khi:

  1. Nếu bạn muốn hack một cái gì đó thực sự nhanh chóng và xem nó có hoạt động không

  2. Nếu bạn muốn khai báo một giá trị không đổi mà bạn sẽ không bao giờ sửa đổi (thường được xác định bởi allcaps, ví dụ: gravity_accel = 9.8)

  3. Nếu bạn chỉ có phạm vi cấp cao nhất vì chương trình của bạn quá nhỏ đến nỗi mặc dù nó giới thiệu các hiệu ứng phụ, mã vẫn đủ dễ để lý luận.

Có một vài lý do khác tồn tại, nhưng đây là cách tôi muốn giải thích lý do tại sao bạn không nên sử dụng các biến toàn cầu. Chúng không thực sự khủng khiếp khi bạn xuống tận cùng của mọi thứ, nhưng vì đã cố gắng lý luận về mã, khi làm việc trong một nhóm nơi những người khác sẽ phải đọc và hiểu mã của bạn, và để xây dựng Phần mềm, bạn chỉ đơn giản là không sử dụng các biến toàn cầu.

Tôi có nên tránh các biến toàn cầu trong Python không?

Việc sử dụng biến toàn cầu trong Python được coi là thực hành xấu và nói chung nên tránh. Thay vào đó, người dùng có thể thử và sử dụng tham số để truyền giá trị lên hàm hoặc trả về giá trị để có được nó.. Instead the user can try and use a parameter for passing a value onto a function or return a value to obtain it.

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

Sử dụng các biến toàn cầu gây ra sự kết hợp rất chặt chẽ của mã.Sử dụng các biến toàn cầu gây ô nhiễm không gian tên.Điều này có thể dẫn đến việc chỉ định lại một giá trị toàn cầu không cần thiết.Kiểm tra trong các chương trình sử dụng các biến toàn cầu có thể là một nỗi đau lớn vì rất khó để tách chúng ra khi thử nghiệm.. Using global variables causes namespace pollution. This may lead to unnecessarily reassigning a global value. Testing in programs using global variables can be a huge pain as it is difficult to decouple them when testing.

Là biến toàn cầu tốt trong Python?

Một biến toàn cầu trong Python thường được tuyên bố là đỉnh của chương trình.Nói cách khác, các biến được khai báo bên ngoài hàm được gọi là biến toàn cầu.Bạn có thể truy cập các biến toàn cầu trong Python cả bên trong và bên ngoài hàm.. In other words, variables that are declared outside of a function are known as global variables. You can access global variables in Python both inside and outside the function.

Các biến toàn cầu có làm chậm Python không?

Bạn sẽ nhận thấy rằng trong cả hai trường hợp, X là một biến toàn cầu (vì không có chức năng) và cả hai đều chậm hơn so với sử dụng người dân địa phương.they're both slower than using locals.

Chủ đề