Như một quy tắc chung "hãy cố gắng giữ nó ở chế độ cục bộ nhất có thể nhưng có thể nhìn thấy khi cần thiết".
Nếu tất cả mã gọi hàm nằm trong cùng một tệp triển khai, điều này có nghĩa là giữ mã cục bộ cho tệp triển khai.
Nếu bạn đặt phương thức tĩnh riêng tư cho lớp học của mình, nó sẽ không thể gọi được bởi các triển khai bao gồm cả lớp của bạn, nhưng nó vẫn hiển thị với chúng.Vì vậy, mỗi khi bạn thay đổi ngữ nghĩa của phương thức đó, tất cả các hiện thực bao gồm các cuộc gọi của bạn sẽ phải biên dịch lại - đó là một gánh nặng, kể từ quan điểm của họ, họ thậm chí không cần phải biết những điều đó.
Vì vậy, để giảm thiểu các phụ thuộc không cần thiết, bạn sẽ muốn làm cho nó trở thành một hàm toàn cầu tĩnh. Tuy nhiên, nếu bạn đã từng thấy mình lặp lại chức năng toàn cục này trong các tập tin thực thi mulitple, nó sẽ là thời gian để di chuyển hàm vào một cặp tập tin header/implementaion riêng biệt, để tất cả người gọi có thể bao gồm nó.
Cho dù bạn đặt chức năng đó vào không gian tên, ở phạm vi toàn cầu hay là một hàm tĩnh trong một lớp thực sự là rất thích hợp.
Trên lưu ý cuối cùng, nếu bạn sử dụng chức năng tĩnh toàn cục, có phiên bản "thêm C++ như": các không gian tên ẩn danh. Nó có thuộc tính tốt đẹp mà nó thực sự có thể lưu trữ trạng thái và cũng ngăn cản người dùng có thể thậm chí chuyển tiếp khai báo bất kỳ chức năng nào của nó.
// in your .cpp file
namespace /*anonymous*/
{
void foo()
{
// your code here
}
};
void MyClass::FooUser1() { foo(); }
void MyClass::FooUser2() { foo(); }
Nguồn
2009-06-26 11:27:39
Chỉ vì phần mã này xuất hiện hai lần, điều đó không có nghĩa là bạn phải tự tạo phương thức đó. Bạn muốn đạt được điều gì? –
Bạn làm gì trong sharedPart() nếu nó không phụ thuộc vào cũng không làm thay đổi trạng thái của một đối tượng? – Tobias
@ammoQ: Bạn có đề xuất sao chép mã ở cả hai nơi không. Đó là một ý tưởng khủng khiếp. –