2009-02-12 19 views
7

Câu hỏi này tương tự như this one, nhưng không trùng lặp vì tôi hỏi về các vấn đề không được thảo luận trong câu hỏi đó.Trong Delphi, tôi có nên thêm các đơn vị dùng chung vào các dự án của mình, vào một gói dùng chung hay không?

tôi có một dự án client-server trong Delphi 7 với cấu trúc thư mục sau đây:

\MyApp 
    \MyClientApp 
    \MyServerApp 
    \lib 

Có 2 dự án thực tế Delphi (.dpr), một trong mỗi trong các thư mục MyClientApp và MyServerApp.

Thư mục lib có các đơn vị .pas có mã chung cho ứng dụng khách và máy chủ. Những gì tôi tự hỏi là nếu tôi nên bao gồm những tập tin .pas trong các dự án khách hàng và máy chủ? Hoặc tôi nên tạo một gói trong thư mục lib bao gồm các đơn vị đó? Hoặc tôi chỉ nên để các tập tin .pas ngồi trong thư mục lib và không thêm chúng vào bất kỳ ứng dụng/gói nào?

Ưu điểm/khuyết điểm của mỗi phương pháp tiếp cận là gì? Cách nào là "tốt nhất"? Có bất kỳ vấn đề nào với việc có các đơn vị đó từ thư mục lib được đưa vào trong nhiều dự án không?

Ngay bây giờ các đơn vị trong thư mục lib không phải là một phần của bất kỳ ứng dụng/gói nào. Một bất lợi của điều này là khi tôi có ứng dụng khách của tôi mở trong Delphi, ví dụ, và tôi muốn tìm kiếm trong tất cả các tập tin trong dự án cho một cái gì đó, nó cũng không tìm kiếm trong các đơn vị trong thư mục lib. Tôi nhận được xung quanh này bằng cách mở các đơn vị và làm một tìm thấy trong tất cả các tập tin mở, hoặc sử dụng grep tìm kiếm (nhưng tôi muốn có một giải pháp tốt hơn). Tôi cũng rất muốn một giải pháp mà tôi sẽ không phải đi và mở một số gói riêng biệt và biên dịch lại nó khi tôi thực hiện thay đổi cho những tập tin trong thư mục lib (đây là nơi tôi nên sử dụng một nhóm dự án?).

Trả lời

8

Các đơn vị chia sẻ giữa các ứng dụng luôn mang nguy cơ các thay đổi không tương thích được thực hiện trong một ứng dụng phá vỡ ứng dụng kia. Mặt khác, làm cho bản sao của các đơn vị này thậm chí còn tồi tệ hơn, vì vậy sự chấp thuận của bạn di chuyển chúng vào thư mục con của chính họ ít nhất là thêm một rào cản tâm lý để thay đổi chúng mà không xem xét các chương trình khác. Để thêm chúng vào các tệp dự án: Tôi thường thêm một số đơn vị mà tôi thường xuyên truy cập (hoặc để mở rộng hoặc để tham khảo) từ IDE cho dự án, và để những người khác ra ngoài để trình biên dịch chọn bằng cách sử dụng đường dẫn tìm kiếm . Tôi làm điều đó trên cơ sở từng dự án, có nghĩa là, một số đơn vị có thể là một phần của một số dự án, tại sao không?

Đặt chúng vào một gói chỉ có ý nghĩa, nếu bạn thực sự muốn tạo một ứng dụng dựa trên gói, nếu không, tại sao phải bận tâm?

Để biết thêm về làm thế nào tôi tổ chức các dự án và các thư viện của tôi, xem http://www.dummzeuch.de/delphi/subversion/english.html

+0

Bài viết hay; cảm ơn! – onnodb

3

Tôi thường tạo một gói với tất cả các đơn vị dùng chung và chỉ sử dụng các đơn vị. Nếu bạn không đánh dấu rõ ràng "Xây dựng với gói thời gian chạy", nội dung gói (tất cả được sử dụng dcu) sẽ được liên kết với dự án của bạn như bất kỳ đơn vị nào khác.

+1

_package_ sẽ không được liên kết chút nào. Nó sẽ chỉ liên kết các tệp DCU giống như bất kỳ xây dựng thông thường nào. –

+0

@Rob, bạn nói đúng, ý tôi là gói nội dung = .dcu. –

5

Tôi không thích có tệp được chia sẻ bởi dự án. Tất cả quá thường xuyên, bạn sẽ bị cám dỗ để chỉnh sửa một trong các tệp được chia sẻ và bạn sẽ phá vỡ một thứ gì đó trong dự án khác hoặc bạn sẽ quên rằng bạn phải xây dựng lại dự án khác.

Khi các tệp được chia sẻ thay vào đó được tách thành thư viện của riêng chúng (gói), thì có thêm một chút rào cản để chỉnh sửa chúng. Tôi coi đó là một điều tốt. Nó sẽ là một lời nhắc nhở nhẹ rằng bạn đang chuyển từ mã dự án cụ thể sang mã được chia sẻ. Bạn có thể sử dụng các nhóm dự án để cho phép bạn giữ mọi thứ lại với nhau trong một cá thể IDE đơn. sắp xếp các dự án thư viện trước các dự án thực thi. Lệnh "xây dựng tất cả" sẽ xây dựng mọi thứ theo thứ tự, bắt đầu với dự án đầu tiên.

Giữ các tệp DCU riêng biệt với các tệp PAS của bạn. Bạn có thể thực hiện điều này một cách dễ dàng bằng cách đặt tùy chọn dự án "thư mục đầu ra DCU" để gửi các đơn vị của gói đến một số vị trí khác. Sau đó đặt thư mục đích đó vào đường dẫn tìm kiếm của các dự án khác của bạn. " Họ sẽ tìm thấy DCU, nhưng họ sẽ không tìm thấy tệp PAS và do đó không có dự án nào khác vô tình biên dịch lại một đơn vị không thực sự là thành viên.

Có gói riêng cũng không khuyến khích sử dụng định nghĩa có điều kiện theo dự án cụ thể. Những người gây ra tất cả các loại rắc rối khi bạn đang chia sẻ các đơn vị giữa các dự án. Tìm cách thay thế giữ tất cả các tùy chọn dự án cụ thể trong các dự án tương ứng. Thư viện được chia sẻ không yêu cầu sửa đổi dự án cụ thể. Nếu một thư viện cần hành động khác nhau dựa trên ai đang sử dụng nó, thì hãy sử dụng các kỹ thuật như các hàm gọi lại mà người dùng thư viện có thể thiết lập để sửa đổi hành vi của thư viện.

4

tôi sẽ cần phải có một lý do rất tốt để thêm mã chia sẻ cho một gói. Nếu bạn chỉ có một vài tệp được chia sẻ, hãy gắn tất cả chúng vào một thư mục có tên là Shared. Điều này sẽ làm cho nó rõ ràng các tập tin được chia sẻ giữa các dự án.

Cũng sử dụng công cụ xây dựng tốt để thực hiện xây dựng tự động, do đó bạn sẽ sớm tìm ra đủ nếu bạn phá vỡ điều gì đó.

tệp .bpl phù hợp cho các thành phần nhưng mang lại sự phức tạp nghiêm trọng cho những thứ như thế này, trừ khi bạn có một lượng lớn tệp được chia sẻ.

2

Tôi sẽ chỉ sử dụng các gói thời gian chạy nếu bạn thực sự có hai tệp nhị phân được cho là chạy trên cùng một máy vật lý và đã chia sẻ một số mã. Hãy nhớ rằng các gói thời gian chạy chủ yếu là một cách tiếp cận tất cả hoặc không có gì. Một khi bạn quyết định sử dụng chúng, bạn cũng sẽ không còn có thể liên kết các đơn vị RTL và VCL thẳng vào các dự án của bạn và thay vào đó sẽ phải triển khai các dự án đó một cách riêng biệt.

Tuy nhiên, các gói có thể vẫn là giải pháp tốt cho vấn đề của bạn khi kết hợp với các nhóm dự án chính xác là những gì tôi đang làm. Tôi ghét có các đơn vị được chia sẻ trong nhiều dự án. Bao gồm các đơn vị chia sẻ trong một gói (nhưng không biên dịch các dự án thực của bạn với các gói thời gian chạy) cho phép bạn thêm gói đó vào nhóm dự án của bạn để bạn (và IDE!) Sẽ luôn có chúng dễ dàng truy cập. mã. Nói đúng ra bạn thậm chí không bao giờ phải biên dịch các gói đó. Họ chỉ có thể phục vụ như một đơn vị tổ chức trong người quản lý dự án.

Lưu ý rằng đối với Tìm trong tệp, bạn cũng có thể chỉ định "trong tất cả các tệp trong nhóm dự án"

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