2012-07-05 46 views
19

Khi sử dụng các vùng tên lồng nhau đôi khi tên đủ điều kiện kết thúc là khá dài. Tôi biết tôi có thể sử dụng namespace abc = aaa::bbb::ccc để giảm số lượng nhập (nó cũng có thể cải thiện khả năng đọc trong một số trường hợp).Cách tiếp cận nhất quán để đổi tên các không gian tên trong C++

Tôi không chắc chắn, cách tốt nhất để đạt được việc đổi tên này trên tất cả các tệp trong một dự án là gì. Cách tiếp cận đơn giản (tức là, để đổi tên các không gian tên dài trong một cơ sở cho mỗi lần sử dụng) có thể dẫn đến việc sử dụng các tên viết tắt khác nhau cho cùng một tên đủ điều kiện trong các tệp khác nhau. Vì vậy, tôi đã nghĩ đến một cách nhất quán hơn để làm điều này.

Ví dụ, chúng ta hãy giả định một cái gì đó như:

project 
    |- client 
    | |- core 
    | |- plugin 
    | |- util 
    |- server 
     ... 

Tôi đã suy nghĩ để tạo ra một tiêu đề cho mỗi thư mục bao gồm tên giảm. Ví dụ: project/client/core/core.h sẽ chứa namespace pr_cl_core = project::client::core (Tôi biết ví dụ về tên ngắn này là khá kém, nhưng trong các dự án thực tế chúng có ý nghĩa hơn). Sau đó, tôi sẽ bao gồm core.h vào tất cả các tệp tiêu đề trong project/client/core để khi một tiêu đề từ thư mục đó được đưa vào, giả sử, project/client/plugin/plugin_foo.h, các phiên bản không gian tên ngắn sẵn có.

Đây có phải là cách tiếp cận tốt để làm như vậy không? Có cách nào khác tốt hơn không?

Tôi đã tìm thấy một số câu hỏi về không gian tên C++ trên SO (ví dụ: 12), nhưng không có câu hỏi nào liên quan đến cách giải quyết đổi tên không gian tên theo cách toàn dự án.

EDIT: Ngoài ra, cơ chế như vậy có thể được sử dụng để đổi tên một cách có hệ thống các không gian tên dài (chẳng hạn như không gian tên của Boost) cho toàn bộ dự án. Ví dụ: tôi thường đổi tên một số không gian tên như:

namespace ip = boost::asio::ip; 
namespace ptime = boost::posix_time; 

Hiện tại tôi làm điều này trên cơ sở từng đơn vị dịch, nhưng tôi muốn làm điều đó bằng cách tiếp cận toàn cầu cho toàn bộ dự án.

+0

Bạn có thể làm điều đó hoặc bạn có thể làm điều đó đơn giản hơn: Có tiêu đề ở cấp cao nhất khai báo nguyên mẫu cho tất cả các không gian tên và bí danh. Sau đó, chỉ cần bao gồm trong các subdirs. – Linuxios

+0

@Linuxios Tôi cũng đang suy nghĩ như thế, nhưng thay vào đó có thể sẽ giới thiệu rất nhiều phụ thuộc: nếu tôi thay đổi tập tin chung đó, hầu như tất cả các tệp trong dự án sẽ cần được biên dịch lại. Điều đó đang được nói, nếu cấu trúc của không gian tên không thay đổi quá nhiều, nó không phải là một vấn đề lớn. – betabandido

+0

@betabendido: Ah. Điều gì về giải pháp nhanh chóng và bẩn? Macro tiền xử lý! Chỉ cần khai báo chúng trong mỗi tệp cho bí danh của nó. Bằng cách đó, mỗi tệp có thể có bí danh riêng. Có, mọi người wil hét lên vì sao chép mã, nhưng bạn luôn có thể thêm tập lệnh thời gian xây dựng để làm điều đó cho bạn ... – Linuxios

Trả lời

1

Tôi cho rằng nếu bạn liên tục phải nhập tên không gian tên dài, thì có điều gì đó sai trong hệ thống phân cấp không gian tên của bạn.

Giả sử bạn sẽ giống nhau với các lớp học, liên tục tìm thấy chính mình khi nhập obj->sub()->subsub()->some_method(). Điều này sẽ vi phạm Law of Demeter. Trong trường hợp các lớp, bạn sẽ cấu trúc lại mã của bạn (bằng cách viết các hàm bao bọc) để các lớp trong hệ thống phân cấp chỉ phải truy cập các phương thức một cấp.

Điều tương tự phải được thực hiện với không gian tên: nếu bạn phải gọi project::client::core thì bạn nên viết hàm/lớp bao bọc trong client để hiển thị các giao diện cần thiết cho project. Nếu bạn cần phải làm điều này trên tất cả các nơi, tại sao không san bằng cấu trúc không gian tên của bạn để clientcore là cùng cấp?

Thực tế là Boost sử dụng vùng tên lồng nhau chỉ đúng một phần, vì hầu hết các không gian tên lồng nhau như auxdetail không được gọi là khách hàng. Ví dụ. Boost.MPL là một ví dụ thực sự tốt về một thư viện cẩn thận không để lộ các không gian tên lồng nhau một cách vô cớ.

+0

Giả sử tôi quyết định làm phẳng không gian tên, vì vậy tôi loại bỏ vấn đề đó. Làm cách nào để giải quyết vấn đề về các không gian tên dài từ Boost? Tôi muốn tránh gõ 'boost :: asio :: ip :: tcp :: socket' (hoặc những thứ tương tự). – betabandido

+0

@betabandido Boost.Asio thực sự có đặt tên không gian tên quá dài. Bạn có thể ít nhất cố gắng tách biệt một số điều đó với các bí danh: 'namespace asio = boost :: asio;' và trong mã mức thấp sử dụng các cổng TCP/IP bạn có thể thực hiện 'namespace socket = bost: asio :: ip :: tcp :: socket; 'ví dụ – TemplateRex

+0

Đó thực sự là những gì tôi đang làm ngay bây giờ.Nhưng câu hỏi của tôi là làm thế nào để làm điều đó đổi tên một cách có hệ thống trên tất cả các tập tin nguồn trong một dự án. Ít nhất có hai lợi thế tiềm năng khi thực hiện điều đó một cách có hệ thống: 1) giảm số lượng đánh máy (đặc biệt nếu có nhiều lần đổi tên) và 2) đổi tên nhất quán trên toàn bộ dự án. – betabandido

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