8

Một trong những cách phổ biến để tổ chức thư mục dự án là nhiều hơn hoặc ít hơn như thế này:C++ nguồn dự án bố trí đang

 
MyLib 
    +--mylib_class_a.h 
     mylib_class_a.cpp 
     mylib_library_private_helpers.h 
     mylib_library_private_helpers.cpp 

MyApp 
    +--other_class.h 
     other_class.cpp 
     app.cpp 

app.cpp:

#include "other_class.h" 
#include <mylib_class_a.h> // using library MyLib 

Tất cả .h.cpp file cho cùng một thư viện là trong cùng một thư mục. Để tránh va chạm tên, tên tệp thường là tiền tố có tên công ty và/hoặc tên thư viện. MyLib sẽ nằm trong đường dẫn tìm kiếm tiêu đề của MyApp, v.v. Tôi không phải là fan của tên tập tin tiền tố, nhưng tôi thích ý tưởng xem #include và biết chính xác vị trí của tập tin header đó. Tôi không ghét phương pháp tổ chức các tập tin này, nhưng tôi nghĩ rằng nên có một cách tốt hơn.

Vì tôi đang bắt đầu một dự án mới, tôi muốn thu hút một số ý tưởng về tổ chức thư mục. Hiện nay tôi thích cấu trúc này thư mục:

 
ProjA 
    +--include 
      +--ProjA 
        +--mylib 
          +--class_a.h 
        +--app 
          +--other_class.h 
    +--src 
     +--mylib 
       +--class_a.cpp 
        library_private_helpers.h 
        library_private_helpers.cpp 
     +--app 
       +--other_class.cpp 
       app.cpp 
       util.h 

app.cpp:

#include "util.h" // private util.h file 
#include <ProjA/app/other_class.h> // public header file 
#include <ProjA/mylib/class_a.h> // using class_a.h of mylib 
#include <other3rdptylib/class_a.h> // class_a.h of other3rdptylib, no name collision 
#include <class_a.h> // not ProjA/mylib/class_a.h 
#include <ProjA/mylib/library_private_helpers.h> // error can't find .h 

.cpp tập tin và tư nhân (chỉ hiển thị cho thư viện ngay lập tức) .h tập tin được lưu trữ trong thư mục src (src đôi khi được gọi là lib). Các tệp tiêu đề công khai được tổ chức thành cấu trúc thư mục dự án/lib và được bao gồm qua <ProjectName/LibraryName/headerName.h>. Tên tệp không có tiền tố gì cả. Nếu tôi cần gói MyLib để các nhóm khác sử dụng, tôi có thể thay đổi makefile của mình để sao chép các tệp nhị phân thích hợp và toàn bộ thư mục/ProjA.

Sau khi tệp được kiểm tra vào kiểm soát nguồn và mọi người bắt đầu làm việc với chúng, sẽ khó thay đổi cấu trúc thư mục. Nó là tốt hơn để có được nó ngay tại get-go.

Bất kỳ ai có kinh nghiệm tổ chức mã nguồn như thế này? Bất cứ điều gì bạn không thích về nó? Nếu bạn có một cách tốt hơn để làm điều đó, tôi rất muốn nghe về nó.

Trả lời

8

Vâng, tất cả phụ thuộc vào mức độ lớn của các dự án này. Nếu bạn chỉ có một vài tập tin, sau đó whack tất cả trong một thư mục.

Quá nhiều thư mục khi bạn không có nhiều tệp để quản lý theo ý kiến ​​của tôi là quá mức cần thiết. Nó được đào bới khó chịu trong và ngoài các thư mục khi bạn chỉ có một vài tập tin trong đó.

Ngoài ra, tùy thuộc vào ai đang sử dụng nội dung này. Nếu bạn đang viết một thư viện và nó sẽ được sử dụng bởi các lập trình viên khác, thì tốt nhất là sắp xếp các tiêu đề mà họ muốn sử dụng vào một thư mục bao gồm. Nếu bạn đang tạo một số thư viện và xuất bản tất cả, thì cấu trúc của bạn có thể hoạt động. Nhưng, nếu chúng là thư viện độc lập, và sự phát triển không được thực hiện cùng nhau và chúng được phiên bản và phát hành vào những thời điểm khác nhau, bạn nên gắn bó với việc có tất cả các tệp cho một dự án có thể định vị trong một thư mục.

Thực tế, tôi sẽ nói mọi thứ trong một thư mục, cho đến khi bạn tìm thấy nó không thể quản lý, sau đó sắp xếp lại thành một lược đồ thông minh để chia nguồn thành các thư mục như bạn đã làm. Có thể bạn sẽ biết cách nó cần được tổ chức từ những vấn đề bạn gặp phải.

KISS luôn là giải pháp trong lập trình -> giữ mọi thứ đơn giản nhất có thể.

+1

Tôi đồng ý rằng nó sẽ quá mức cần thiết ngay từ đầu. Mối quan tâm của tôi là khi dự án đi, và tăng trưởng đến một kích thước khá, không ai sẽ muốn dành thời gian để tổ chức lại tất cả các tập tin và thay đổi tất cả các đường dẫn bao gồm. –

+4

Vâng, điều đó có thể đúng. Nhưng, bạn có vẻ muốn giữ mọi thứ theo thứ tự, vì vậy bạn có thể làm được! Tôi làm việc trong một công ty với khoảng 60 nhà phát triển được chia thành các nhóm. Một vài tuần trước, một số nhóm đã dành một vài ngày để sắp xếp lại các tệp của họ. Giữ cho mọi thứ được tổ chức là một quá trình liên tục .. một mã lập trình viên tái lập trình tốt khi nó được ra khỏi bàn tay, ví dụ như khi một tập tin mã quá lớn mà nó được khôn lanh để quản lý, họ nên chia nó. Nó chỉ giống với một thư mục của các tập tin. –

+1

Những đội này không bao giờ có thể dự đoán cách đây 3 năm về cấu trúc mà họ cần bây giờ. Nếu họ đã cố gắng để đoán sau đó, tôi nghĩ rằng họ đã có thể đã kết thúc cần phải tổ chức lại anyway. Vì vậy, tôi không nên lo lắng về nó. Nếu bạn đang cố gắng phát triển một thực hành tốt khi bắt đầu một dự án, bạn nên dành thời gian của mình để tìm ra cách để tổ chức kiểm tra đơn vị mã và cách để chạy thử nghiệm như một phần của một bản dựng tự động ... bởi vì việc kiểm tra đơn vị chắc chắn là thứ khó có thể giới thiệu khi bạn đang tiến hành. –

3

Tôi đã thử cả hai phương pháp. Cá nhân, tôi thích cái đầu tiên tốt hơn. Tôi hiểu sự thôi thúc để đưa mọi thứ vào các thư mục cụ thể hơn, nhưng nó gây ra rất nhiều biến chứng quá mức.

Tôi thường sử dụng quy tắc này: các ứng dụng và thư viện nội bộ sử dụng phương pháp đầu tiên. Các thư viện mã nguồn mở công khai sử dụng phương thức thứ hai. Khi bạn phát hành mã, nó sẽ giúp ích rất nhiều nếu các tệp bao gồm nằm trong một thư mục riêng biệt.

4

Tại sao không làm một cái gì đó như là người đầu tiên, chỉ sử dụng các thư mục đó MyLib cư trú tại như một phần của bao gồm chỉ thị, giúp giảm prefixing ngớ ngẩn:

#include <MyLib/ClassA.h> 

Điều đó nói với bạn nơi họ đến từ. Đối với sự lựa chọn thứ hai, cá nhân tôi nhận được thực sự khó chịu khi tôi có một tiêu đề hoặc tập tin nguồn mở, và phải di chuyển xung quanh thông qua cấu trúc thư mục để tìm khác và mở nó. Với ví dụ thứ hai của bạn, nếu bạn có src/mylib/class_a.cpp mở và muốn chỉnh sửa tiêu đề, trong nhiều trình chỉnh sửa, bạn phải quay lại hai cấp độ, sau đó nhập vào include/ProjA trước khi tìm tiêu đề. Và làm thế nào chúng ta biết rằng tiêu đề nằm trong thư mục con ProjA mà không có một số đầu mối bên ngoài khác? Ngoài ra, quá dễ dàng cho một tệp hoặc một tệp khác để được chuyển sang một nơi khác "tốt hơn" đại diện cho cách nó được sử dụng, không có tệp thay thế nào được di chuyển. Nó chỉ cho tôi đau đầu khi tôi gặp nó trong công việc của tôi (và chúng tôi có một số phần của codebase của chúng tôi, nơi mọi người đã làm mọi vấn đề tiềm năng tôi vừa đề cập).

+0

Vâng, điều hướng thư mục sẽ là một khó chịu lớn. Nhưng một trình soạn thảo/IDE tốt sẽ giúp ích. gf trong VIM hoặc Ctrl-Shift-G trong Visual Studio sẽ mở tệp tiêu đề cho bạn. Tôi biết một số nhà phát triển chỉ cần liên kết tất cả các tệp mà họ quan tâm vào cấu trúc thư mục của riêng họ. –

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