2012-01-10 8 views
10

Tôi đang viết một ứng dụng MATLAB có nhiều chức năng trải rộng trên các tệp khác nhau. Tôi có một logger, là một cấu trúc với một con trỏ hàm, và tôi sử dụng nó để ghi lại thông tin cho người dùng xem (nghĩa là, chức năng nào hiện đang thực thi, kết quả tính toán, v.v.). Lý do tôi sử dụng một cấu trúc cho logger của tôi và không chỉ đơn giản là fprintf() là tôi có thể dễ dàng thay thế nó bằng trình ghi XML, trình ghi HTML, v.v. trong tương lai.Thay thế tốt nhất cho các biến toàn cục của MATLAB

Vì mã của tôi bao gồm nhiều hàm gọi nhau, tôi đã khai báo cấu trúc nhật ký của mình là toàn cầu, vì vậy tôi không phải chuyển nó cho tất cả các hàm của mình. Tuy nhiên, ở khắp mọi nơi tôi nhìn tôi thấy rằng các biến toàn cầu là hiện thân ác trong MATLAB và sẽ làm chậm chương trình của tôi xuống đáng kể.

Có cách nào để có các biến có sẵn trên các tệp mà không nhất thiết phải chuyển chúng dưới dạng thông số đầu vào và không bị xử phạt nghiêm trọng?

+0

Vars toàn cầu không phải là "ác". Họ chỉ có thể tạo ra nhiều lỗi nếu bạn không phải là một lập trình viên có kinh nghiệm, chẳng hạn như quá tải các vars khác vv Ngoài ra, tôi không tin rằng có một hit hiệu suất cho globals trong Matlab. Nếu sử dụng globals làm cho cuộc sống của bạn "cực kỳ" dễ dàng hơn, sau đó sử dụng chúng. Chỉ cần cố gắng không làm cho nó trở thành một thói quen. – Jorge

+1

@Jorge mọi lập trình viên, không chỉ những lập trình viên thiếu kinh nghiệm. Nhưng ngược lại, vâng. –

+0

@Jorge - tiêu chí của bạn để sử dụng globals so với biến truyền vào phương thức là gì? – dzisner

Trả lời

9

Bạn cũng có thể sử dụng liên tục từ khóa bên trong tệp và phân bổ trình ghi nhật ký ở đó.
Điều này tương tự với một số cách đối với từ khóa tĩnh trong C++. Nó cũng là việc triển khai mẫu Singleton.

function CallLogger(st) 
    persistent logger; 
    if isempty(logger) 
     %Allocate new logger 
    end 
    logger.disp(st); 
end 

Nó là tốt hơn so với toàn cầu vì
1. Không ai có thể tiêu diệt logger của bạn mà bạn không biết.
2. Không ai biết về đối tượng này, bởi vì nó chỉ giới hạn ở phạm vi chức năng

Nhân tiện, tôi không đồng ý rằng vấn đề hiệu suất toàn cầu. Nó không chỉ là một thực hành tốt, về kỹ thuật phần mềm.

+0

Hi @ Andrey, Cách tôi nhìn thấy nó, biến cố định tương đương với các biến "tĩnh" trong C/C++ để chúng chỉ tồn tại bên trong phạm vi chức năng chứ không phải trên các hàm, phải không? – dzisner

+0

Cảm ơn Andrey, câu trả lời của bạn rất tuyệt. Tôi đã quyết định rời xa khỏi những quả cầu nhiều nhất có thể, cho cả thực hành và hiệu suất tốt. Cảm ơn!! – dzisner

2

Tốt hơn gọi các biến cố định trong một hàm (ví dụ, sẽ không được lưu nếu bạn lưu và sau đó tải lại không gian làm việc của bạn) sẽ chuyển từ hàm + struct sang đối tượng: nghĩa là bạn nên xem xét Lập trình hướng đối tượng của MATLAB.

+0

Bạn đang đề cập đến việc tạo một lớp mới kế thừa lớp xử lý MATLAB? – wherestheforce

+0

Có: chính xác điều này. – lsfinn