2010-11-21 11 views
10

Tôi đang đi vào C++ từ Java/AS3-land, và tôi đang sử dụng cấu trúc gói-cum-thư mục cho các lớp của tôi. và tôi thích nó.Cấu trúc src/thư mục trong C++?

tôi hiểu những điều cơ bản về không gian tên trong c + + và tôi rất vui khi để nó ở cơ bản. nhưng, khi dự án của tôi trở nên phức tạp hơn, tôi muốn giữ cấu trúc thư mục của mình được tổ chức theo cách mà tôi có thể giữ trong đầu mình. tức là một cái gì đó tương tự như Java/AS3.

1) là có bất kỳ lý do gì để không có một cấu trúc thư mục như:

src/ 
model/ 
view/ 
controller/ 

có thể với các thư mục con? (đây chỉ là một ví dụ MVC, cấu trúc thư mục có thể là bất cứ điều gì tùy thuộc vào nhu cầu của dự án.) nó chỉ có vẻ không hợp lệ để có một src/thư mục với một đống lớn các tập tin tiêu đề và nguồn bên trong.

2) nếu câu trả lời cho 1) có thể là "đi trước và làm những gì bạn muốn", nó sẽ không khôn ngoan/không cần thiết để tạo không gian tên cho mỗi thư mục, tương tự như cách tạo gói cho mỗi gói Java/AS3 thư mục? sự hiểu biết của tôi là không gian tên thường không được sử dụng như thế này, lồng nhau sâu và liên quan đến thư mục.

Trả lời

6

Tôi luôn thích không gian tên cho mỗi thư mục. Chủ yếu là vì khi tôi phải duy trì mã của người khác, không gian tên giúp tôi tìm ra nơi lớp được định nghĩa ban đầu.

Các tệp tiêu đề có tên cũng có thể trợ giúp với điều này. Tôi cũng sẽ không đề nghị đi hơn 2-3 không gian tên, vì thế nó trở nên đáng ghét. Bạn sẽ thấy mình sử dụng "using namespace blah;" rất nhiều mà tôi luôn luôn tìm thấy là một lá cờ đỏ cho mã C++. Và bạn không thể sử dụng "sử dụng không gian tên" bên trong một tập tin tiêu đề mà không có một số vấn đề nghiêm trọng xảy ra.

Đó là tất cả tùy chọn hoàn toàn mặc dù trong C++.

+0

yeah, tôi đã đọc rằng 'sử dụng không gian tên' là một chút của một mùi mã xấu, và thậm chí phần nào làm mất hiệu lực điểm của không gian tên ở nơi đầu tiên. – ericsoco

0

Không có lý do gì để không và sẽ thực sự giúp mọi người đọc mã của bạn. Một số điều cần lưu ý:

  1. Không trên -nội dung mới nhất, điều này có thể gây nhầm lẫn cho người đọc mã của bạn.
  2. Nhất quán trong việc tổ chức mã của bạn, ví dụ: không đặt bất kỳ mã nào trong số chế độ xem trong thư mục con của trình điều khiển hoặc ngược lại.
  3. Giữ nguyên bố cục.
0

Bạn có thể sắp xếp tệp của mình theo bất kỳ cách nào bạn thích; bạn sẽ chỉ cần điều chỉnh các công cụ xây dựng của bạn bao gồm đường dẫn và đường dẫn nguồn để khớp.

Cho mỗi thư mục không gian tên của chính nó là quá mức cần thiết và có thể là một ý tưởng tồi, vì nó sẽ làm cho mã khó hiểu. Tôi muốn giới thiệu một không gian tên cho mỗi dự án nhiều nhất, hoặc thậm chí chỉ một không gian tên cho mỗi công ty (vì có lẽ trong công ty của bạn, bạn có khả năng đổi tên mọi thứ nếu cần thiết để giải quyết xung đột tên) Mục đích chính của không gian tên là xử lý trường hợp hai codebases dưới sự kiểm soát của hai tổ chức khác nhau, cả hai đều sử dụng cùng một tên, và bạn là một bên thứ ba muốn sử dụng chúng cả trong cùng một dự án, nhưng không có khả năng sửa đổi hoặc là codebase).

6

Bạn có thể muốn xem qua John Lakos Large-Scale C++ Software Design. Về cơ bản, bạn có thể làm điều đó, nhưng các gói của bạn nên (như trong Java) có biểu đồ phụ thuộc tuần hoàn. Ngoài ra, nó có thể là thuận lợi cho mỗi gói vào tài liệu mà tiêu đề được xuất khẩu và không, có lẽ như vậy:

src/ 
|- package1/ 
    |- exported_symbols_1.hh 
    |- exported_symbols_2.hh 
    |- src/ 
     |- impl_1.hh 
     |- impl_1.cc 
|- package2/ 
    |- sub_package_2_1/ 
     |- exported.hh 
     |- src/ 
       ... 
     |- src/ 
      ... 

Mỗi gói chỉ được phép #include tiêu đề cấp cao nhất của gói khác, không bao giờ những cái trong số src/ thư mục.

Ngoài ra, khi bạn muốn sử dụng Autotools trong một dự án lớn và có ý định phân phối tiêu đề, nó có thể chứng minh được thận trọng để gọi thư mục cấp cao nhất không src/ nhưng do PACKAGE_TARNAME của dự án đó. Điều này làm cho cài đặt tiêu đề với sự giúp đỡ của Autotools dễ dàng hơn.

(Và, tất nhiên, tên tập tin thực tế không nhìn như ngớ ngẩn như minh họa ở trên.)

+0

phản hồi kỹ lưỡng, cảm ơn. thực sự là một chút trên đầu của tôi cho bây giờ. nhưng liên quan đến phụ thuộc vào chu kỳ, tôi googled trên trang này trong khi tìm kiếm câu trả lời cho câu hỏi này trước khi đăng bài ở đây: http://www.gamedev.net/reference/programming/features/orgfiles. – ericsoco

+0

tệp .hh/.cc là gì? một loại thư mục/bảng mục lục? – ericsoco

+0

Xin lỗi vì sự nhầm lẫn. Tôi thuộc về những kẻ nghĩ rằng, vì một tiêu đề C++ không thể được phân tích bằng trình biên dịch C, nên nó không được đặt tên giống như nó là một tiêu đề C. Vì vậy, đối với tôi, * .hh chỉ đơn giản là tiêu đề chỉ có nghĩa là cho một trình biên dịch C++ (những người khác sử dụng * .h, * .hxx, * .H, ...). Tương tự, một tệp * .cc được cho là được biên dịch bởi trình biên dịch C++ (những người khác sử dụng * .cpp, * .cxx, * .C, ...). – dennycrane

1

Các src/là một nơi phổ biến có c/C++ lập trình viên đưa nguồn của họ trong thư mục gốc của dự án. Ví dụ:

doc/ <- documentation 
libs/ <- additional libraries 
po/  <- gettext translations 
src/ <- sources 

nó phổ biến để tạo các thư mục con bên dưới src/nếu bạn đã có rất nhiều các tập tin nguồn nhưng không có những hạn chế như thế nào để tổ chức Hạ tầng cơ sở này.

Hãy nhớ rằng cấu trúc thư mục hoàn toàn tùy chọn trong C++. Đó không phải là kết nối giữa các không gian tên C++ và cấu trúc thư mục.

+0

điều này hữu ích, cảm ơn; nhưng tôi yêu cầu cụ thể về src/thư mục. – ericsoco

+0

ví dụ: dự án tăng cường (http://boost.org) sử dụng lược đồ thư mục này: các tệp nguồn/tiêu đề chính được đặt trong thư mục src /. các tệp có triển khai thực tế được đặt trong src/detail /. có thể có các thư mục cụ thể khác bên dưới src/detail /. – joke

1

Không có lý do gì để không phân chia mã nguồn của bạn thành các thư mục khác nhau; nó có ý nghĩa nếu có nhiều tập tin và nhóm hợp lý rõ ràng. Tuy nhiên, không nhất thiết phải tạo một tệp riêng biệt cho từng lớp nhỏ - trong các dự án lớn, có xu hướng làm chậm biên dịch (vì các tệp triển khai thường phải bao gồm nhiều tiêu đề giống nhau để biên dịch vài dòng của chúng).).

Cũng như việc sử dụng không gian tên cho phản ánh sự phân chia hợp lý trong các mã, các ngưỡng chính xác tại đó mã này được chia thành các namespace tiếp tục có xu hướng được điều khiển bởi một số lực lượng khác, ví dụ:

  • yếu tố gợi ý sử dụng nhiều không gian tên
    • mã rất dễ bay hơi (thường thay đổi nội dung, liên tục bổ sung/thay đổi sử dụng nhận dạng, thường ngắn và/hoặc từ thông dụng) hơn
    • phát triển
  • yếu tố làm giảm nhu cầu đối với không gian tên
    • phối hợp chặt chẽ bởi một cơ quan Trung ương
    • phiên bản chính thức dự kiến ​​với kiểm tra kỹ lưỡng cho cuộc xung đột

Namespaces cũng có thể được sử dụng như là một cách để cho phép dễ dàng chuyển đổi giữa các triển khai thay thế (ví dụ các phiên bản khác nhau của giao thức, chức năng hỗ trợ luồng an toàn so với không an toàn, triển khai dành riêng cho hệ điều hành), vì vậy đôi khi việc cung cấp các nhu cầu đó liên quan đến việc sử dụng các không gian tên riêng biệt.Nó chắc chắn có thể khó khăn trong việc tìm kiếm các biến không mong muốn và/hoặc không gian tên lồng nhau để đạt được các biến mà bạn muốn, và "sử dụng không gian tên" sẽ kém hiệu quả hơn nếu bạn cần sử dụng một số định nghĩa cùng một mã định danh nhưng có thể phù hợp với nhiều mã phương thức có xu hướng sử dụng một hoặc nhiều không gian tên khác nhiều hơn tại một thời điểm.

Vì vậy, bạn có thể muốn xem xét các yếu tố này khi quyết định có nên đặt mã của từng thư mục (hoặc một số nhóm khác biệt về mặt logic) vào các không gian tên riêng biệt hay không.