(Tôi chưa đọc Mã sạch và không biết nhiều về Java.)
Liệu nó có ý nghĩa để áp dụng ý tưởng tạo ra nhiều thực thể nhỏ, mỗi thực thể có trách nhiệm được xác định rõ ràng, cho các không gian tên?
Vâng, giống như nó làm với tái cấu trúc thành nhiều lớp và nhiều hàm.
Một nhóm nhỏ các lớp liên quan có nên luôn được bọc trong một không gian tên?
Không thực sự trả lời: có, ít nhất bạn nên sử dụng một không gian tên cấp cao nhất. Điều này có thể dựa trên dự án, tổ chức hoặc bất cứ điều gì bạn thích, nhưng sử dụng một vài tên toàn cầu sẽ làm giảm xung đột tên. Một không gian tên duy nhất để nhóm mọi thứ khác theo nó chỉ giới thiệu một tên toàn cầu. (Ngoại trừ các chức năng "C" bên ngoài, nhưng đó là do khả năng tương tác của C và chỉ ảnh hưởng đến các chức năng "C" bên ngoài khác.)
Một nhóm nhỏ các lớp liên quan có nên được bọc trong một không gian tên dành riêng cho chúng không? Có lẽ. Đặc biệt nếu bạn thấy mình sử dụng tiền tố phổ biến trên các lớp đó - FrobberThing, FrobberThang, FrobberDoohickey - bạn nên xem xét một không gian tên - frobber :: Thing, v.v. Điều này vẫn sẽ nằm trong không gian tên gốc của bạn hoặc không gian tên khác nếu chúng là một phần của dự án lớn hơn.
Đây có phải là cách để quản lý sự phức tạp của việc có nhiều lớp nhỏ, hoặc chi phí quản lý nhiều không gian tên sẽ bị cấm?
Lấy ví dụ ở trên về các tên tiền tố, việc quản lý frobber :: Thing so với FrobberThing không khó hơn. Nó thậm chí có thể dễ dàng hơn với một số công cụ, chẳng hạn như hoàn thành tài liệu và mã. Có một sự khác biệt với ADL, nhưng điều này có thể có lợi cho bạn: ít tên hơn trong các không gian tên được liên kết làm cho ADL đơn giản hơn để tìm ra và bạn có thể sử dụng khai báo để tiêm tên cụ thể vào không gian tên này hoặc không gian tên khác.
Các bí danh không gian tên cho phép bạn sử dụng một tên ngắn hơn cho một không gian tên dài hơn trong một ngữ cảnh cụ thể, một lần nữa cho phép sử dụng dễ dàng hơn:
void f() {
namespace CWVLN = Company_with_very_long_name; // Example from the standard.
// In this scope, use CWVLN::name instead of Company_with_very_long_name::name.
namespace fs = boost::filesystem; // Commonly used.
}
Hãy xem xét Boost, có một không gian tên gốc duy nhất, boost, và sau đó là nhiều tên con - boost :: asio, boost :: io, boost :: filesystem, boost :: tuples, v.v. - cho các thư viện khác nhau. Một số tên được "thăng cấp" vào không gian tên gốc:
Tất cả các định nghĩa đều nằm trong không gian tên :: boost :: tuples, nhưng các tên phổ biến nhất được nâng lên không gian tên :: boost bằng cách sử dụng khai báo. Những tên này là: tuple, make_tuple, tie và get. Hơn nữa, ref và cref được định nghĩa trực tiếp trong không gian tên :: boost.
Sự khác biệt lớn nhất so với các ngôn ngữ với các mô-đun "thực" là mức độ phổ biến của việc sử dụng cấu trúc phẳng hơn, điều này chủ yếu xảy ra bởi vì đó là cách nó hoạt động trừ khi bạn mất thêm nỗ lực cụ thể để xác định tên lồng nhau.