2010-05-27 21 views
40

Câu hỏi này liên quan đến phát triển C++ kiểu Unix/Linux. Tôi thấy rằng nhiều thư viện C++ lưu trữ các tệp tiêu đề của chúng trong thư mục "bao gồm" và tệp nguồn trong thư mục "src". Vì lợi ích của sự phù hợp, tôi đã áp dụng điều này trong mã của riêng tôi. Nhưng nó không phải là rõ ràng với tôi cho dù điều này nên được thực hiện cho ứng dụng mã là tốt. Tôi đã nhìn thấy một vài trường hợp mà một cấu trúc thư mục phẳng được sử dụng cho điều đó. Cách tiếp cận được khuyến nghị là gì?Các thư mục "bao gồm" và "src" riêng biệt cho mã cấp ứng dụng?

Trả lời

37

Tôi cũng tách riêng chúng, nhưng không hoàn toàn trên tiện ích, nhưng trên truy cập của tệp.

Giả sử bạn có mô-đun quản lý thông tin khách hàng và sử dụng 2 lớp để thực hiện việc này: Khách hàng, CustomerValidityChecker. Cũng giả sử rằng các phần khác trong ứng dụng của bạn chỉ cần biết về lớp Khách hàng và rằng CustomerValidityChecker chỉ được lớp Khách hàng sử dụng để thực hiện một số kiểm tra. Dựa trên những giả định tôi lưu trữ các tập tin như thế này:

thư mục công cộng (hoặc bao gồm các thư mục):

  • customer.h

tin thư mục (hoặc thư mục nguồn):

  • customer.cpp
  • customervaliditychecker.h
  • customervaliditychecker.cpp

Bằng cách đó, nó trở nên rõ ràng ngay lập tức cho người gọi của mô-đun của bạn phần nào có thể truy cập (công cộng) và phần nào thì không.

+0

1, tôi sử dụng cùng một tách trong công việc. Khi bạn tương tác hàng ngày với ít nhất một tá thành phần, có ích khi chúng không làm tắc nghẽn các tệp API với những tệp bạn không quan tâm. –

+0

Tôi cũng tự hỏi nếu nó ảnh hưởng đến thời gian xây dựng một mức độ nhỏ. Ví dụ: trong Thư viện Bổ sung của Visual Studio, có một thư mục kích thước nhỏ hơn bao gồm nói chung làm cho mọi thứ hơi hơn một thư mục có nhiều tệp tiêu đề khác không được đưa vào bên ngoài thư viện? – jxramos

1

Không có lợi thế rõ ràng nào trong chế độ xem của tôi. Cuối cùng, tôi đã quyết định giữ các tệp chương trình và tiêu đề cùng nhau vì trình chỉnh sửa của tôi (Visual SlickEdit) xảy ra để cung cấp các tính năng tham chiếu bổ sung khi chúng không được tách riêng.

+0

Vui làm cách nào một công cụ có thể ảnh hưởng đến nhiều khía cạnh của một dự án. Tôi đồng ý rằng việc tổ chức mã theo cách tương thích với IDE thường là một ý tưởng hay. – StackedCrooked

2

Tôi không làm điều này; có vẻ ít lợi thế trong đó. Vì các tiêu đề có xu hướng có phần mở rộng khác với các tệp nguồn, bạn có thể cho trình soạn thảo của bạn hiển thị chúng một cách riêng biệt nếu bạn thực sự cảm thấy cần - Visual Studio thực hiện điều này theo mặc định, nhưng tôi vô hiệu hóa nó vì tôi muốn nhìn thấy chúng cùng nhau

+1

Có một lợi thế rõ ràng cho khách hàng của thư viện: họ chỉ cần biết về một thư mục bao gồm; điều này làm giảm chi phí bảo trì của họ và giảm nguy cơ va chạm tên tiêu đề ... Các nhà triển khai cũng được hưởng lợi; họ có thể thay đổi cách bố trí thư mục src của họ mà không phải lo lắng về việc phá vỡ các ứng dụng thư viện. –

2

I hầu như luôn tạo các thư mục include và src để phân chia mã nguồn của tôi. Tôi nghĩ rằng nó làm cho các thư mục ít lộn xộn và các tập tin được dễ dàng hơn để tìm thấy trong IDE của tôi. Nhưng tôi nghĩ đây chỉ là vấn đề về hương vị.

Hoặc là phương pháp hợp lệ. Nó phụ thuộc vào phong cách mã hóa bạn muốn làm theo cách bạn làm điều này.

+0

Động lực của tôi là tương tự ở chỗ tôi không thích sự lộn xộn. – StackedCrooked

4

Rất nhiều phụ thuộc vào kích thước của dự án có liên quan. Lên đến một vài chục tập tin hoặc như vậy, giữ chúng trong một thư mục có xu hướng thuận tiện hơn. Đối với một ứng dụng lớn hơn bao gồm hàng trăm hoặc hàng ngàn tệp, bạn bắt đầu tìm cách tách chúng (mặc dù trong các dự án tôi đã làm việc, nó được thực hiện nhiều hơn trên các dòng chức năng hơn src/include). Giữa những người đó, nó có thể mở cửa cho câu hỏi.

+0

Vâng, đó là khi số lượng tệp lớn lên mà tôi bắt đầu muốn có thêm tổ chức. Thật buồn cười vì nó có thể không thực sự có nhiều lợi ích. Có lẽ nó chỉ đáp ứng một số loại phân loại nỗi ám ảnh :) – StackedCrooked

6

Có ý nghĩa khi tách riêng chúng cho các thư viện được chia sẻ vì chúng có thể được phân phối dưới dạng được biên dịch không có nguồn.Tôi đã nhìn thấy các dự án tách ra các tiêu đề "công khai" (tiêu đề có thể được truy cập từ mã bên ngoài dự án hoặc thư viện của bạn) trong khi để lại các tiêu đề "riêng tư" và tệp nguồn trong cùng một thư mục. Tôi nghĩ tốt nhất là sử dụng phương pháp nhất quán cho dù bạn đang viết thư viện chia sẻ hoặc mã cấp ứng dụng vì bạn không bao giờ biết khi nào bạn có thể muốn biến một thứ gì đó mà bạn đã viết ở cấp ứng dụng sang thư viện cấp thấp hơn. dự án.

1

Tôi đặt tệp (tiêu đề) và tệp nguồn vào cùng thư mục (thư mục). Tôi tạo các thư mục khác nhau cho các chủ đề khác nhau. Tôi nhận được thất vọng khi cố gắng tìm các tập tin tiêu đề (trong khi gỡ lỗi và cũng để nghiên cứu). Trong một số cửa hàng, chỉ có hai thư mục: nguồn và bao gồm. Những thư mục này có xu hướng phát triển theo cấp số nhân. Sử dụng lại mã trở thành một cơn ác mộng ở mức tốt nhất.

IMHO, tôi tin rằng tổ chức theo chủ đề là tốt hơn. Mỗi thư mục chủ đề nên xây dựng vào ít nhất một thư viện. Các dự án khác nhau có thể dễ dàng bao gồm các chủ đề bằng cách tìm kiếm hoặc bao gồm các thư mục. Các dự án chỉ cần bao gồm các thư viện. Các công cụ xây dựng thông minh có thể liệt kê các thư mục chủ đề là phụ thuộc. Điều này đẩy nhanh quá trình xây dựng.

Tổ chức chủ đề cũng bổ sung thêm chút an toàn cho dự án. Các thiệt hại ngẫu nhiên đối với các tệp (chẳng hạn như loại bỏ các tệp sai hoặc thay thế bằng các phiên bản khác nhau) bị giảm do các tệp nằm trong các thư mục khác nhau. Việc xóa các tệp trong thư mục "Người" sẽ không ảnh hưởng đến các tệp trong thư mục "Hình dạng".

Đây chỉ là ý kiến ​​của tôi, Mileage của bạn có thể thay đổi.

+0

Điều này tương tự như codebase tại công việc hiện tại của tôi. Các ứng dụng chính bao gồm nhiều tiện ích mà mỗi người có kho svn riêng của họ. Kho lưu trữ chính thu thập tất cả thông qua svn externals. – StackedCrooked

7

Chúng tôi có một hệ thống xây dựng tự động tạo các tệp makefiles của chúng tôi. Một điều nó làm là đệ quy xuống bất kỳ thư mục con nào và xây dựng chúng như thư viện, liên kết chúng cùng với các đối tượng của thư mục chính để tạo ra ứng dụng. (Trong thực tế, các "thư mục con" thường là các liên kết tượng trưng.) Các thư viện tĩnh trừ khi tên thư mục kết thúc bằng ".so". Một điều tốt đẹp về điều này là một bản dựng đầy đủ của hệ thống của chúng tôi, có nhiều tệp thực thi, không phải biên dịch nhiều lần các thư viện phổ biến.

Tuy nhiên, kết quả là không có sự tách biệt các tiêu đề và nguồn. Và nó chưa bao giờ là vấn đề. Thành thật mà nói, tôi nghĩ rằng nó tốt hơn bởi vì tiêu đề và các tập tin nguồn có tính phổ biến của vị trí, và bạn có thể lấy một thư mục và biết bạn có mọi thứ bạn cần để sử dụng nó. Nó cũng hoạt động tốt với tính năng "bên ngoài" của Subversion và các tính năng tương tự trong các VCS khác.

Một nơi cuối cùng mà việc tách/src bị lỗi là nếu bạn sử dụng bất kỳ trình tạo mã nào, chẳng hạn như flex, bison hoặc gengetopts. Tìm ra nơi những công cụ này nên đặt kết quả đầu ra của họ để chúng được xây dựng là khó khăn nếu bạn đã truyền bá mọi thứ.

+1

Thành thật mà nói tôi cũng muốn có các tệp tiêu đề và nguồn. Ngoài ra trong một bộ lọc Visual Studio, do đó, các tập tin tiêu đề và nguồn là cùng nhau. – StackedCrooked

0

Chúng tôi có một hệ thống xây dựng sử dụng quy tắc này. Hệ thống xây dựng này là sconspiracy một tập hợp các kịch bản để cấu hình SCons và dành riêng cho thế giới C++. Bạn có thể xem ví dụ sử dụng công cụ này: fw4spl

1

Dòng dưới cùng: nguồn và tiêu đề vẫn thay đổi theo /src. Mã đã được kết tinh nên đi vào /lib & /include (thực tế bạn có thể giữ tất cả .lib s và .h s trong /lib).

  • Giữ các nguồn và tiêu đề riêng với nhau, miễn là chúng (a) cụ thể cho dự án này hoặc (b) chưa được coi là thư viện được chia sẻ.
  • Khi các nguồn nhất định trong dự án chính được xác định là thư viện (tương đối ổn định), hãy đặt .a hoặc .lib vào /lib và tiêu đề giao diện công khai của nó vào /include.
  • Tất cả thư viện của bên thứ ba và tiêu đề giao diện công khai cũng đi vào /lib & /include.

Như những người khác lưu ý, nó thường tương thích hơn cho các công cụ/IDE để truy cập .h/.c từ một thư mục. Nhưng từ một khung nhìn tổ chức, có thể hữu ích khi tách riêng mã cục bộ khỏi mã lib ổn định.

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