2009-12-09 37 views
5

Điều gì thường được coi là phong cách mã hóa tốt trong C++ nơi bạn sử dụng các loại từ thư viện chuẩn? Ví dụ: nếu tôi có chỉ thị using namespace std; bạn vẫn muốn thấy các loại thư viện đủ điều kiện như vậy: std::string hoặc có thể chấp nhận chỉ sử dụng string làm định danh loại không?C++ phong cách mã hóa tốt - luôn luôn có đủ loại thư viện đủ điều kiện?

Nếu bạn hoàn toàn đủ điều kiện, bạn có thể mở rộng lý do đằng sau nó không?

+2

Lưu ý rằng 'std :: string' không phải là tên đủ điều kiện,' :: std :: string' hoàn toàn đủ điều kiện, mặt khác . – dalle

Trả lời

14

hoàn toàn đủ điều kiện trong các tệp tiêu đề. nhập không gian tên trong tệp .cpp.

giữ không gian tên toàn cầu khỏi bị lộn xộn bởi một #include đơn giản

+0

Nó cũng ngăn bạn bắt buộc không gian tên trên một người nào đó nếu họ quyết định bao giờ bao gồm tệp tiêu đề của bạn. Nó có thể tạo ra một số nhầm lẫn nếu họ đang tự hỏi "nơi nào trong tên của thần đã làm tôi sử dụng không gian tên đó?" và họ không nghĩ xem mã của người khác mà họ đã đưa vào. –

+2

Tôi sẽ nói tùy ý nhập khẩu không gian tên trong các tệp nguồn, nhưng điểm quan trọng và chính xác ở đây không bao giờ đặt một khai báo "sử dụng không gian tên" trong một tệp tiêu đề. –

13

Tôi muốn sử dụng:

using std::string; 
string whatever; 

hơn mang đầy đủ các không gian tên trong

Trong bất kỳ nhà phát triển thư viện trường hợp nên tránh tên kiểu đó mâu thuẫn với những tiêu chuẩn mặc dù string lẽ là khá phổ biến..

Đối với các thư viện khác với tiêu chuẩn, tôi muốn đủ điều kiện nếu không gian tên lồng không quá dài, nếu nó chỉ được nhập vào tên có ý nghĩa bao gồm tên thư viện hoặc một cái gì đó tương tự.

+2

Toàn bộ điểm của không gian tên là bạn không phải lo lắng về các tên được sử dụng bởi các thư viện khác, ngay cả những cái tiêu chuẩn. –

+4

Chọn tên đã được xác định trong tiêu chuẩn cho thư viện của riêng bạn là một ý tưởng thực sự tồi. Không phải là bất hợp pháp, chỉ là một ý tưởng tồi vì bất cứ ai đọc vector sẽ nghĩ về std :: vector. –

1

Nói chung, tôi sẽ đủ điều kiện cho các không gian tên thay vì sử dụng using namespace x chủ yếu khi tôi xử lý các tệp tiêu đề. Các tệp nguồn có thể không muốn có không gian tên đó được giả định và bạn không nên ép buộc nó trên các tệp nguồn bao gồm tệp tiêu đề của bạn.

Tôi làm cả hai using namespace x và không gian tên đủ điều kiện tùy thuộc vào cuộc gọi phán đoán cá nhân về việc tôi sẽ sử dụng lại nhiều lần hay không trong tệp nguồn.

+0

chết tiệt, đánh tôi đến cú đấm bằng 42 giây – sdellysse

+0

Tôi nghĩ rằng điều này là sai. Bạn KHÔNG BAO GIỜ nên sử dụng x; trong bất kỳ tệp tiêu đề nào. Nếu những người dùng thần thoại này không muốn cung cấp các thư mục sử dụng phù hợp, thì may mắn cho họ. –

+0

@Neil Butterworth: Tôi đồng ý và tôi đã sửa đổi tuyên bố để trở nên mạnh mẽ hơn. –

1

namespace về cơ bản là giới thiệu để giảm thiểu xung đột tên biểu tượng như chức năng, lớp học, và các biến. Bạn chỉ cần sử dụng string hơn std::string trừ khi thư viện của riêng bạn có string trong không gian riêng của nó. Tôi hầu như không sử dụng không gian tên rất phổ biến như std.

0

Câu hỏi hoàn toàn chủ quan: Tôi có thể chấp nhận chỉ sử dụng chuỗi. IDE/trình biên dịch đủ thông minh để tìm ra ý của bạn. Nếu bạn có các đối tượng có cùng tên, ví dụ 2 loại chuỗi. Sau đó, bạn có một vấn đề khác nhau bởi vì trình biên dịch sẽ không biết những gì bạn có nghĩa là và coder sẽ không biết những gì bạn có ý nghĩa.

Lý do khác để không sử dụng tên thư viện là do làm lộn xộn mã: Trong C# system.xml.xmltextreader chỉ là quá mức cần thiết. XmlTextReader là đủ để dưới đứng những gì nó được. Trong trường hợp nó nằm gần như không bao giờ là vấn đề

+0

IDE có thể là "đủ thông minh", nhưng trình biên dịch sẽ không được. –

+0

Tại sao trình biên dịch sẽ không thông minh đến bây giờ chuỗi đó giống như std :: string nếu bạn sử dụng 'using namespace std'. trình biên dịch sẽ không thông minh nếu bạn có nhiều loại có cùng tên, xem dòng thứ hai. – RvdK

1

Tôi có xu hướng tuân theo hai quy tắc:

  • Trong tập tin tiêu đề, bạn muốn vượt qua vòng loại tên loại với đầy đủ các không gian tên và không bao giờ muốn đặt một cái gì đó như using namespace std; vì điều này có thể/sẽ gây ra các sự cố thú vị do xung đột đặt tên không mong muốn mà bạn sẽ cần phải theo dõi lúc 1 giờ sáng.
  • Trong tệp triển khai, tôi có xu hướng kéo các ký hiệu tôi sử dụng từ các không gian tên khác bằng cách sử dụng using std::string; hoặc tương tự.Trên thực tế, tôi không phải là một 100% phù hợp với điều này như tôi thường không kéo trong không gian tên std, nhưng làm kéo trong không gian tên dự án nhưng đó là sở thích cá nhân. Tuy nhiên, chưa bao giờ đặt using namespace somethingorother; ở trên bất kỳ #include nào.
+1

Tôi sử dụng các quy tắc này với một bổ sung: phạm vi cho phép lớn nhất cho mệnh đề "đang sử dụng" trong tệp triển khai là một hàm. – paxos1977

+0

Đó không phải là một ý tưởng tồi; Tôi đã bắt đầu sử dụng nhưng tôi làm cho nó phụ thuộc vào cách sử dụng tổng thể. Ví dụ, bằng cách sử dụng std :: string tại phạm vi chức năng có thể nhận được một chút tẻ nhạt để có xu hướng để có được di chuyển ra phạm vi tập tin để thay thế. –

0

Nói chung, tôi muốn (1) đến sử dụng chỉ thị như using std::string; string hello; như những gì Jimenez đã lưu ý trước đó; (2) tôi cũng sử dụng một ẩn danh namespace, sau đó sử dụng using namespace chỉ nhập khẩu tất cả các tên vào không gian tên vô danh của tôi như thế này namespace { using namespace std; // or using std::string string blah_blah_blah; }

+0

Chỉ vì giá trị của nó, một 'chỉ thị sử dụng' giống như' sử dụng không gian tên x'. Giống như 'using std :: string' là' using declaration'. –

+0

Cảm ơn Jerry, đánh giá cao sự điều chỉnh đó. –

3

Chỉ cần cho những gì nó có giá trị, có một vài điều bạn có thể làm bằng cách kéo một không gian tên bằng chỉ thị sử dụng mà bạn không thể làm theo tên đủ điều kiện. Ví dụ kinh điển có lẽ là viết một hàm sắp xếp chung. Nếu swap đã được xác định cho loại đang được sắp xếp, bạn muốn sử dụng loại đó, nhưng nếu nó không có số swap riêng của mình, bạn muốn sử dụng std::swap.

Để thực hiện điều này, bạn có thể viết mã của bạn như:

using namespace std; 
// ... 
template <class T> 
void my_sort(std::vector<T> &x) { 
    // ... 
    if (x[j] < x[k]) 
     swap(x[j], x[k]); 

Bây giờ, nếu có một swap trong không gian tên của bất cứ loại đã được sắp xếp, nó sẽ được tìm thấy bằng cách lập luận tra cứu phụ thuộc. Nếu không, bạn sẽ tìm thấy std::swap vì bạn đã hiển thị nó với chỉ thị đang sử dụng.

6

Toàn bộ điểm nên tránh nhầm lẫn và tạo mã rõ ràng. Bỏ qua các không gian tên có thể trong một số trường hợp làm xáo trộn nguồn gốc của một hàm hoặc lớp, nhưng việc thêm các không gian tên đầy đủ có thể trở nên không thể chịu nổi.

  • Tránh using namespace trong các tập tin tiêu đề
  • Sử dụng using namespace tại nguồn cho các thư viện "rõ ràng" (ví dụ std, hoặc thư viện để kiểm tra trong một chương trình thử nghiệm)
  • Bạn có thể bí danh không gian tên trong mã nguồn của bạn để giữ nó ngắn và dễ đọc:

Ví dụ

namespace fs = boost::filesystem; 
bool fileExists = fs::exists(fs::path(filePath)); 

CHỈNH SỬA, để hoàn thành: using namespace trong các tệp tiêu đề gây ô nhiễm các tệp nguồn với các không gian tên được nhập theo cách không rõ ràng ('nuf giải thích về điều này đã có trong chuỗi này).

0

Tôi luôn đủ điều kiện trong tiêu đề. Tôi không bao giờ đặt câu "sử dụng ..." vào các tiêu đề.

sở thích của tôi là để đủ điều kiện đầy đủ trong các tập tin thực hiện là tốt, tuy nhiên nếu các tiêu chuẩn tổ chức là để kết hợp "sử dụng ..." phát biểu trong các tập tin thực hiện, tôi sẽ làm như vậy,

0

Nếu bạn không hoàn toàn đủ điều kiện , bạn sẽ gặp rắc rối lớn khi di chuyển các phương thức nội tuyến từ các tiêu đề sang các tệp CPP hoặc ngược lại, và bạn chắc chắn muốn có một kiểu trong các dự án của bạn.

Nếu không, không có vấn đề gì, đôi khi tôi đủ điều kiện bất chấp tuyên bố sử dụng hiện có.Trong tiêu đề, đó là vấn đề, trừ khi phạm vi nằm trong phạm vi:

// somefile.h 
namespace VisionMap 
{ 
    namespace X 
    { 
     using namespace Y; // Does not impact the header's user, 
           // as would if it was in the global scope. 
    } 
} 
Các vấn đề liên quan