2012-06-07 32 views
14

Giả sử tôi đã tuyên bố một chức năng (hoặc lớp học, không quan trọng) trong một tập tin tiêu đề, mà là một phần của không gian tên foo:Thực tiễn tốt nhất: sử dụng không gian tên hoặc không gian mở lại?

namespace foo 
{ 
    void bar(); 
    … 
} 

Trong một thời gian dài tôi đã mở lại namespace khi tôi đã xác định hàm trong tệp cpp:

namespace foo 
{ 
void bar() 
{ 
    doSomething(); 
    … 
} 
} 

Đó là vì tôi đã học theo cách này và được sử dụng trong dự án mà tôi đang làm. Tôi chưa bao giờ thực sự nghĩ về nó cho đến gần đây, khi tôi tình cờ gặp một dự án sử dụng chỉ thị sử dụng thay thế:

using namespace foo; 

void bar() 
{ 
    doSomething(); 
    … 
} 

Cuối cùng có tùy chọn sử dụng tên đầy đủ. Tôi thấy nó khá tẻ nhạt, đặc biệt là khi các lớp học với rất nhiều thành viên có liên quan. Theo tôi, nó không có ý nghĩa nhiều khi tất cả nội dung của tập tin là một phần của một không gian tên.

void foo::bar() 
{ 
    doSomething(); 
    … 
} 

Vì vậy, câu hỏi của tôi là câu hỏi nào nên được ưa thích và tại sao? Đặc biệt là liên quan đến hai lựa chọn đầu tiên (sử dụng không gian tên so với không gian mở).

+3

Tôi cho rằng đó là vấn đề sở thích cá nhân.Bản thân tôi sử dụng kết hợp cả hai lựa chọn đầu tiên và cuối cùng của lựa chọn thay thế của bạn. –

+5

Tôi đồng ý rằng đó là vấn đề sở thích cá nhân. 'foo :: bar' là lặp đi lặp lại nhưng greppable, mặc dù điều đó có thể không liên quan nếu mọi người chỉ tìm kiếm nguồn của bạn bằng IDE. –

+2

Nó giống như hỏi xem nó tốt hơn để sử dụng các tab hoặc 4 không gian. ** Đừng đổ mồ hôi những thứ nhỏ. ** :) – LihO

Trả lời

13

Tôi nghĩ rằng cách sạch được mở lại namespace, và tôi đã có những lập luận để hỗ trợ nó:

  • với tùy chọn thứ hai của bạn, với các chỉ thị using, nó không phải là rõ ràng rằng bạn đang triển khai một phương thức trong không gian tên đó. Bạn cũng có thể thực hiện một chức năng miễn phí sử dụng một cái gì đó từ không gian tên.
  • tùy chọn thứ ba thường được sử dụng để triển khai các hàm thành viên của lớp. Nếu bạn nhìn trực tiếp trong tệp cpp, không rõ là bạn đang triển khai hàm từ không gian tên trừ khi bạn biết không gian tên đó tồn tại. Điều đầu tiên xuất hiện trong đầu bạn là bạn đang thực hiện một hàm thành viên của lớp.
  • mục đầu tiên là rõ ràng nhất. Bạn mở không gian tên và xác định một hàm bên trong nó. Hàm này là một phần của không gian tên, và đây là việc thực hiện.
+0

Điểm đạn thứ hai của bạn dường như nói, "Tôi không làm X, do đó điều đầu tiên bạn nghĩ đến là Y". Y không nhất thiết phải đến trước tâm trí của những người làm X, vì vậy một khi bạn làm theo quy ước thì vấn đề sẽ biến mất. Ngoài ra, nếu bạn không thể nói sự khác biệt giữa tên không gian tên và tên lớp, hãy cân nhắc chọn tên tốt hơn ;-p. –

+0

@SteveJessop Tôi không nghĩ đó là điểm hợp lệ. 'X :: foo()' là cách * duy nhất * bạn có thể định nghĩa một phương thức lớp (trừ khi nội tuyến). Trong khi đó đối với không gian tên bạn có một thay thế. Vậy tại sao lại sử dụng hai kiểu để biểu diễn những thứ khác nhau, khi bạn có thể sử dụng các kiểu khác nhau với mục đích rõ ràng? –

+1

có vẻ như là một tiên đề cơ bản ở đây, rằng nó là cực kỳ quan trọng để làm cho những thứ khác nhau trông khác nhau càng tốt. Tôi nghĩ rằng những thứ khác có thể quan trọng hơn, vì vậy tôi không chấp nhận tiên đề đó (nếu tôi đã sử dụng C, vì nó không có quá tải hàm). –

6

Mặc dù using namespace là giải pháp lười biếng nhất (và do đó hấp dẫn nhất), thường không phải là một ý tưởng hay. Bên cạnh những gì Luchian nói về các khai báo hàm là mơ hồ (ai đó mới tham gia dự án sẽ không biết nếu đó là hàm độc lập hay một trong không gian tên), và thực tế là bạn có thể giới thiệu một tên trong không gian tên sau đó, sử dụng ngay bây giờ, tôi có một lý do khác tại sao tôi đề nghị sử dụng phương pháp thứ ba.

Sử dụng phương pháp thứ ba, bạn cung cấp mã của mình nhiều hơn tính nhất quán. Nếu A nằm trong số B, bạn sẽ luôn xác định nó bằng A::B. Nếu A là một lớp và B một hàm trong lớp, bạn sẽ viết type A::B(args). Nếu A là một lớp và B thành viên tĩnh, bạn sẽ viết lại type A::B = value. Bây giờ A là một không gian tên, nhưng nó vẫn là khái niệm tương tự: B được định nghĩa bên trong A, do đó nó phù hợp hơn để sử dụng lại A::B.

(Có thêm tiền thưởng cho khả năng tìm kiếm nếu trình chỉnh sửa của bạn chẳng hạn như ViM)

Các vấn đề liên quan