Phương pháp tham số so với biến toàn cục


10

Tôi có một câu hỏi rất đơn giản đã ám ảnh tôi trong một thời gian khi mã của tôi bắt đầu phát triển.

Các tham số có nên được thay thế bằng các biến toàn cục khi chúng đi qua các tuyến dài của các lệnh gọi hàm lồng nhau?

Tôi hiểu rằng môi trường toàn cầu có thể làm cho trạng thái của một chương trình không thể đoán trước được vì nhiều chức năng có thể sửa đổi các biến được chia sẻ, nhưng, không gian toàn cầu làm cho mọi thứ trở nên dễ dàng.

Hãy để tôi tự giải thích:

functionA(){
   x = something
   functionB(x)
}
functionB(x){
   functionC(x)
}
functionC(x){
   finallyDoSomethingWithX(x)
}
finallyDoSomethingWithX(x){
  x += 1 //Very dummy example ignoring pass by value, not reference.
}

Được thay thế bởi:

globalX;
functionA(){
   globalX = something
   functionB()
}
...
...
...
finallyDoSomethingWithX(){
   globalX += 1
}

Tôi cảm thấy cách thứ hai mang lại rất nhiều sự tự do cho chương trình bởi vì các tham số có thể tích lũy dễ dàng và đôi khi cũng có thể rất hạn chế khi mã phải được sử dụng lại, nhưng đồng thời tôi cảm thấy như hàm sẽ mất tính mô đun khi liên quan đến một biến trong môi trường toàn cầu, cũng mất khả năng sử dụng lại, ví dụ, khi tôi muốn hoạt động finallyDoSomethingWithXvới một biến khác tha globalX.

Tôi nghĩ điều này xảy ra với tôi bởi vì tôi không thực sự sử dụng các mẫu thiết kế vì tôi đang lập trình bằng Javascript, mà đối với tôi cảm giác giống như một ngôn ngữ một tập lệnh cho tất cả các dự án trung bình.

Có lời khuyên nào không? hoa văn? Tôi có thể được cụ thể hơn nếu cần thiết.


5
Thông thường, nếu bạn chuyển các biến rất sâu, bạn đã không giải quyết vấn đề chính xác. Đối với các biến toàn cầu lái xe trạng thái ở nơi khác trong hệ thống, tránh nó như bệnh dịch hạch. Không thể quản lý tại một thời điểm nhất định và bạn sẽ thấy mọi thứ bị phá vỡ ngẫu nhiên vì một số trạng thái bị đột biến bởi một chức năng mà bạn không mong đợi một cách ngẫu nhiên.
mgw854

Tránh nó như bệnh dịch hạch. Hiểu. Bạn có thể nói rõ hơn một chút về "bạn đã không giải quyết vấn đề một cách chính xác". Tôi hiểu ý tưởng chung nhưng tôi không thể đưa ra một ví dụ hoặc một cái gì đó để thực sự hiểu nó.
AFP_555

2
Một biện pháp khắc phục phổ biến khi bạn thấy mình truyền các đối số sâu nhiều lớp là tạo một đối tượng phương thức : một đối tượng của một lớp mới có các phương thức tương ứng với các hàm truyền các tham số cùng. Các tham số sau đó có thể trở thành các biến cục bộ cho đối tượng và các phương thức của nó không cần phải truyền các giá trị nữa.
Kilian Foth

@KilianFoth Cảm ơn. Bạn có thể vui lòng giải thích với một số mã để tôi có thể kiểm tra câu trả lời?
AFP_555

1
Xem xét việc xử lý cấu trúc mã JavaScript của bạn như trong các ngôn ngữ khác (chẳng hạn như các ngôn ngữ sử dụng các lớp "thực"). Một số liên kết hữu ích về câu hỏi liên quan này trên SO: stackoverflow.com/questions/927651/NH
Ben Cottrell

Câu trả lời:


7

Đừng sử dụng các biến toàn cục.

Ngoài ra, không truyền tham số xuống chuỗi chức năng!

Thật khó khăn vì bạn không sử dụng một ví dụ thực tế. Nhưng thông thường sẽ có một cách tiếp cận tốt hơn.

Hãy nói rằng chúng ta có một biến mật khẩu mà chúng ta cần sử dụng để gọi apis mà inturn được sử dụng bởi các hàm cấp thấp khác nhau.

Cách tiếp cận toàn cầu (mã psudo)

var pass;

function multiply(a,b) {
   return apiMultiply(pass,a,b);
}

Phương pháp truyền tham số

function multiply(a,b,pass) {
    return apiMultiply(pass,a,b);
}

Đối tượng tiếp cận

class math {
    var api;
    constructor(pass) {
        api = new api(pass);
    }

    function Multiply(a,b) {
        api.Multiply(a,b); //uses pass from constructor
    }
}

Tuyệt vời. Cách vượt qua này không có trong môi trường toàn cầu và cũng không phải là một tham số cho các hàm múltipl vì nó có thể được lấy từ các thuộc tính của đối tượng. Cảm ơn.
AFP_555

3

Tránh toàn cầu như bệnh dịch hạch.

Bất kỳ mã nào cũng có thể sửa đổi toàn cầu. Vì vậy, nếu bạn có chuỗi A (x) -> B (x) -> C (x) -> ... -> Z (x) và bạn lưu trữ x vào X toàn cầu và bây giờ bạn có chuỗi A- > B-> C -> ...-> Z, sau đó ở mỗi bước của chuỗi dài đó hoặc trong mã hoàn toàn độc lập, ai đó có thể thay đổi X. Và giá trị mà Z sử dụng có thể hoàn toàn khác với A mà bắt đầu với.

Đó là một cơn ác mộng nếu bạn muốn chắc chắn rằng mã của bạn làm những gì nó phải làm, hoặc nó làm những gì bạn nghĩ nó làm.


1
Hoàn toàn đồng ý. Nếu bạn sử dụng toàn cầu để giải quyết vấn đề của mình, bây giờ bạn có hai vấn đề.
Caleb Mauer
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.