2009-08-28 27 views
6

Tôi tự hỏi tại sao Qt sử dụng Q trước mỗi tên lớp thay vì đặt mọi thứ vào một không gian tên. Có lý do cụ thể nào, chẳng hạn như làm cho tên dễ tìm kiếm hay chỉ là về tên thương hiệu?Lý do đằng sau cách đặt tên lớp Qt là gì?

+1

Tôi biết nó là nitpicky, nhưng "hợp lý" nên là "Lý do". –

+1

chỉ ẩn. Cá nhân, với tư cách là một người nói tiếng Anh không phải là người bản ngữ, tôi thích được sửa chữa. Tôi mạnh mẽ thích được sửa chữa hơn là tiếp tục sử dụng một từ hoặc cụm từ bị nhầm lẫn mà không biết. –

+0

@Matthew Talbert Tôi cũng đồng ý với Stefano bạn được chào đón Matthew – yesraaj

Trả lời

7

Tôi tin rằng đó là lịch sử. Không gian tên đã được giới thiệu vào C++ vào khoảng năm 1995. Phát triển Qt bắt đầu vào năm 1991 do đó không gian tên không thể được sử dụng, rõ ràng.

3

Đây có thể là vấn đề về tính di động. Không gian tên không được/không được hỗ trợ bởi mọi trình biên dịch, do đó quy ước đặt tên giúp cắt giảm các cuộc đụng độ đặt tên.

+1

theo mặc định mã được tạo từ Qt Designer sử dụng ui :: namespace ... Tôi nghi ngờ rằng có thể không phải là vấn đề – yesraaj

+0

Yep và Qt _does_ có một không gian tên 'Qt'. Nó chỉ không chứa các lớp, chỉ một số enums. –

2

Qt rất bảo thủ đối với các tính năng ngôn ngữ C++ mà nó sử dụng. Không có không gian tên, exceptions or RTTI. Xem thêm this article chi tiết lý do tại sao các mẫu không được sử dụng trong xử lý tín hiệu/khe.

+1

Mặc dù tôi đồng ý rằng Qt là bảo thủ, liên kết của bạn không có mẫu nào cụ thể cho cơ chế tín hiệu/khe. Qt chắc chắn sử dụng các mẫu trong rất nhiều mã của họ. Các trường hợp ngoại lệ và công cụ RTTI là do được sử dụng trên các thiết bị nhúng, tôi sẽ đặt cược. Nhiều ứng dụng nhúng tránh những ứng dụng mà họ thêm vào. –

+0

Đó là một điểm tốt và chính xác. Sẽ sửa đổi câu trả lời! –

0

Thấy như có không phải là một đơn C++ trái trình biên dịch mà không thực hiện không gian tên, ngày nay chỉ có một lý do: Xây dựng thương hiệu :)

+0

không có trình biên dịch hiện tại. nhưng có rất nhiều người vẫn sử dụng các trình biên dịch cũ hơn, những người sẽ không/không thể nâng cấp lên phiên bản mới nhất. Tôi không nói đó là một tình huống tốt, nhưng đôi khi bạn chỉ bị mắc kẹt với việc sử dụng một trình biên dịch cũ crappy, cho bất kỳ số lý do kỹ thuật/phi kỹ thuật. – Glen

+0

Thậm chí nếu mọi người sử dụng trình biên dịch mới hỗ trợ không gian tên đúng cách (và tôi không đồng ý với tuyên bố của bạn BTW - vẫn có các trình biên dịch hiện tại không hỗ trợ tất cả các sắc thái của không gian tên chính xác), vẫn còn rất nhiều * sử dụng quy ước đặt tên hiện tại. Bạn có mong đợi mọi người thay đổi tất cả mã Qt của họ thành một quy ước đặt tên mới chỉ để sử dụng không gian tên không? – Thomi

+1

@Glen, Thomi: Qt sử dụng không gian tên ngày nay (kể từ 4.0), vì vậy bất kỳ trình biên dịch nào còn lại mà không có hỗ trợ cơ bản ít nhất không còn được hỗ trợ bởi Qt anyway (không thể được hỗ trợ). –

2

Các tài liệu cho Qt đề cập đến namespaces, mặc dù tôi đã không kiểm tra mã để xem chúng có thực sự là C++ namespace hoặc hack với các khai báo công khai bên trong một lớp học hay không. Tôi đoán rằng phần còn lại đang cố gắng để tránh gây ra tất cả mọi người cần phải đổi tên tất cả mọi thứ, mặc dù họ có thể cung cấp một con đường chuyển đổi nếu họ muốn, như vậy:

namespace Qt 
{ 
class Object { ... }; 
} 

#ifndef NO_OLD_DECLS 
typedef Qt::Object QObject; 
#endif 
0

Qt sử dụng một tiền tố Q như một phần của mã hóa của họ Phong cách. Nó thường phục vụ mục đích làm cho nó dễ dàng hơn để đọc mã và phát hiện ra những gì là gì.

Một định danh rằng:

  • được bắt đầu bằng "Q" và với hậu tố "cá nhân" là một lớp riêng được sử dụng để biết chi tiết thi hành và không phải là một phần của API (ví dụ QPainterPrivate)
  • là tiền tố với "Q" và không với hậu tố "cá nhân" là một lớp công chúng (ví dụ QWidget)
  • được bắt đầu bằng "q" (chữ thường) là một chức năng toàn cầu công cộng (ví dụ qRgb)

Việc áp dụng một kiểu mã hóa và sử dụng nó một cách thống nhất giúp người khác dễ hiểu hơn về mã mà họ không viết.

Ref .: Qt Coding Style

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